fix: deterministic proto loading

This commit is contained in:
TrèsAbhi committed 2024-09-03 21:47:06 -05:00
1 parent cbb5392525
commit 169f757fb2
11 files changed
+53 -34

No files matched your search

+10 -4
View File
@@ -7,10 +7,16 @@ const withVanillaExtract = createVanillaExtractPlugin({ tests: /\.css$/ });
const nextConfig = { const nextConfig = {
...withVanillaExtract({ ...withVanillaExtract({
webpack: (config, { isServer }) => { webpack: (config, { isServer }) => {
config.module.rules.push({ config.module.rules.push(
test: /\.glsl$/, {
type: 'asset/source', test: /\.glsl$/,
}); type: 'asset/source',
},
{
test: /\.proto$/,
type: 'asset/source',
},
);
if (isServer) { if (isServer) {
writeFileSync( writeFileSync(
File renamed without changes.
+2 -1
View File
@@ -225,7 +225,8 @@ async function postWork() {
{ {
path: `averages/${latest}.pb`, path: `averages/${latest}.pb`,
content: await encodeToBase64( content: await encodeToBase64(
'blitzkit/blitzkit.AverageDefinitions', 'average_definitions',
'blitzkit.AverageDefinitions',
averageDefinitions, averageDefinitions,
), ),
encoding: 'base64', encoding: 'base64',
+3 -5
View File
@@ -10,7 +10,7 @@ import { asset } from '../src/core/blitzkit/asset';
import { commitAssets } from '../src/core/blitzkit/commitAssets'; import { commitAssets } from '../src/core/blitzkit/commitAssets';
import { Reviews, Video } from '../src/core/blitzkit/reviews'; import { Reviews, Video } from '../src/core/blitzkit/reviews';
import { decode } from '../src/core/protobuf/decode'; import { decode } from '../src/core/protobuf/decode';
import { encode } from '../src/core/protobuf/encode'; import { encodeToBase64 } from '../src/core/protobuf/encodeToBase64';
import { DATA } from './buildAssets/constants'; import { DATA } from './buildAssets/constants';
import { import {
BlitzStrings, BlitzStrings,
@@ -25,7 +25,7 @@ console.log('Finding reviews...');
const currentReviews = await fetch(asset('definitions/reviews.pb')) const currentReviews = await fetch(asset('definitions/reviews.pb'))
.then((response) => response.arrayBuffer()) .then((response) => response.arrayBuffer())
.then((buffer) => .then((buffer) =>
decode<Reviews>('reviews/blitzkit.Reviews', new Uint8Array(buffer)), decode<Reviews>('reviews', 'blitzkit.Reviews', new Uint8Array(buffer)),
); );
const auth = await google.auth.getClient({ const auth = await google.auth.getClient({
scopes: ['https://www.googleapis.com/auth/youtube.readonly'], scopes: ['https://www.googleapis.com/auth/youtube.readonly'],
@@ -124,9 +124,7 @@ for (const tank of tanksSanitized) {
} }
} }
const content = await encode('reviews/blitzkit.Reviews', reviews).then( const content = await encodeToBase64('reviews', 'blitzkit.Reviews', reviews);
(array) => Buffer.from(array).toString('base64'),
);
await commitAssets('reviews', [ await commitAssets('reviews', [
{ content, encoding: 'base64', path: 'definitions/reviews.pb' }, { content, encoding: 'base64', path: 'definitions/reviews.pb' },
@@ -52,7 +52,8 @@ export const averageDefinitions = fetch(asset('averages/manifest.json'), {
.then((response) => response.arrayBuffer()) .then((response) => response.arrayBuffer())
.then((buffer) => .then((buffer) =>
decode<AverageDefinitions>( decode<AverageDefinitions>(
'blitzkit/blitzkit.AverageDefinitions', 'average_definitions',
'blitzkit.AverageDefinitions',
new Uint8Array(buffer), new Uint8Array(buffer),
), ),
); );
+1 -1
View File
@@ -18,5 +18,5 @@ export interface Video {
export const reviews = fetch(asset('definitions/reviews.pb')) export const reviews = fetch(asset('definitions/reviews.pb'))
.then((response) => response.arrayBuffer()) .then((response) => response.arrayBuffer())
.then((buffer) => .then((buffer) =>
decode<Reviews>('reviews/blitzkit.Reviews', new Uint8Array(buffer)), decode<Reviews>('reviews', 'blitzkit.Reviews', new Uint8Array(buffer)),
); );
+7 -4
View File
@@ -1,6 +1,9 @@
import { lookup } from './lookup'; import { lookup, ProtoSource } from './lookup';
export async function decode<Type>(proto: string, data: Uint8Array) { export function decode<Type>(
const Message = await lookup(proto); source: ProtoSource,
return Message.decode(data).toJSON() as Type; type: string,
data: Uint8Array,
) {
return lookup(source, type).decode(data).toJSON() as Type;
} }
+9 -5
View File
@@ -1,10 +1,14 @@
import { lookup } from './lookup'; import { lookup, ProtoSource } from './lookup';
export async function encode(proto: string, data: any) { export function encode(
const Message = await lookup(proto); source: ProtoSource,
const verification = Message.verify(data); type: string,
data: Record<string, any>,
) {
const message = lookup(source, type);
const verification = message.verify(data);
if (verification !== null) throw new Error(verification); if (verification !== null) throw new Error(verification);
return Message.encode(Message.create(data)).finish(); return message.encode(message.create(data)).finish();
} }
+7 -2
View File
@@ -1,6 +1,11 @@
import { encode } from './encode'; import { encode } from './encode';
import { ProtoSource } from './lookup';
export async function encodeToBase64(proto: string, data: any) { export async function encodeToBase64(
const array = await encode(proto, data); source: ProtoSource,
type: string,
data: any,
) {
const array = encode(source, type, data);
return Buffer.from(array).toString('base64'); return Buffer.from(array).toString('base64');
} }
+8 -11
View File
@@ -1,14 +1,11 @@
import { Root } from 'protobufjs'; import { parse } from 'protobufjs';
import { context } from '../blitzkit/context'; import average_definitions from '../../../public/protos/average_definitions.proto';
import reviews from '../../../public/protos/reviews.proto';
export async function lookup(proto: string) { export type ProtoSource = keyof typeof protos;
const [file, message] = proto.split('/');
const root = await new Root().load(
context === 'server'
? `public/protos/${file}.proto`
: `/protos/${file}.proto`,
{ keepCase: true },
);
return root.lookupType(message); const protos = { reviews, average_definitions };
export function lookup(source: ProtoSource, type: string) {
return parse(protos[source]).root.lookupType(type);
} }
+4
View File
@@ -0,0 +1,4 @@
declare module '*.proto' {
const value: string;
export default value;
}