diff --git a/next.config.js b/next.config.js index ea23ed45c..e8b8c1824 100644 --- a/next.config.js +++ b/next.config.js @@ -7,10 +7,16 @@ const withVanillaExtract = createVanillaExtractPlugin({ tests: /\.css$/ }); const nextConfig = { ...withVanillaExtract({ webpack: (config, { isServer }) => { - config.module.rules.push({ - test: /\.glsl$/, - type: 'asset/source', - }); + config.module.rules.push( + { + test: /\.glsl$/, + type: 'asset/source', + }, + { + test: /\.proto$/, + type: 'asset/source', + }, + ); if (isServer) { writeFileSync( diff --git a/public/protos/blitzkit.proto b/public/protos/average_definitions.proto similarity index 100% rename from public/protos/blitzkit.proto rename to public/protos/average_definitions.proto diff --git a/scripts/averages.ts b/scripts/averages.ts index 91d759a0b..7a7057a19 100644 --- a/scripts/averages.ts +++ b/scripts/averages.ts @@ -225,7 +225,8 @@ async function postWork() { { path: `averages/${latest}.pb`, content: await encodeToBase64( - 'blitzkit/blitzkit.AverageDefinitions', + 'average_definitions', + 'blitzkit.AverageDefinitions', averageDefinitions, ), encoding: 'base64', diff --git a/scripts/reviews.ts b/scripts/reviews.ts index 961cd5709..739b60dec 100644 --- a/scripts/reviews.ts +++ b/scripts/reviews.ts @@ -10,7 +10,7 @@ import { asset } from '../src/core/blitzkit/asset'; import { commitAssets } from '../src/core/blitzkit/commitAssets'; import { Reviews, Video } from '../src/core/blitzkit/reviews'; 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 { BlitzStrings, @@ -25,7 +25,7 @@ console.log('Finding reviews...'); const currentReviews = await fetch(asset('definitions/reviews.pb')) .then((response) => response.arrayBuffer()) .then((buffer) => - decode('reviews/blitzkit.Reviews', new Uint8Array(buffer)), + decode('reviews', 'blitzkit.Reviews', new Uint8Array(buffer)), ); const auth = await google.auth.getClient({ 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( - (array) => Buffer.from(array).toString('base64'), -); +const content = await encodeToBase64('reviews', 'blitzkit.Reviews', reviews); await commitAssets('reviews', [ { content, encoding: 'base64', path: 'definitions/reviews.pb' }, diff --git a/src/core/blitzkit/averageDefinitions/index.ts b/src/core/blitzkit/averageDefinitions/index.ts index d03417cf1..d448e4ce6 100644 --- a/src/core/blitzkit/averageDefinitions/index.ts +++ b/src/core/blitzkit/averageDefinitions/index.ts @@ -52,7 +52,8 @@ export const averageDefinitions = fetch(asset('averages/manifest.json'), { .then((response) => response.arrayBuffer()) .then((buffer) => decode( - 'blitzkit/blitzkit.AverageDefinitions', + 'average_definitions', + 'blitzkit.AverageDefinitions', new Uint8Array(buffer), ), ); diff --git a/src/core/blitzkit/reviews.ts b/src/core/blitzkit/reviews.ts index e343b1541..9ac16340d 100644 --- a/src/core/blitzkit/reviews.ts +++ b/src/core/blitzkit/reviews.ts @@ -18,5 +18,5 @@ export interface Video { export const reviews = fetch(asset('definitions/reviews.pb')) .then((response) => response.arrayBuffer()) .then((buffer) => - decode('reviews/blitzkit.Reviews', new Uint8Array(buffer)), + decode('reviews', 'blitzkit.Reviews', new Uint8Array(buffer)), ); diff --git a/src/core/protobuf/decode.ts b/src/core/protobuf/decode.ts index 86684640c..e8cf5f9ef 100644 --- a/src/core/protobuf/decode.ts +++ b/src/core/protobuf/decode.ts @@ -1,6 +1,9 @@ -import { lookup } from './lookup'; +import { lookup, ProtoSource } from './lookup'; -export async function decode(proto: string, data: Uint8Array) { - const Message = await lookup(proto); - return Message.decode(data).toJSON() as Type; +export function decode( + source: ProtoSource, + type: string, + data: Uint8Array, +) { + return lookup(source, type).decode(data).toJSON() as Type; } diff --git a/src/core/protobuf/encode.ts b/src/core/protobuf/encode.ts index 7ff1b18d1..877d1e125 100644 --- a/src/core/protobuf/encode.ts +++ b/src/core/protobuf/encode.ts @@ -1,10 +1,14 @@ -import { lookup } from './lookup'; +import { lookup, ProtoSource } from './lookup'; -export async function encode(proto: string, data: any) { - const Message = await lookup(proto); - const verification = Message.verify(data); +export function encode( + source: ProtoSource, + type: string, + data: Record, +) { + const message = lookup(source, type); + const verification = message.verify(data); if (verification !== null) throw new Error(verification); - return Message.encode(Message.create(data)).finish(); + return message.encode(message.create(data)).finish(); } diff --git a/src/core/protobuf/encodeToBase64.ts b/src/core/protobuf/encodeToBase64.ts index 86a35166f..b9a367e32 100644 --- a/src/core/protobuf/encodeToBase64.ts +++ b/src/core/protobuf/encodeToBase64.ts @@ -1,6 +1,11 @@ import { encode } from './encode'; +import { ProtoSource } from './lookup'; -export async function encodeToBase64(proto: string, data: any) { - const array = await encode(proto, data); +export async function encodeToBase64( + source: ProtoSource, + type: string, + data: any, +) { + const array = encode(source, type, data); return Buffer.from(array).toString('base64'); } diff --git a/src/core/protobuf/lookup.ts b/src/core/protobuf/lookup.ts index 388ed29da..4d876836e 100644 --- a/src/core/protobuf/lookup.ts +++ b/src/core/protobuf/lookup.ts @@ -1,14 +1,11 @@ -import { Root } from 'protobufjs'; -import { context } from '../blitzkit/context'; +import { parse } from 'protobufjs'; +import average_definitions from '../../../public/protos/average_definitions.proto'; +import reviews from '../../../public/protos/reviews.proto'; -export async function lookup(proto: string) { - const [file, message] = proto.split('/'); - const root = await new Root().load( - context === 'server' - ? `public/protos/${file}.proto` - : `/protos/${file}.proto`, - { keepCase: true }, - ); +export type ProtoSource = keyof typeof protos; - return root.lookupType(message); +const protos = { reviews, average_definitions }; + +export function lookup(source: ProtoSource, type: string) { + return parse(protos[source]).root.lookupType(type); } diff --git a/src/types/proto.d.ts b/src/types/proto.d.ts new file mode 100644 index 000000000..aa9769548 --- /dev/null +++ b/src/types/proto.d.ts @@ -0,0 +1,4 @@ +declare module '*.proto' { + const value: string; + export default value; +}