@trigger.dev/core 3.0.0-beta.4 → 3.0.0-beta.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/catalog-EP9DGAGm.d.ts +242 -0
- package/dist/catalog-Gjy5NtAB.d.mts +242 -0
- package/dist/index.d.mts +60 -1
- package/dist/index.d.ts +60 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +7 -1
- package/dist/index.mjs.map +1 -1
- package/dist/manager-S98VaLUy.d.mts +1402 -0
- package/dist/manager-S98VaLUy.d.ts +1402 -0
- package/dist/messages-xJbR1Vai.d.mts +18953 -0
- package/dist/messages-xJbR1Vai.d.ts +18953 -0
- package/dist/schemas-Sb0sJcEt.d.mts +2497 -0
- package/dist/schemas-Sb0sJcEt.d.ts +2497 -0
- package/dist/v3/dev/index.d.mts +28 -0
- package/dist/v3/dev/index.d.ts +28 -0
- package/dist/v3/dev/index.js +93 -0
- package/dist/v3/dev/index.js.map +1 -0
- package/dist/v3/dev/index.mjs +91 -0
- package/dist/v3/dev/index.mjs.map +1 -0
- package/dist/v3/index.d.mts +2140 -17560
- package/dist/v3/index.d.ts +2140 -17560
- package/dist/v3/index.js +2611 -2886
- package/dist/v3/index.js.map +1 -1
- package/dist/v3/index.mjs +2563 -2858
- package/dist/v3/index.mjs.map +1 -1
- package/dist/v3/otel/index.js +106 -50
- package/dist/v3/otel/index.js.map +1 -1
- package/dist/v3/otel/index.mjs +106 -50
- package/dist/v3/otel/index.mjs.map +1 -1
- package/dist/v3/prod/index.d.mts +45 -0
- package/dist/v3/prod/index.d.ts +45 -0
- package/dist/v3/prod/index.js +304 -0
- package/dist/v3/prod/index.js.map +1 -0
- package/dist/v3/prod/index.mjs +302 -0
- package/dist/v3/prod/index.mjs.map +1 -0
- package/dist/v3/utils/structuredLogger.d.mts +31 -0
- package/dist/v3/utils/structuredLogger.d.ts +31 -0
- package/dist/v3/utils/structuredLogger.js +88 -0
- package/dist/v3/utils/structuredLogger.js.map +1 -0
- package/dist/v3/utils/structuredLogger.mjs +86 -0
- package/dist/v3/utils/structuredLogger.mjs.map +1 -0
- package/dist/v3/workers/index.d.mts +142 -0
- package/dist/v3/workers/index.d.ts +142 -0
- package/dist/v3/workers/index.js +3485 -0
- package/dist/v3/workers/index.js.map +1 -0
- package/dist/v3/workers/index.mjs +3466 -0
- package/dist/v3/workers/index.mjs.map +1 -0
- package/dist/v3/zodIpc.d.mts +32 -0
- package/dist/v3/zodIpc.d.ts +32 -0
- package/dist/v3/zodIpc.js +268 -0
- package/dist/v3/zodIpc.js.map +1 -0
- package/dist/v3/zodIpc.mjs +266 -0
- package/dist/v3/zodIpc.mjs.map +1 -0
- package/dist/v3/zodMessageHandler.d.mts +69 -0
- package/dist/v3/zodMessageHandler.d.ts +69 -0
- package/dist/v3/zodMessageHandler.js +168 -0
- package/dist/v3/zodMessageHandler.js.map +1 -0
- package/dist/v3/zodMessageHandler.mjs +163 -0
- package/dist/v3/zodMessageHandler.mjs.map +1 -0
- package/dist/v3/zodNamespace.d.mts +3663 -0
- package/dist/v3/zodNamespace.d.ts +3663 -0
- package/dist/v3/zodNamespace.js +366 -0
- package/dist/v3/zodNamespace.js.map +1 -0
- package/dist/v3/zodNamespace.mjs +364 -0
- package/dist/v3/zodNamespace.mjs.map +1 -0
- package/dist/v3/zodSocket.d.mts +88 -0
- package/dist/v3/zodSocket.d.ts +88 -0
- package/dist/v3/zodSocket.js +319 -0
- package/dist/v3/zodSocket.js.map +1 -0
- package/dist/v3/zodSocket.mjs +315 -0
- package/dist/v3/zodSocket.mjs.map +1 -0
- package/dist/v3/zodfetch.d.mts +206 -0
- package/dist/v3/zodfetch.d.ts +206 -0
- package/dist/v3/zodfetch.js +614 -0
- package/dist/v3/zodfetch.js.map +1 -0
- package/dist/v3/zodfetch.mjs +594 -0
- package/dist/v3/zodfetch.mjs.map +1 -0
- package/package.json +79 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/v3/zodIpc.ts","../../src/v3/zodMessageHandler.ts"],"names":["randomUUID","z","ZodSchemaParsedError","Error","constructor","error","payload","message","ZodMessageSchema","object","version","literal","default","type","string","unknown","messageSchema","ZodIpcMessageHandler","options","schema","handlers","sender","handleMessage","parsedMessage","parseMessage","handler","ack","safeParse","success","JSON","stringify","data","parsedPayload","Packet","discriminatedUnion","sessionId","optional","any","id","number","ZodIpcConnection","opts","Map","listenSchema","send","bind","sendWithAck","connect","emitSchema","timeoutInMs","currentId","Promise","resolve","reject","defaultTimeoutInMs","timeout","setTimeout","reason","set","clearTimeout","process","on","packet","parsedPacket","get","result"],"mappings":"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","sourcesContent":["import { randomUUID } from \"crypto\";\nimport {\n GetSocketCallbackSchema,\n GetSocketMessageSchema,\n GetSocketMessagesWithCallback,\n GetSocketMessagesWithoutCallback,\n MessagesFromSocketCatalog,\n SocketMessageHasCallback,\n ZodSocketMessageCatalogSchema,\n} from \"./zodSocket\";\nimport { z } from \"zod\";\nimport { ZodSchemaParsedError } from \"./zodMessageHandler\";\nimport { inspect } from \"node:util\";\n\ninterface ZodIpcMessageSender<TEmitCatalog extends ZodSocketMessageCatalogSchema> {\n send<K extends GetSocketMessagesWithoutCallback<TEmitCatalog>>(\n type: K,\n payload: z.input<GetSocketMessageSchema<TEmitCatalog, K>>\n ): Promise<void>;\n\n sendWithAck<K extends GetSocketMessagesWithCallback<TEmitCatalog>>(\n type: K,\n payload: z.input<GetSocketMessageSchema<TEmitCatalog, K>>\n ): Promise<z.infer<GetSocketCallbackSchema<TEmitCatalog, K>>>;\n}\n\ntype ZodIpcMessageHandlers<\n TListenCatalog extends ZodSocketMessageCatalogSchema,\n TEmitCatalog extends ZodSocketMessageCatalogSchema,\n> = Partial<{\n [K in keyof TListenCatalog]: (\n payload: z.infer<GetSocketMessageSchema<TListenCatalog, K>>,\n sender: ZodIpcMessageSender<TEmitCatalog>\n ) => Promise<\n SocketMessageHasCallback<TListenCatalog, K> extends true\n ? z.input<GetSocketCallbackSchema<TListenCatalog, K>>\n : void\n >;\n}>;\n\nconst messageSchema = z.object({\n version: z.literal(\"v1\").default(\"v1\"),\n type: z.string(),\n payload: z.unknown(),\n});\n\ntype ZodIpcMessageHandlerOptions<\n TListenCatalog extends ZodSocketMessageCatalogSchema,\n TEmitCatalog extends ZodSocketMessageCatalogSchema,\n> = {\n schema: TListenCatalog;\n handlers?: ZodIpcMessageHandlers<TListenCatalog, TEmitCatalog>;\n sender: ZodIpcMessageSender<TEmitCatalog>;\n};\n\nclass ZodIpcMessageHandler<\n TListenCatalog extends ZodSocketMessageCatalogSchema,\n TEmitCatalog extends ZodSocketMessageCatalogSchema,\n> {\n #schema: TListenCatalog;\n #handlers: ZodIpcMessageHandlers<TListenCatalog, TEmitCatalog> | undefined;\n #sender: ZodIpcMessageSender<TEmitCatalog>;\n\n constructor(options: ZodIpcMessageHandlerOptions<TListenCatalog, TEmitCatalog>) {\n this.#schema = options.schema;\n this.#handlers = options.handlers;\n this.#sender = options.sender;\n }\n\n public async handleMessage(message: unknown) {\n const parsedMessage = this.parseMessage(message);\n\n if (!this.#handlers) {\n throw new Error(\"No handlers provided\");\n }\n\n const handler = this.#handlers[parsedMessage.type];\n\n if (!handler) {\n // console.error(`No handler for message type: ${String(parsedMessage.type)}`);\n return;\n }\n\n const ack = await handler(parsedMessage.payload, this.#sender);\n\n return ack;\n }\n\n public parseMessage(message: unknown): MessagesFromSocketCatalog<TListenCatalog> {\n const parsedMessage = messageSchema.safeParse(message);\n\n if (!parsedMessage.success) {\n throw new Error(`Failed to parse message: ${JSON.stringify(parsedMessage.error)}`);\n }\n\n const schema = this.#schema[parsedMessage.data.type][\"message\"];\n\n if (!schema) {\n throw new Error(`Unknown message type: ${parsedMessage.data.type}`);\n }\n\n const parsedPayload = schema.safeParse(parsedMessage.data.payload);\n\n if (!parsedPayload.success) {\n throw new Error(`Failed to parse message payload: ${JSON.stringify(parsedPayload.error)}`);\n }\n\n return {\n type: parsedMessage.data.type,\n payload: parsedPayload.data,\n };\n }\n}\n\nconst Packet = z.discriminatedUnion(\"type\", [\n z.object({\n type: z.literal(\"CONNECT\"),\n sessionId: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"ACK\"),\n message: z.any(),\n id: z.number(),\n }),\n z.object({\n type: z.literal(\"EVENT\"),\n message: z.any(),\n id: z.number().optional(),\n }),\n]);\n\ntype Packet = z.infer<typeof Packet>;\n\ninterface ZodIpcConnectionOptions<\n TListenCatalog extends ZodSocketMessageCatalogSchema,\n TEmitCatalog extends ZodSocketMessageCatalogSchema,\n> {\n listenSchema: TListenCatalog;\n emitSchema: TEmitCatalog;\n process: {\n send?: (message: any) => any;\n on?: (event: \"message\", listener: (message: any) => void) => void;\n };\n handlers?: ZodIpcMessageHandlers<TListenCatalog, TEmitCatalog>;\n}\n\nexport class ZodIpcConnection<\n TListenCatalog extends ZodSocketMessageCatalogSchema,\n TEmitCatalog extends ZodSocketMessageCatalogSchema,\n> {\n #sessionId?: string;\n #messageCounter: number = 0;\n\n #handler: ZodIpcMessageHandler<TListenCatalog, TEmitCatalog>;\n\n #acks: Map<\n number,\n {\n resolve: (value: unknown) => void;\n reject: (reason?: any) => void;\n timeout: NodeJS.Timeout;\n }\n > = new Map();\n\n constructor(private opts: ZodIpcConnectionOptions<TListenCatalog, TEmitCatalog>) {\n this.#handler = new ZodIpcMessageHandler({\n schema: opts.listenSchema,\n handlers: opts.handlers,\n sender: {\n send: this.send.bind(this),\n sendWithAck: this.sendWithAck.bind(this),\n },\n });\n\n this.#registerHandlers();\n // this.connect();\n }\n\n async #registerHandlers() {\n if (!this.opts.process.on) {\n return;\n }\n\n this.opts.process.on(\"message\", async (message) => {\n this.#handlePacket(message);\n });\n }\n\n async connect() {\n this.#sendPacket({ type: \"CONNECT\" });\n }\n\n async #handlePacket(packet: Packet): Promise<void> {\n const parsedPacket = Packet.safeParse(packet);\n\n if (!parsedPacket.success) {\n return;\n }\n\n switch (parsedPacket.data.type) {\n case \"ACK\": {\n // Check our list of ACKs and resolve with the message\n const ack = this.#acks.get(parsedPacket.data.id);\n\n if (!ack) {\n return;\n }\n\n clearTimeout(ack.timeout);\n ack.resolve(parsedPacket.data.message);\n\n break;\n }\n case \"CONNECT\": {\n if (!parsedPacket.data.sessionId) {\n // This is a client trying to connect, so we generate and send back a session ID\n const id = randomUUID();\n\n await this.#sendPacket({ type: \"CONNECT\", sessionId: id });\n\n return;\n }\n\n // This is a server replying to our connect message\n if (this.#sessionId) {\n // We're already connected\n return;\n }\n\n this.#sessionId = parsedPacket.data.sessionId;\n\n break;\n }\n case \"EVENT\": {\n const result = await this.#handler.handleMessage(parsedPacket.data.message);\n\n if (typeof parsedPacket.data.id === \"undefined\") {\n return;\n }\n\n // There's an ID so we should ACK\n await this.#sendPacket({\n type: \"ACK\",\n id: parsedPacket.data.id,\n message: result,\n });\n\n break;\n }\n default: {\n break;\n }\n }\n }\n\n async #sendPacket(packet: Packet) {\n await this.opts.process.send?.(packet);\n }\n\n async send<K extends GetSocketMessagesWithoutCallback<TEmitCatalog>>(\n type: K,\n payload: z.input<GetSocketMessageSchema<TEmitCatalog, K>>\n ): Promise<void> {\n const schema = this.opts.emitSchema[type][\"message\"];\n\n if (!schema) {\n throw new Error(`Unknown message type: ${type as string}`);\n }\n\n const parsedPayload = schema.safeParse(payload);\n\n if (!parsedPayload.success) {\n throw new ZodSchemaParsedError(parsedPayload.error, payload);\n }\n\n await this.#sendPacket({\n type: \"EVENT\",\n message: {\n type,\n payload,\n version: \"v1\",\n },\n });\n }\n\n public async sendWithAck<K extends GetSocketMessagesWithCallback<TEmitCatalog>>(\n type: K,\n payload: z.input<GetSocketMessageSchema<TEmitCatalog, K>>,\n timeoutInMs?: number\n ): Promise<z.infer<GetSocketCallbackSchema<TEmitCatalog, K>>> {\n const currentId = this.#messageCounter++;\n\n return new Promise(async (resolve, reject) => {\n const defaultTimeoutInMs = 2000;\n\n // Timeout if the ACK takes too long to get back to us\n const timeout = setTimeout(() => {\n reject(\n JSON.stringify({\n reason: \"sendWithAck() timeout\",\n timeoutInMs: timeoutInMs ?? defaultTimeoutInMs,\n type,\n payload,\n })\n );\n }, timeoutInMs ?? defaultTimeoutInMs);\n\n this.#acks.set(currentId, { resolve, reject, timeout });\n\n const schema = this.opts.emitSchema[type][\"message\"];\n\n if (!schema) {\n clearTimeout(timeout);\n return reject(`Unknown message type: ${type as string}`);\n }\n\n const parsedPayload = schema.safeParse(payload);\n\n if (!parsedPayload.success) {\n clearTimeout(timeout);\n return reject(`Failed to parse message payload: ${JSON.stringify(parsedPayload.error)}`);\n }\n\n await this.#sendPacket({\n type: \"EVENT\",\n message: {\n type,\n payload,\n version: \"v1\",\n },\n id: currentId,\n });\n });\n }\n}\n","import { z } from \"zod\";\nimport { StructuredLogger } from \"./utils/structuredLogger\";\n\nexport class ZodSchemaParsedError extends Error {\n constructor(\n public error: z.ZodError,\n public payload: unknown\n ) {\n super(error.message);\n }\n}\n\nexport type ZodMessageValueSchema<TDiscriminatedUnion extends z.ZodDiscriminatedUnion<any, any>> =\n | z.ZodFirstPartySchemaTypes\n | TDiscriminatedUnion;\n\nexport interface ZodMessageCatalogSchema {\n [key: string]: ZodMessageValueSchema<any>;\n}\n\nexport type ZodMessageHandlers<TCatalogSchema extends ZodMessageCatalogSchema> = Partial<{\n [K in keyof TCatalogSchema]: (payload: z.infer<TCatalogSchema[K]>) => Promise<any>;\n}>;\n\nexport type ZodMessageHandlerOptions<TMessageCatalog extends ZodMessageCatalogSchema> = {\n schema: TMessageCatalog;\n messages?: ZodMessageHandlers<TMessageCatalog>;\n};\n\nexport type MessageFromSchema<\n K extends keyof TMessageCatalog,\n TMessageCatalog extends ZodMessageCatalogSchema,\n> = {\n type: K;\n payload: z.input<TMessageCatalog[K]>;\n};\n\nexport type MessageFromCatalog<TMessageCatalog extends ZodMessageCatalogSchema> = {\n [K in keyof TMessageCatalog]: MessageFromSchema<K, TMessageCatalog>;\n}[keyof TMessageCatalog];\n\nexport const ZodMessageSchema = z.object({\n version: z.literal(\"v1\").default(\"v1\"),\n type: z.string(),\n payload: z.unknown(),\n});\n\nexport interface EventEmitterLike {\n on(eventName: string | symbol, listener: (...args: any[]) => void): this;\n}\n\nexport class ZodMessageHandler<TMessageCatalog extends ZodMessageCatalogSchema> {\n #schema: TMessageCatalog;\n #handlers: ZodMessageHandlers<TMessageCatalog> | undefined;\n\n constructor(options: ZodMessageHandlerOptions<TMessageCatalog>) {\n this.#schema = options.schema;\n this.#handlers = options.messages;\n }\n\n public async handleMessage(message: unknown) {\n const parsedMessage = this.parseMessage(message);\n\n if (!this.#handlers) {\n throw new Error(\"No handlers provided\");\n }\n\n const handler = this.#handlers[parsedMessage.type];\n\n if (!handler) {\n console.error(`No handler for message type: ${String(parsedMessage.type)}`);\n return;\n }\n\n const ack = await handler(parsedMessage.payload);\n\n return ack;\n }\n\n public parseMessage(message: unknown): MessageFromCatalog<TMessageCatalog> {\n const parsedMessage = ZodMessageSchema.safeParse(message);\n\n if (!parsedMessage.success) {\n throw new Error(`Failed to parse message: ${JSON.stringify(parsedMessage.error)}`);\n }\n\n const schema = this.#schema[parsedMessage.data.type];\n\n if (!schema) {\n throw new Error(`Unknown message type: ${parsedMessage.data.type}`);\n }\n\n const parsedPayload = schema.safeParse(parsedMessage.data.payload);\n\n if (!parsedPayload.success) {\n throw new Error(`Failed to parse message payload: ${JSON.stringify(parsedPayload.error)}`);\n }\n\n return {\n type: parsedMessage.data.type,\n payload: parsedPayload.data,\n };\n }\n\n public registerHandlers(emitter: EventEmitterLike, logger?: StructuredLogger) {\n const log = logger ?? console;\n\n if (!this.#handlers) {\n log.info(\"No handlers provided\");\n return;\n }\n\n for (const eventName of Object.keys(this.#schema)) {\n emitter.on(eventName, async (message: any, callback?: any): Promise<void> => {\n log.info(`handling ${eventName}`, {\n payload: message,\n hasCallback: !!callback,\n });\n\n let ack;\n\n // FIXME: this only works if the message doesn't have genuine payload prop\n if (\"payload\" in message) {\n ack = await this.handleMessage({ type: eventName, ...message });\n } else {\n // Handle messages not sent by ZodMessageSender\n const { version, ...payload } = message;\n ack = await this.handleMessage({ type: eventName, version, payload });\n }\n\n if (callback && typeof callback === \"function\") {\n callback(ack);\n }\n });\n }\n }\n}\n\ntype ZodMessageSenderCallback<TMessageCatalog extends ZodMessageCatalogSchema> = (message: {\n type: keyof TMessageCatalog;\n payload: z.infer<TMessageCatalog[keyof TMessageCatalog]>;\n version: \"v1\";\n}) => Promise<void>;\n\nexport type ZodMessageSenderOptions<TMessageCatalog extends ZodMessageCatalogSchema> = {\n schema: TMessageCatalog;\n sender: ZodMessageSenderCallback<TMessageCatalog>;\n};\n\nexport class ZodMessageSender<TMessageCatalog extends ZodMessageCatalogSchema> {\n #schema: TMessageCatalog;\n #sender: ZodMessageSenderCallback<TMessageCatalog>;\n\n constructor(options: ZodMessageSenderOptions<TMessageCatalog>) {\n this.#schema = options.schema;\n this.#sender = options.sender;\n }\n\n public async send<K extends keyof TMessageCatalog>(\n type: K,\n payload: z.input<TMessageCatalog[K]>\n ) {\n const schema = this.#schema[type];\n\n if (!schema) {\n throw new Error(`Unknown message type: ${type as string}`);\n }\n\n const parsedPayload = schema.safeParse(payload);\n\n if (!parsedPayload.success) {\n throw new ZodSchemaParsedError(parsedPayload.error, payload);\n }\n\n await this.#sender({ type, payload, version: \"v1\" });\n }\n\n public async forwardMessage(message: unknown) {\n const parsedMessage = ZodMessageSchema.safeParse(message);\n\n if (!parsedMessage.success) {\n throw new Error(`Failed to parse message: ${JSON.stringify(parsedMessage.error)}`);\n }\n\n const schema = this.#schema[parsedMessage.data.type];\n\n if (!schema) {\n throw new Error(`Unknown message type: ${parsedMessage.data.type}`);\n }\n\n const parsedPayload = schema.safeParse(parsedMessage.data.payload);\n\n if (!parsedPayload.success) {\n throw new Error(`Failed to parse message payload: ${JSON.stringify(parsedPayload.error)}`);\n }\n\n await this.#sender({\n type: parsedMessage.data.type,\n payload: parsedPayload.data,\n version: \"v1\",\n });\n }\n}\n\nexport type MessageCatalogToSocketIoEvents<TCatalog extends ZodMessageCatalogSchema> = {\n [K in keyof TCatalog]: (message: z.infer<TCatalog[K]>) => void;\n};\n"]}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { StructuredLogger } from './utils/structuredLogger.mjs';
|
|
3
|
+
|
|
4
|
+
declare class ZodSchemaParsedError extends Error {
|
|
5
|
+
error: z.ZodError;
|
|
6
|
+
payload: unknown;
|
|
7
|
+
constructor(error: z.ZodError, payload: unknown);
|
|
8
|
+
}
|
|
9
|
+
type ZodMessageValueSchema<TDiscriminatedUnion extends z.ZodDiscriminatedUnion<any, any>> = z.ZodFirstPartySchemaTypes | TDiscriminatedUnion;
|
|
10
|
+
interface ZodMessageCatalogSchema {
|
|
11
|
+
[key: string]: ZodMessageValueSchema<any>;
|
|
12
|
+
}
|
|
13
|
+
type ZodMessageHandlers<TCatalogSchema extends ZodMessageCatalogSchema> = Partial<{
|
|
14
|
+
[K in keyof TCatalogSchema]: (payload: z.infer<TCatalogSchema[K]>) => Promise<any>;
|
|
15
|
+
}>;
|
|
16
|
+
type ZodMessageHandlerOptions<TMessageCatalog extends ZodMessageCatalogSchema> = {
|
|
17
|
+
schema: TMessageCatalog;
|
|
18
|
+
messages?: ZodMessageHandlers<TMessageCatalog>;
|
|
19
|
+
};
|
|
20
|
+
type MessageFromSchema<K extends keyof TMessageCatalog, TMessageCatalog extends ZodMessageCatalogSchema> = {
|
|
21
|
+
type: K;
|
|
22
|
+
payload: z.input<TMessageCatalog[K]>;
|
|
23
|
+
};
|
|
24
|
+
type MessageFromCatalog<TMessageCatalog extends ZodMessageCatalogSchema> = {
|
|
25
|
+
[K in keyof TMessageCatalog]: MessageFromSchema<K, TMessageCatalog>;
|
|
26
|
+
}[keyof TMessageCatalog];
|
|
27
|
+
declare const ZodMessageSchema: z.ZodObject<{
|
|
28
|
+
version: z.ZodDefault<z.ZodLiteral<"v1">>;
|
|
29
|
+
type: z.ZodString;
|
|
30
|
+
payload: z.ZodUnknown;
|
|
31
|
+
}, "strip", z.ZodTypeAny, {
|
|
32
|
+
version: "v1";
|
|
33
|
+
type: string;
|
|
34
|
+
payload?: unknown;
|
|
35
|
+
}, {
|
|
36
|
+
type: string;
|
|
37
|
+
version?: "v1" | undefined;
|
|
38
|
+
payload?: unknown;
|
|
39
|
+
}>;
|
|
40
|
+
interface EventEmitterLike {
|
|
41
|
+
on(eventName: string | symbol, listener: (...args: any[]) => void): this;
|
|
42
|
+
}
|
|
43
|
+
declare class ZodMessageHandler<TMessageCatalog extends ZodMessageCatalogSchema> {
|
|
44
|
+
#private;
|
|
45
|
+
constructor(options: ZodMessageHandlerOptions<TMessageCatalog>);
|
|
46
|
+
handleMessage(message: unknown): Promise<any>;
|
|
47
|
+
parseMessage(message: unknown): MessageFromCatalog<TMessageCatalog>;
|
|
48
|
+
registerHandlers(emitter: EventEmitterLike, logger?: StructuredLogger): void;
|
|
49
|
+
}
|
|
50
|
+
type ZodMessageSenderCallback<TMessageCatalog extends ZodMessageCatalogSchema> = (message: {
|
|
51
|
+
type: keyof TMessageCatalog;
|
|
52
|
+
payload: z.infer<TMessageCatalog[keyof TMessageCatalog]>;
|
|
53
|
+
version: "v1";
|
|
54
|
+
}) => Promise<void>;
|
|
55
|
+
type ZodMessageSenderOptions<TMessageCatalog extends ZodMessageCatalogSchema> = {
|
|
56
|
+
schema: TMessageCatalog;
|
|
57
|
+
sender: ZodMessageSenderCallback<TMessageCatalog>;
|
|
58
|
+
};
|
|
59
|
+
declare class ZodMessageSender<TMessageCatalog extends ZodMessageCatalogSchema> {
|
|
60
|
+
#private;
|
|
61
|
+
constructor(options: ZodMessageSenderOptions<TMessageCatalog>);
|
|
62
|
+
send<K extends keyof TMessageCatalog>(type: K, payload: z.input<TMessageCatalog[K]>): Promise<void>;
|
|
63
|
+
forwardMessage(message: unknown): Promise<void>;
|
|
64
|
+
}
|
|
65
|
+
type MessageCatalogToSocketIoEvents<TCatalog extends ZodMessageCatalogSchema> = {
|
|
66
|
+
[K in keyof TCatalog]: (message: z.infer<TCatalog[K]>) => void;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export { type EventEmitterLike, type MessageCatalogToSocketIoEvents, type MessageFromCatalog, type MessageFromSchema, type ZodMessageCatalogSchema, ZodMessageHandler, type ZodMessageHandlerOptions, type ZodMessageHandlers, ZodMessageSchema, ZodMessageSender, type ZodMessageSenderOptions, type ZodMessageValueSchema, ZodSchemaParsedError };
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { StructuredLogger } from './utils/structuredLogger.js';
|
|
3
|
+
|
|
4
|
+
declare class ZodSchemaParsedError extends Error {
|
|
5
|
+
error: z.ZodError;
|
|
6
|
+
payload: unknown;
|
|
7
|
+
constructor(error: z.ZodError, payload: unknown);
|
|
8
|
+
}
|
|
9
|
+
type ZodMessageValueSchema<TDiscriminatedUnion extends z.ZodDiscriminatedUnion<any, any>> = z.ZodFirstPartySchemaTypes | TDiscriminatedUnion;
|
|
10
|
+
interface ZodMessageCatalogSchema {
|
|
11
|
+
[key: string]: ZodMessageValueSchema<any>;
|
|
12
|
+
}
|
|
13
|
+
type ZodMessageHandlers<TCatalogSchema extends ZodMessageCatalogSchema> = Partial<{
|
|
14
|
+
[K in keyof TCatalogSchema]: (payload: z.infer<TCatalogSchema[K]>) => Promise<any>;
|
|
15
|
+
}>;
|
|
16
|
+
type ZodMessageHandlerOptions<TMessageCatalog extends ZodMessageCatalogSchema> = {
|
|
17
|
+
schema: TMessageCatalog;
|
|
18
|
+
messages?: ZodMessageHandlers<TMessageCatalog>;
|
|
19
|
+
};
|
|
20
|
+
type MessageFromSchema<K extends keyof TMessageCatalog, TMessageCatalog extends ZodMessageCatalogSchema> = {
|
|
21
|
+
type: K;
|
|
22
|
+
payload: z.input<TMessageCatalog[K]>;
|
|
23
|
+
};
|
|
24
|
+
type MessageFromCatalog<TMessageCatalog extends ZodMessageCatalogSchema> = {
|
|
25
|
+
[K in keyof TMessageCatalog]: MessageFromSchema<K, TMessageCatalog>;
|
|
26
|
+
}[keyof TMessageCatalog];
|
|
27
|
+
declare const ZodMessageSchema: z.ZodObject<{
|
|
28
|
+
version: z.ZodDefault<z.ZodLiteral<"v1">>;
|
|
29
|
+
type: z.ZodString;
|
|
30
|
+
payload: z.ZodUnknown;
|
|
31
|
+
}, "strip", z.ZodTypeAny, {
|
|
32
|
+
version: "v1";
|
|
33
|
+
type: string;
|
|
34
|
+
payload?: unknown;
|
|
35
|
+
}, {
|
|
36
|
+
type: string;
|
|
37
|
+
version?: "v1" | undefined;
|
|
38
|
+
payload?: unknown;
|
|
39
|
+
}>;
|
|
40
|
+
interface EventEmitterLike {
|
|
41
|
+
on(eventName: string | symbol, listener: (...args: any[]) => void): this;
|
|
42
|
+
}
|
|
43
|
+
declare class ZodMessageHandler<TMessageCatalog extends ZodMessageCatalogSchema> {
|
|
44
|
+
#private;
|
|
45
|
+
constructor(options: ZodMessageHandlerOptions<TMessageCatalog>);
|
|
46
|
+
handleMessage(message: unknown): Promise<any>;
|
|
47
|
+
parseMessage(message: unknown): MessageFromCatalog<TMessageCatalog>;
|
|
48
|
+
registerHandlers(emitter: EventEmitterLike, logger?: StructuredLogger): void;
|
|
49
|
+
}
|
|
50
|
+
type ZodMessageSenderCallback<TMessageCatalog extends ZodMessageCatalogSchema> = (message: {
|
|
51
|
+
type: keyof TMessageCatalog;
|
|
52
|
+
payload: z.infer<TMessageCatalog[keyof TMessageCatalog]>;
|
|
53
|
+
version: "v1";
|
|
54
|
+
}) => Promise<void>;
|
|
55
|
+
type ZodMessageSenderOptions<TMessageCatalog extends ZodMessageCatalogSchema> = {
|
|
56
|
+
schema: TMessageCatalog;
|
|
57
|
+
sender: ZodMessageSenderCallback<TMessageCatalog>;
|
|
58
|
+
};
|
|
59
|
+
declare class ZodMessageSender<TMessageCatalog extends ZodMessageCatalogSchema> {
|
|
60
|
+
#private;
|
|
61
|
+
constructor(options: ZodMessageSenderOptions<TMessageCatalog>);
|
|
62
|
+
send<K extends keyof TMessageCatalog>(type: K, payload: z.input<TMessageCatalog[K]>): Promise<void>;
|
|
63
|
+
forwardMessage(message: unknown): Promise<void>;
|
|
64
|
+
}
|
|
65
|
+
type MessageCatalogToSocketIoEvents<TCatalog extends ZodMessageCatalogSchema> = {
|
|
66
|
+
[K in keyof TCatalog]: (message: z.infer<TCatalog[K]>) => void;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export { type EventEmitterLike, type MessageCatalogToSocketIoEvents, type MessageFromCatalog, type MessageFromSchema, type ZodMessageCatalogSchema, ZodMessageHandler, type ZodMessageHandlerOptions, type ZodMessageHandlers, ZodMessageSchema, ZodMessageSender, type ZodMessageSenderOptions, type ZodMessageValueSchema, ZodSchemaParsedError };
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var zod = require('zod');
|
|
4
|
+
|
|
5
|
+
var __defProp = Object.defineProperty;
|
|
6
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
7
|
+
var __accessCheck = (obj, member, msg) => {
|
|
8
|
+
if (!member.has(obj))
|
|
9
|
+
throw TypeError("Cannot " + msg);
|
|
10
|
+
};
|
|
11
|
+
var __privateGet = (obj, member, getter) => {
|
|
12
|
+
__accessCheck(obj, member, "read from private field");
|
|
13
|
+
return getter ? getter.call(obj) : member.get(obj);
|
|
14
|
+
};
|
|
15
|
+
var __privateAdd = (obj, member, value) => {
|
|
16
|
+
if (member.has(obj))
|
|
17
|
+
throw TypeError("Cannot add the same private member more than once");
|
|
18
|
+
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
19
|
+
};
|
|
20
|
+
var __privateSet = (obj, member, value, setter) => {
|
|
21
|
+
__accessCheck(obj, member, "write to private field");
|
|
22
|
+
setter ? setter.call(obj, value) : member.set(obj, value);
|
|
23
|
+
return value;
|
|
24
|
+
};
|
|
25
|
+
var _ZodSchemaParsedError = class _ZodSchemaParsedError extends Error {
|
|
26
|
+
constructor(error, payload) {
|
|
27
|
+
super(error.message);
|
|
28
|
+
this.error = error;
|
|
29
|
+
this.payload = payload;
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
__name(_ZodSchemaParsedError, "ZodSchemaParsedError");
|
|
33
|
+
var ZodSchemaParsedError = _ZodSchemaParsedError;
|
|
34
|
+
var ZodMessageSchema = zod.z.object({
|
|
35
|
+
version: zod.z.literal("v1").default("v1"),
|
|
36
|
+
type: zod.z.string(),
|
|
37
|
+
payload: zod.z.unknown()
|
|
38
|
+
});
|
|
39
|
+
var _schema, _handlers;
|
|
40
|
+
var _ZodMessageHandler = class _ZodMessageHandler {
|
|
41
|
+
constructor(options) {
|
|
42
|
+
__privateAdd(this, _schema, void 0);
|
|
43
|
+
__privateAdd(this, _handlers, void 0);
|
|
44
|
+
__privateSet(this, _schema, options.schema);
|
|
45
|
+
__privateSet(this, _handlers, options.messages);
|
|
46
|
+
}
|
|
47
|
+
async handleMessage(message) {
|
|
48
|
+
const parsedMessage = this.parseMessage(message);
|
|
49
|
+
if (!__privateGet(this, _handlers)) {
|
|
50
|
+
throw new Error("No handlers provided");
|
|
51
|
+
}
|
|
52
|
+
const handler = __privateGet(this, _handlers)[parsedMessage.type];
|
|
53
|
+
if (!handler) {
|
|
54
|
+
console.error(`No handler for message type: ${String(parsedMessage.type)}`);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const ack = await handler(parsedMessage.payload);
|
|
58
|
+
return ack;
|
|
59
|
+
}
|
|
60
|
+
parseMessage(message) {
|
|
61
|
+
const parsedMessage = ZodMessageSchema.safeParse(message);
|
|
62
|
+
if (!parsedMessage.success) {
|
|
63
|
+
throw new Error(`Failed to parse message: ${JSON.stringify(parsedMessage.error)}`);
|
|
64
|
+
}
|
|
65
|
+
const schema = __privateGet(this, _schema)[parsedMessage.data.type];
|
|
66
|
+
if (!schema) {
|
|
67
|
+
throw new Error(`Unknown message type: ${parsedMessage.data.type}`);
|
|
68
|
+
}
|
|
69
|
+
const parsedPayload = schema.safeParse(parsedMessage.data.payload);
|
|
70
|
+
if (!parsedPayload.success) {
|
|
71
|
+
throw new Error(`Failed to parse message payload: ${JSON.stringify(parsedPayload.error)}`);
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
type: parsedMessage.data.type,
|
|
75
|
+
payload: parsedPayload.data
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
registerHandlers(emitter, logger) {
|
|
79
|
+
const log = logger ?? console;
|
|
80
|
+
if (!__privateGet(this, _handlers)) {
|
|
81
|
+
log.info("No handlers provided");
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
for (const eventName of Object.keys(__privateGet(this, _schema))) {
|
|
85
|
+
emitter.on(eventName, async (message, callback) => {
|
|
86
|
+
log.info(`handling ${eventName}`, {
|
|
87
|
+
payload: message,
|
|
88
|
+
hasCallback: !!callback
|
|
89
|
+
});
|
|
90
|
+
let ack;
|
|
91
|
+
if ("payload" in message) {
|
|
92
|
+
ack = await this.handleMessage({
|
|
93
|
+
type: eventName,
|
|
94
|
+
...message
|
|
95
|
+
});
|
|
96
|
+
} else {
|
|
97
|
+
const { version, ...payload } = message;
|
|
98
|
+
ack = await this.handleMessage({
|
|
99
|
+
type: eventName,
|
|
100
|
+
version,
|
|
101
|
+
payload
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
if (callback && typeof callback === "function") {
|
|
105
|
+
callback(ack);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
_schema = new WeakMap();
|
|
112
|
+
_handlers = new WeakMap();
|
|
113
|
+
__name(_ZodMessageHandler, "ZodMessageHandler");
|
|
114
|
+
var ZodMessageHandler = _ZodMessageHandler;
|
|
115
|
+
var _schema2, _sender;
|
|
116
|
+
var _ZodMessageSender = class _ZodMessageSender {
|
|
117
|
+
constructor(options) {
|
|
118
|
+
__privateAdd(this, _schema2, void 0);
|
|
119
|
+
__privateAdd(this, _sender, void 0);
|
|
120
|
+
__privateSet(this, _schema2, options.schema);
|
|
121
|
+
__privateSet(this, _sender, options.sender);
|
|
122
|
+
}
|
|
123
|
+
async send(type, payload) {
|
|
124
|
+
const schema = __privateGet(this, _schema2)[type];
|
|
125
|
+
if (!schema) {
|
|
126
|
+
throw new Error(`Unknown message type: ${type}`);
|
|
127
|
+
}
|
|
128
|
+
const parsedPayload = schema.safeParse(payload);
|
|
129
|
+
if (!parsedPayload.success) {
|
|
130
|
+
throw new ZodSchemaParsedError(parsedPayload.error, payload);
|
|
131
|
+
}
|
|
132
|
+
await __privateGet(this, _sender).call(this, {
|
|
133
|
+
type,
|
|
134
|
+
payload,
|
|
135
|
+
version: "v1"
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
async forwardMessage(message) {
|
|
139
|
+
const parsedMessage = ZodMessageSchema.safeParse(message);
|
|
140
|
+
if (!parsedMessage.success) {
|
|
141
|
+
throw new Error(`Failed to parse message: ${JSON.stringify(parsedMessage.error)}`);
|
|
142
|
+
}
|
|
143
|
+
const schema = __privateGet(this, _schema2)[parsedMessage.data.type];
|
|
144
|
+
if (!schema) {
|
|
145
|
+
throw new Error(`Unknown message type: ${parsedMessage.data.type}`);
|
|
146
|
+
}
|
|
147
|
+
const parsedPayload = schema.safeParse(parsedMessage.data.payload);
|
|
148
|
+
if (!parsedPayload.success) {
|
|
149
|
+
throw new Error(`Failed to parse message payload: ${JSON.stringify(parsedPayload.error)}`);
|
|
150
|
+
}
|
|
151
|
+
await __privateGet(this, _sender).call(this, {
|
|
152
|
+
type: parsedMessage.data.type,
|
|
153
|
+
payload: parsedPayload.data,
|
|
154
|
+
version: "v1"
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
_schema2 = new WeakMap();
|
|
159
|
+
_sender = new WeakMap();
|
|
160
|
+
__name(_ZodMessageSender, "ZodMessageSender");
|
|
161
|
+
var ZodMessageSender = _ZodMessageSender;
|
|
162
|
+
|
|
163
|
+
exports.ZodMessageHandler = ZodMessageHandler;
|
|
164
|
+
exports.ZodMessageSchema = ZodMessageSchema;
|
|
165
|
+
exports.ZodMessageSender = ZodMessageSender;
|
|
166
|
+
exports.ZodSchemaParsedError = ZodSchemaParsedError;
|
|
167
|
+
//# sourceMappingURL=out.js.map
|
|
168
|
+
//# sourceMappingURL=zodMessageHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/v3/zodMessageHandler.ts"],"names":["z","ZodSchemaParsedError","Error","constructor","error","payload","message","ZodMessageSchema","object","version","literal","default","type","string","unknown","ZodMessageHandler","options","schema","messages","handleMessage","parsedMessage","parseMessage","handler","console","String","ack","safeParse","success","JSON","stringify","data","parsedPayload","registerHandlers","emitter","logger","log","info","eventName","Object","keys","on","callback","hasCallback","_schema","ZodMessageSender","sender","send","forwardMessage"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,SAASA,SAAS;AAGX,IAAMC,wBAAN,MAAMA,8BAA6BC,MAAAA;EACxCC,YACSC,OACAC,SACP;AACA,UAAMD,MAAME,OAAO;iBAHZF;mBACAC;EAGT;AACF;AAP0CH;AAAnC,IAAMD,uBAAN;AAsCA,IAAMM,mBAAmBP,EAAEQ,OAAO;EACvCC,SAAST,EAAEU,QAAQ,IAAA,EAAMC,QAAQ,IAAA;EACjCC,MAAMZ,EAAEa,OAAM;EACdR,SAASL,EAAEc,QAAO;AACpB,CAAA;AA7CA;AAmDO,IAAMC,qBAAN,MAAMA,mBAAAA;EAIXZ,YAAYa,SAAoD;AAHhE;AACA;AAGE,uBAAK,SAAUA,QAAQC;AACvB,uBAAK,WAAYD,QAAQE;EAC3B;EAEA,MAAaC,cAAcb,SAAkB;AAC3C,UAAMc,gBAAgB,KAAKC,aAAaf,OAAAA;AAExC,QAAI,CAAC,mBAAK,YAAW;AACnB,YAAM,IAAIJ,MAAM,sBAAA;IAClB;AAEA,UAAMoB,UAAU,mBAAK,WAAUF,cAAcR,IAAI;AAEjD,QAAI,CAACU,SAAS;AACZC,cAAQnB,MAAM,gCAAgCoB,OAAOJ,cAAcR,IAAI,CAAA,EAAG;AAC1E;IACF;AAEA,UAAMa,MAAM,MAAMH,QAAQF,cAAcf,OAAO;AAE/C,WAAOoB;EACT;EAEOJ,aAAaf,SAAuD;AACzE,UAAMc,gBAAgBb,iBAAiBmB,UAAUpB,OAAAA;AAEjD,QAAI,CAACc,cAAcO,SAAS;AAC1B,YAAM,IAAIzB,MAAM,4BAA4B0B,KAAKC,UAAUT,cAAchB,KAAK,CAAA,EAAG;IACnF;AAEA,UAAMa,SAAS,mBAAK,SAAQG,cAAcU,KAAKlB,IAAI;AAEnD,QAAI,CAACK,QAAQ;AACX,YAAM,IAAIf,MAAM,yBAAyBkB,cAAcU,KAAKlB,IAAI,EAAE;IACpE;AAEA,UAAMmB,gBAAgBd,OAAOS,UAAUN,cAAcU,KAAKzB,OAAO;AAEjE,QAAI,CAAC0B,cAAcJ,SAAS;AAC1B,YAAM,IAAIzB,MAAM,oCAAoC0B,KAAKC,UAAUE,cAAc3B,KAAK,CAAA,EAAG;IAC3F;AAEA,WAAO;MACLQ,MAAMQ,cAAcU,KAAKlB;MACzBP,SAAS0B,cAAcD;IACzB;EACF;EAEOE,iBAAiBC,SAA2BC,QAA2B;AAC5E,UAAMC,MAAMD,UAAUX;AAEtB,QAAI,CAAC,mBAAK,YAAW;AACnBY,UAAIC,KAAK,sBAAA;AACT;IACF;AAEA,eAAWC,aAAaC,OAAOC,KAAK,mBAAK,QAAO,GAAG;AACjDN,cAAQO,GAAGH,WAAW,OAAO/B,SAAcmC,aAAkC;AAC3EN,YAAIC,KAAK,YAAYC,SAAAA,IAAa;UAChChC,SAASC;UACToC,aAAa,CAAC,CAACD;QACjB,CAAA;AAEA,YAAIhB;AAGJ,YAAI,aAAanB,SAAS;AACxBmB,gBAAM,MAAM,KAAKN,cAAc;YAAEP,MAAMyB;YAAW,GAAG/B;UAAQ,CAAA;QAC/D,OAAO;AAEL,gBAAM,EAAEG,SAAS,GAAGJ,QAAAA,IAAYC;AAChCmB,gBAAM,MAAM,KAAKN,cAAc;YAAEP,MAAMyB;YAAW5B;YAASJ;UAAQ,CAAA;QACrE;AAEA,YAAIoC,YAAY,OAAOA,aAAa,YAAY;AAC9CA,mBAAShB,GAAAA;QACX;MACF,CAAA;IACF;EACF;AACF;AApFE;AACA;AAFWV;AAAN,IAAMA,oBAAN;AAnDP,IAAA4B,UAAA;AAqJO,IAAMC,oBAAN,MAAMA,kBAAAA;EAIXzC,YAAYa,SAAmD;AAH/D,uBAAA2B,UAAA;AACA;AAGE,uBAAKA,UAAU3B,QAAQC;AACvB,uBAAK,SAAUD,QAAQ6B;EACzB;EAEA,MAAaC,KACXlC,MACAP,SACA;AACA,UAAMY,SAAS,mBAAK0B,UAAQ/B,IAAAA;AAE5B,QAAI,CAACK,QAAQ;AACX,YAAM,IAAIf,MAAM,yBAAyBU,IAAAA,EAAgB;IAC3D;AAEA,UAAMmB,gBAAgBd,OAAOS,UAAUrB,OAAAA;AAEvC,QAAI,CAAC0B,cAAcJ,SAAS;AAC1B,YAAM,IAAI1B,qBAAqB8B,cAAc3B,OAAOC,OAAAA;IACtD;AAEA,UAAM,mBAAK,SAAL,WAAa;MAAEO;MAAMP;MAASI,SAAS;IAAK;EACpD;EAEA,MAAasC,eAAezC,SAAkB;AAC5C,UAAMc,gBAAgBb,iBAAiBmB,UAAUpB,OAAAA;AAEjD,QAAI,CAACc,cAAcO,SAAS;AAC1B,YAAM,IAAIzB,MAAM,4BAA4B0B,KAAKC,UAAUT,cAAchB,KAAK,CAAA,EAAG;IACnF;AAEA,UAAMa,SAAS,mBAAK0B,UAAQvB,cAAcU,KAAKlB,IAAI;AAEnD,QAAI,CAACK,QAAQ;AACX,YAAM,IAAIf,MAAM,yBAAyBkB,cAAcU,KAAKlB,IAAI,EAAE;IACpE;AAEA,UAAMmB,gBAAgBd,OAAOS,UAAUN,cAAcU,KAAKzB,OAAO;AAEjE,QAAI,CAAC0B,cAAcJ,SAAS;AAC1B,YAAM,IAAIzB,MAAM,oCAAoC0B,KAAKC,UAAUE,cAAc3B,KAAK,CAAA,EAAG;IAC3F;AAEA,UAAM,mBAAK,SAAL,WAAa;MACjBQ,MAAMQ,cAAcU,KAAKlB;MACzBP,SAAS0B,cAAcD;MACvBrB,SAAS;IACX;EACF;AACF;AApDEkC,WAAA;AACA;AAFWC;AAAN,IAAMA,mBAAN","sourcesContent":["import { z } from \"zod\";\nimport { StructuredLogger } from \"./utils/structuredLogger\";\n\nexport class ZodSchemaParsedError extends Error {\n constructor(\n public error: z.ZodError,\n public payload: unknown\n ) {\n super(error.message);\n }\n}\n\nexport type ZodMessageValueSchema<TDiscriminatedUnion extends z.ZodDiscriminatedUnion<any, any>> =\n | z.ZodFirstPartySchemaTypes\n | TDiscriminatedUnion;\n\nexport interface ZodMessageCatalogSchema {\n [key: string]: ZodMessageValueSchema<any>;\n}\n\nexport type ZodMessageHandlers<TCatalogSchema extends ZodMessageCatalogSchema> = Partial<{\n [K in keyof TCatalogSchema]: (payload: z.infer<TCatalogSchema[K]>) => Promise<any>;\n}>;\n\nexport type ZodMessageHandlerOptions<TMessageCatalog extends ZodMessageCatalogSchema> = {\n schema: TMessageCatalog;\n messages?: ZodMessageHandlers<TMessageCatalog>;\n};\n\nexport type MessageFromSchema<\n K extends keyof TMessageCatalog,\n TMessageCatalog extends ZodMessageCatalogSchema,\n> = {\n type: K;\n payload: z.input<TMessageCatalog[K]>;\n};\n\nexport type MessageFromCatalog<TMessageCatalog extends ZodMessageCatalogSchema> = {\n [K in keyof TMessageCatalog]: MessageFromSchema<K, TMessageCatalog>;\n}[keyof TMessageCatalog];\n\nexport const ZodMessageSchema = z.object({\n version: z.literal(\"v1\").default(\"v1\"),\n type: z.string(),\n payload: z.unknown(),\n});\n\nexport interface EventEmitterLike {\n on(eventName: string | symbol, listener: (...args: any[]) => void): this;\n}\n\nexport class ZodMessageHandler<TMessageCatalog extends ZodMessageCatalogSchema> {\n #schema: TMessageCatalog;\n #handlers: ZodMessageHandlers<TMessageCatalog> | undefined;\n\n constructor(options: ZodMessageHandlerOptions<TMessageCatalog>) {\n this.#schema = options.schema;\n this.#handlers = options.messages;\n }\n\n public async handleMessage(message: unknown) {\n const parsedMessage = this.parseMessage(message);\n\n if (!this.#handlers) {\n throw new Error(\"No handlers provided\");\n }\n\n const handler = this.#handlers[parsedMessage.type];\n\n if (!handler) {\n console.error(`No handler for message type: ${String(parsedMessage.type)}`);\n return;\n }\n\n const ack = await handler(parsedMessage.payload);\n\n return ack;\n }\n\n public parseMessage(message: unknown): MessageFromCatalog<TMessageCatalog> {\n const parsedMessage = ZodMessageSchema.safeParse(message);\n\n if (!parsedMessage.success) {\n throw new Error(`Failed to parse message: ${JSON.stringify(parsedMessage.error)}`);\n }\n\n const schema = this.#schema[parsedMessage.data.type];\n\n if (!schema) {\n throw new Error(`Unknown message type: ${parsedMessage.data.type}`);\n }\n\n const parsedPayload = schema.safeParse(parsedMessage.data.payload);\n\n if (!parsedPayload.success) {\n throw new Error(`Failed to parse message payload: ${JSON.stringify(parsedPayload.error)}`);\n }\n\n return {\n type: parsedMessage.data.type,\n payload: parsedPayload.data,\n };\n }\n\n public registerHandlers(emitter: EventEmitterLike, logger?: StructuredLogger) {\n const log = logger ?? console;\n\n if (!this.#handlers) {\n log.info(\"No handlers provided\");\n return;\n }\n\n for (const eventName of Object.keys(this.#schema)) {\n emitter.on(eventName, async (message: any, callback?: any): Promise<void> => {\n log.info(`handling ${eventName}`, {\n payload: message,\n hasCallback: !!callback,\n });\n\n let ack;\n\n // FIXME: this only works if the message doesn't have genuine payload prop\n if (\"payload\" in message) {\n ack = await this.handleMessage({ type: eventName, ...message });\n } else {\n // Handle messages not sent by ZodMessageSender\n const { version, ...payload } = message;\n ack = await this.handleMessage({ type: eventName, version, payload });\n }\n\n if (callback && typeof callback === \"function\") {\n callback(ack);\n }\n });\n }\n }\n}\n\ntype ZodMessageSenderCallback<TMessageCatalog extends ZodMessageCatalogSchema> = (message: {\n type: keyof TMessageCatalog;\n payload: z.infer<TMessageCatalog[keyof TMessageCatalog]>;\n version: \"v1\";\n}) => Promise<void>;\n\nexport type ZodMessageSenderOptions<TMessageCatalog extends ZodMessageCatalogSchema> = {\n schema: TMessageCatalog;\n sender: ZodMessageSenderCallback<TMessageCatalog>;\n};\n\nexport class ZodMessageSender<TMessageCatalog extends ZodMessageCatalogSchema> {\n #schema: TMessageCatalog;\n #sender: ZodMessageSenderCallback<TMessageCatalog>;\n\n constructor(options: ZodMessageSenderOptions<TMessageCatalog>) {\n this.#schema = options.schema;\n this.#sender = options.sender;\n }\n\n public async send<K extends keyof TMessageCatalog>(\n type: K,\n payload: z.input<TMessageCatalog[K]>\n ) {\n const schema = this.#schema[type];\n\n if (!schema) {\n throw new Error(`Unknown message type: ${type as string}`);\n }\n\n const parsedPayload = schema.safeParse(payload);\n\n if (!parsedPayload.success) {\n throw new ZodSchemaParsedError(parsedPayload.error, payload);\n }\n\n await this.#sender({ type, payload, version: \"v1\" });\n }\n\n public async forwardMessage(message: unknown) {\n const parsedMessage = ZodMessageSchema.safeParse(message);\n\n if (!parsedMessage.success) {\n throw new Error(`Failed to parse message: ${JSON.stringify(parsedMessage.error)}`);\n }\n\n const schema = this.#schema[parsedMessage.data.type];\n\n if (!schema) {\n throw new Error(`Unknown message type: ${parsedMessage.data.type}`);\n }\n\n const parsedPayload = schema.safeParse(parsedMessage.data.payload);\n\n if (!parsedPayload.success) {\n throw new Error(`Failed to parse message payload: ${JSON.stringify(parsedPayload.error)}`);\n }\n\n await this.#sender({\n type: parsedMessage.data.type,\n payload: parsedPayload.data,\n version: \"v1\",\n });\n }\n}\n\nexport type MessageCatalogToSocketIoEvents<TCatalog extends ZodMessageCatalogSchema> = {\n [K in keyof TCatalog]: (message: z.infer<TCatalog[K]>) => void;\n};\n"]}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
5
|
+
var __accessCheck = (obj, member, msg) => {
|
|
6
|
+
if (!member.has(obj))
|
|
7
|
+
throw TypeError("Cannot " + msg);
|
|
8
|
+
};
|
|
9
|
+
var __privateGet = (obj, member, getter) => {
|
|
10
|
+
__accessCheck(obj, member, "read from private field");
|
|
11
|
+
return getter ? getter.call(obj) : member.get(obj);
|
|
12
|
+
};
|
|
13
|
+
var __privateAdd = (obj, member, value) => {
|
|
14
|
+
if (member.has(obj))
|
|
15
|
+
throw TypeError("Cannot add the same private member more than once");
|
|
16
|
+
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
17
|
+
};
|
|
18
|
+
var __privateSet = (obj, member, value, setter) => {
|
|
19
|
+
__accessCheck(obj, member, "write to private field");
|
|
20
|
+
setter ? setter.call(obj, value) : member.set(obj, value);
|
|
21
|
+
return value;
|
|
22
|
+
};
|
|
23
|
+
var _ZodSchemaParsedError = class _ZodSchemaParsedError extends Error {
|
|
24
|
+
constructor(error, payload) {
|
|
25
|
+
super(error.message);
|
|
26
|
+
this.error = error;
|
|
27
|
+
this.payload = payload;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
__name(_ZodSchemaParsedError, "ZodSchemaParsedError");
|
|
31
|
+
var ZodSchemaParsedError = _ZodSchemaParsedError;
|
|
32
|
+
var ZodMessageSchema = z.object({
|
|
33
|
+
version: z.literal("v1").default("v1"),
|
|
34
|
+
type: z.string(),
|
|
35
|
+
payload: z.unknown()
|
|
36
|
+
});
|
|
37
|
+
var _schema, _handlers;
|
|
38
|
+
var _ZodMessageHandler = class _ZodMessageHandler {
|
|
39
|
+
constructor(options) {
|
|
40
|
+
__privateAdd(this, _schema, void 0);
|
|
41
|
+
__privateAdd(this, _handlers, void 0);
|
|
42
|
+
__privateSet(this, _schema, options.schema);
|
|
43
|
+
__privateSet(this, _handlers, options.messages);
|
|
44
|
+
}
|
|
45
|
+
async handleMessage(message) {
|
|
46
|
+
const parsedMessage = this.parseMessage(message);
|
|
47
|
+
if (!__privateGet(this, _handlers)) {
|
|
48
|
+
throw new Error("No handlers provided");
|
|
49
|
+
}
|
|
50
|
+
const handler = __privateGet(this, _handlers)[parsedMessage.type];
|
|
51
|
+
if (!handler) {
|
|
52
|
+
console.error(`No handler for message type: ${String(parsedMessage.type)}`);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const ack = await handler(parsedMessage.payload);
|
|
56
|
+
return ack;
|
|
57
|
+
}
|
|
58
|
+
parseMessage(message) {
|
|
59
|
+
const parsedMessage = ZodMessageSchema.safeParse(message);
|
|
60
|
+
if (!parsedMessage.success) {
|
|
61
|
+
throw new Error(`Failed to parse message: ${JSON.stringify(parsedMessage.error)}`);
|
|
62
|
+
}
|
|
63
|
+
const schema = __privateGet(this, _schema)[parsedMessage.data.type];
|
|
64
|
+
if (!schema) {
|
|
65
|
+
throw new Error(`Unknown message type: ${parsedMessage.data.type}`);
|
|
66
|
+
}
|
|
67
|
+
const parsedPayload = schema.safeParse(parsedMessage.data.payload);
|
|
68
|
+
if (!parsedPayload.success) {
|
|
69
|
+
throw new Error(`Failed to parse message payload: ${JSON.stringify(parsedPayload.error)}`);
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
type: parsedMessage.data.type,
|
|
73
|
+
payload: parsedPayload.data
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
registerHandlers(emitter, logger) {
|
|
77
|
+
const log = logger ?? console;
|
|
78
|
+
if (!__privateGet(this, _handlers)) {
|
|
79
|
+
log.info("No handlers provided");
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
for (const eventName of Object.keys(__privateGet(this, _schema))) {
|
|
83
|
+
emitter.on(eventName, async (message, callback) => {
|
|
84
|
+
log.info(`handling ${eventName}`, {
|
|
85
|
+
payload: message,
|
|
86
|
+
hasCallback: !!callback
|
|
87
|
+
});
|
|
88
|
+
let ack;
|
|
89
|
+
if ("payload" in message) {
|
|
90
|
+
ack = await this.handleMessage({
|
|
91
|
+
type: eventName,
|
|
92
|
+
...message
|
|
93
|
+
});
|
|
94
|
+
} else {
|
|
95
|
+
const { version, ...payload } = message;
|
|
96
|
+
ack = await this.handleMessage({
|
|
97
|
+
type: eventName,
|
|
98
|
+
version,
|
|
99
|
+
payload
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
if (callback && typeof callback === "function") {
|
|
103
|
+
callback(ack);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
_schema = new WeakMap();
|
|
110
|
+
_handlers = new WeakMap();
|
|
111
|
+
__name(_ZodMessageHandler, "ZodMessageHandler");
|
|
112
|
+
var ZodMessageHandler = _ZodMessageHandler;
|
|
113
|
+
var _schema2, _sender;
|
|
114
|
+
var _ZodMessageSender = class _ZodMessageSender {
|
|
115
|
+
constructor(options) {
|
|
116
|
+
__privateAdd(this, _schema2, void 0);
|
|
117
|
+
__privateAdd(this, _sender, void 0);
|
|
118
|
+
__privateSet(this, _schema2, options.schema);
|
|
119
|
+
__privateSet(this, _sender, options.sender);
|
|
120
|
+
}
|
|
121
|
+
async send(type, payload) {
|
|
122
|
+
const schema = __privateGet(this, _schema2)[type];
|
|
123
|
+
if (!schema) {
|
|
124
|
+
throw new Error(`Unknown message type: ${type}`);
|
|
125
|
+
}
|
|
126
|
+
const parsedPayload = schema.safeParse(payload);
|
|
127
|
+
if (!parsedPayload.success) {
|
|
128
|
+
throw new ZodSchemaParsedError(parsedPayload.error, payload);
|
|
129
|
+
}
|
|
130
|
+
await __privateGet(this, _sender).call(this, {
|
|
131
|
+
type,
|
|
132
|
+
payload,
|
|
133
|
+
version: "v1"
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
async forwardMessage(message) {
|
|
137
|
+
const parsedMessage = ZodMessageSchema.safeParse(message);
|
|
138
|
+
if (!parsedMessage.success) {
|
|
139
|
+
throw new Error(`Failed to parse message: ${JSON.stringify(parsedMessage.error)}`);
|
|
140
|
+
}
|
|
141
|
+
const schema = __privateGet(this, _schema2)[parsedMessage.data.type];
|
|
142
|
+
if (!schema) {
|
|
143
|
+
throw new Error(`Unknown message type: ${parsedMessage.data.type}`);
|
|
144
|
+
}
|
|
145
|
+
const parsedPayload = schema.safeParse(parsedMessage.data.payload);
|
|
146
|
+
if (!parsedPayload.success) {
|
|
147
|
+
throw new Error(`Failed to parse message payload: ${JSON.stringify(parsedPayload.error)}`);
|
|
148
|
+
}
|
|
149
|
+
await __privateGet(this, _sender).call(this, {
|
|
150
|
+
type: parsedMessage.data.type,
|
|
151
|
+
payload: parsedPayload.data,
|
|
152
|
+
version: "v1"
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
_schema2 = new WeakMap();
|
|
157
|
+
_sender = new WeakMap();
|
|
158
|
+
__name(_ZodMessageSender, "ZodMessageSender");
|
|
159
|
+
var ZodMessageSender = _ZodMessageSender;
|
|
160
|
+
|
|
161
|
+
export { ZodMessageHandler, ZodMessageSchema, ZodMessageSender, ZodSchemaParsedError };
|
|
162
|
+
//# sourceMappingURL=out.js.map
|
|
163
|
+
//# sourceMappingURL=zodMessageHandler.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/v3/zodMessageHandler.ts"],"names":["z","ZodSchemaParsedError","Error","constructor","error","payload","message","ZodMessageSchema","object","version","literal","default","type","string","unknown","ZodMessageHandler","options","schema","messages","handleMessage","parsedMessage","parseMessage","handler","console","String","ack","safeParse","success","JSON","stringify","data","parsedPayload","registerHandlers","emitter","logger","log","info","eventName","Object","keys","on","callback","hasCallback","_schema","ZodMessageSender","sender","send","forwardMessage"],"mappings":"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","sourcesContent":["import { z } from \"zod\";\nimport { StructuredLogger } from \"./utils/structuredLogger\";\n\nexport class ZodSchemaParsedError extends Error {\n constructor(\n public error: z.ZodError,\n public payload: unknown\n ) {\n super(error.message);\n }\n}\n\nexport type ZodMessageValueSchema<TDiscriminatedUnion extends z.ZodDiscriminatedUnion<any, any>> =\n | z.ZodFirstPartySchemaTypes\n | TDiscriminatedUnion;\n\nexport interface ZodMessageCatalogSchema {\n [key: string]: ZodMessageValueSchema<any>;\n}\n\nexport type ZodMessageHandlers<TCatalogSchema extends ZodMessageCatalogSchema> = Partial<{\n [K in keyof TCatalogSchema]: (payload: z.infer<TCatalogSchema[K]>) => Promise<any>;\n}>;\n\nexport type ZodMessageHandlerOptions<TMessageCatalog extends ZodMessageCatalogSchema> = {\n schema: TMessageCatalog;\n messages?: ZodMessageHandlers<TMessageCatalog>;\n};\n\nexport type MessageFromSchema<\n K extends keyof TMessageCatalog,\n TMessageCatalog extends ZodMessageCatalogSchema,\n> = {\n type: K;\n payload: z.input<TMessageCatalog[K]>;\n};\n\nexport type MessageFromCatalog<TMessageCatalog extends ZodMessageCatalogSchema> = {\n [K in keyof TMessageCatalog]: MessageFromSchema<K, TMessageCatalog>;\n}[keyof TMessageCatalog];\n\nexport const ZodMessageSchema = z.object({\n version: z.literal(\"v1\").default(\"v1\"),\n type: z.string(),\n payload: z.unknown(),\n});\n\nexport interface EventEmitterLike {\n on(eventName: string | symbol, listener: (...args: any[]) => void): this;\n}\n\nexport class ZodMessageHandler<TMessageCatalog extends ZodMessageCatalogSchema> {\n #schema: TMessageCatalog;\n #handlers: ZodMessageHandlers<TMessageCatalog> | undefined;\n\n constructor(options: ZodMessageHandlerOptions<TMessageCatalog>) {\n this.#schema = options.schema;\n this.#handlers = options.messages;\n }\n\n public async handleMessage(message: unknown) {\n const parsedMessage = this.parseMessage(message);\n\n if (!this.#handlers) {\n throw new Error(\"No handlers provided\");\n }\n\n const handler = this.#handlers[parsedMessage.type];\n\n if (!handler) {\n console.error(`No handler for message type: ${String(parsedMessage.type)}`);\n return;\n }\n\n const ack = await handler(parsedMessage.payload);\n\n return ack;\n }\n\n public parseMessage(message: unknown): MessageFromCatalog<TMessageCatalog> {\n const parsedMessage = ZodMessageSchema.safeParse(message);\n\n if (!parsedMessage.success) {\n throw new Error(`Failed to parse message: ${JSON.stringify(parsedMessage.error)}`);\n }\n\n const schema = this.#schema[parsedMessage.data.type];\n\n if (!schema) {\n throw new Error(`Unknown message type: ${parsedMessage.data.type}`);\n }\n\n const parsedPayload = schema.safeParse(parsedMessage.data.payload);\n\n if (!parsedPayload.success) {\n throw new Error(`Failed to parse message payload: ${JSON.stringify(parsedPayload.error)}`);\n }\n\n return {\n type: parsedMessage.data.type,\n payload: parsedPayload.data,\n };\n }\n\n public registerHandlers(emitter: EventEmitterLike, logger?: StructuredLogger) {\n const log = logger ?? console;\n\n if (!this.#handlers) {\n log.info(\"No handlers provided\");\n return;\n }\n\n for (const eventName of Object.keys(this.#schema)) {\n emitter.on(eventName, async (message: any, callback?: any): Promise<void> => {\n log.info(`handling ${eventName}`, {\n payload: message,\n hasCallback: !!callback,\n });\n\n let ack;\n\n // FIXME: this only works if the message doesn't have genuine payload prop\n if (\"payload\" in message) {\n ack = await this.handleMessage({ type: eventName, ...message });\n } else {\n // Handle messages not sent by ZodMessageSender\n const { version, ...payload } = message;\n ack = await this.handleMessage({ type: eventName, version, payload });\n }\n\n if (callback && typeof callback === \"function\") {\n callback(ack);\n }\n });\n }\n }\n}\n\ntype ZodMessageSenderCallback<TMessageCatalog extends ZodMessageCatalogSchema> = (message: {\n type: keyof TMessageCatalog;\n payload: z.infer<TMessageCatalog[keyof TMessageCatalog]>;\n version: \"v1\";\n}) => Promise<void>;\n\nexport type ZodMessageSenderOptions<TMessageCatalog extends ZodMessageCatalogSchema> = {\n schema: TMessageCatalog;\n sender: ZodMessageSenderCallback<TMessageCatalog>;\n};\n\nexport class ZodMessageSender<TMessageCatalog extends ZodMessageCatalogSchema> {\n #schema: TMessageCatalog;\n #sender: ZodMessageSenderCallback<TMessageCatalog>;\n\n constructor(options: ZodMessageSenderOptions<TMessageCatalog>) {\n this.#schema = options.schema;\n this.#sender = options.sender;\n }\n\n public async send<K extends keyof TMessageCatalog>(\n type: K,\n payload: z.input<TMessageCatalog[K]>\n ) {\n const schema = this.#schema[type];\n\n if (!schema) {\n throw new Error(`Unknown message type: ${type as string}`);\n }\n\n const parsedPayload = schema.safeParse(payload);\n\n if (!parsedPayload.success) {\n throw new ZodSchemaParsedError(parsedPayload.error, payload);\n }\n\n await this.#sender({ type, payload, version: \"v1\" });\n }\n\n public async forwardMessage(message: unknown) {\n const parsedMessage = ZodMessageSchema.safeParse(message);\n\n if (!parsedMessage.success) {\n throw new Error(`Failed to parse message: ${JSON.stringify(parsedMessage.error)}`);\n }\n\n const schema = this.#schema[parsedMessage.data.type];\n\n if (!schema) {\n throw new Error(`Unknown message type: ${parsedMessage.data.type}`);\n }\n\n const parsedPayload = schema.safeParse(parsedMessage.data.payload);\n\n if (!parsedPayload.success) {\n throw new Error(`Failed to parse message payload: ${JSON.stringify(parsedPayload.error)}`);\n }\n\n await this.#sender({\n type: parsedMessage.data.type,\n payload: parsedPayload.data,\n version: \"v1\",\n });\n }\n}\n\nexport type MessageCatalogToSocketIoEvents<TCatalog extends ZodMessageCatalogSchema> = {\n [K in keyof TCatalog]: (message: z.infer<TCatalog[K]>) => void;\n};\n"]}
|