@forklaunch/core 3.2.1 → 3.3.0

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.
Files changed (40) hide show
  1. package/bin/gateway-mock/routes/payments-context.mjs +260 -0
  2. package/bin/gateway-mock/routes/payments.mjs +47 -1
  3. package/lib/http/bindRuntimeAuth.d.ts +53 -0
  4. package/lib/http/bindRuntimeAuth.d.ts.map +1 -0
  5. package/lib/http/bindRuntimeAuth.test.d.ts +2 -0
  6. package/lib/http/bindRuntimeAuth.test.d.ts.map +1 -0
  7. package/lib/http/index.d.ts +2 -0
  8. package/lib/http/index.d.ts.map +1 -1
  9. package/lib/http/index.js +284 -76
  10. package/lib/http/index.js.map +1 -1
  11. package/lib/http/index.mjs +282 -76
  12. package/lib/http/index.mjs.map +1 -1
  13. package/lib/http/mcpGenerator/mcpGenerator.d.ts.map +1 -1
  14. package/lib/http/middleware/internal/validationDiagnostic.d.ts +3 -0
  15. package/lib/http/middleware/internal/validationDiagnostic.d.ts.map +1 -0
  16. package/lib/http/middleware/request/auth.middleware.d.ts +0 -11
  17. package/lib/http/middleware/request/auth.middleware.d.ts.map +1 -1
  18. package/lib/http/middleware/request/parse.middleware.d.ts.map +1 -1
  19. package/lib/http/middleware/response/enrichExpressLikeSend.middleware.d.ts.map +1 -1
  20. package/lib/http/middleware/response/parse.middleware.d.ts.map +1 -1
  21. package/lib/http/openApiV3Generator/openApiV3Generator.d.ts.map +1 -1
  22. package/lib/http/paymentsClient.d.ts.map +1 -1
  23. package/lib/http/registerDelegatedSurface.d.ts +28 -0
  24. package/lib/http/registerDelegatedSurface.d.ts.map +1 -0
  25. package/lib/http/registerDelegatedSurface.test.d.ts +2 -0
  26. package/lib/http/registerDelegatedSurface.test.d.ts.map +1 -0
  27. package/lib/http/router/discriminateBody.d.ts +2 -1
  28. package/lib/http/router/discriminateBody.d.ts.map +1 -1
  29. package/lib/http/router/expressLikeRouter.d.ts.map +1 -1
  30. package/lib/persistence/compliantField.d.ts.map +1 -1
  31. package/lib/persistence/index.js +1 -6
  32. package/lib/persistence/index.js.map +1 -1
  33. package/lib/persistence/index.mjs +1 -6
  34. package/lib/persistence/index.mjs.map +1 -1
  35. package/lib/ws/asyncApiV3Generator/asyncApiV3Generator.d.ts.map +1 -1
  36. package/lib/ws/index.js +94 -8
  37. package/lib/ws/index.js.map +1 -1
  38. package/lib/ws/index.mjs +94 -8
  39. package/lib/ws/index.mjs.map +1 -1
  40. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"asyncApiV3Generator.d.ts","sourceRoot":"","sources":["../../../src/ws/asyncApiV3Generator/asyncApiV3Generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EAQf,MAAM,oCAAoC,CAAC;AAE5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,OAAO,EAAE,WAAW,EAAoB,MAAM,4BAA4B,CAAC;AAE3E,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAAC;AAE9C,wBAAgB,gBAAgB,CAAC,EAAE,SAAS,kBAAkB,EAC5D,YAAY,EAAE,WAAW,CAAC,EAAE,CAAC,EAC7B,OAAO,CAAC,EAAE;IACR,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,EAAE,CAAC,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC5B,kBAAkB,CAAC,EAAE,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;CAC7D,GACA,gBAAgB,CAuIlB"}
1
+ {"version":3,"file":"asyncApiV3Generator.d.ts","sourceRoot":"","sources":["../../../src/ws/asyncApiV3Generator/asyncApiV3Generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EAQf,MAAM,oCAAoC,CAAC;AAE5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,OAAO,EAAE,WAAW,EAAoB,MAAM,4BAA4B,CAAC;AAE3E,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAAC;AA0H9C,wBAAgB,gBAAgB,CAAC,EAAE,SAAS,kBAAkB,EAC5D,YAAY,EAAE,WAAW,CAAC,EAAE,CAAC,EAC7B,OAAO,CAAC,EAAE;IACR,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,EAAE,CAAC,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC5B,kBAAkB,CAAC,EAAE,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;CAC7D,GACA,gBAAgB,CA6IlB"}
package/lib/ws/index.js CHANGED
@@ -31,8 +31,89 @@ __export(ws_exports, {
31
31
  module.exports = __toCommonJS(ws_exports);
32
32
 
33
33
  // src/ws/asyncApiV3Generator/asyncApiV3Generator.ts
34
+ function pointerSegment(value) {
35
+ return encodeURIComponent(
36
+ value.replace(/~/g, "~0").replace(/\//g, "~1")
37
+ ).replace(
38
+ /[!'()*]/g,
39
+ (character) => `%${character.charCodeAt(0).toString(16).toUpperCase()}`
40
+ );
41
+ }
42
+ function payloadSchema(schema, depth = 0, rootDialect) {
43
+ if (depth > 64) throw new Error("AsyncAPI schema nesting exceeds 64 levels");
44
+ if (typeof schema === "boolean") return schema ? {} : { not: {} };
45
+ if (!schema || typeof schema !== "object" || Array.isArray(schema))
46
+ return schema;
47
+ const prototype = Object.getPrototypeOf(schema);
48
+ if (prototype !== null && prototype.constructor?.name !== "Object")
49
+ return schema;
50
+ const output = { ...schema };
51
+ const dialect = rootDialect ?? (typeof output.$schema === "string" ? output.$schema : "");
52
+ const draft4 = dialect.includes("/draft-04/");
53
+ const draft6 = dialect.includes("/draft-06/");
54
+ for (const [key, value] of Object.entries(output)) {
55
+ if (draft4 && ["const", "contains", "propertyNames"].includes(key) || (draft4 || draft6) && [
56
+ "if",
57
+ "then",
58
+ "else",
59
+ "dependentSchemas",
60
+ "prefixItems",
61
+ "unevaluatedProperties",
62
+ "unevaluatedItems",
63
+ "contentSchema"
64
+ ].includes(key))
65
+ continue;
66
+ if (["additionalProperties", "additionalItems"].includes(key) && typeof value === "boolean")
67
+ continue;
68
+ if ([
69
+ "properties",
70
+ "patternProperties",
71
+ "dependentSchemas",
72
+ "dependencies",
73
+ "$defs",
74
+ "definitions"
75
+ ].includes(key) && value && typeof value === "object" && !Array.isArray(value)) {
76
+ output[key] = Object.fromEntries(
77
+ Object.entries(value).map(([name, child]) => [
78
+ name,
79
+ payloadSchema(child, depth + 1, dialect)
80
+ ])
81
+ );
82
+ } else if (["allOf", "anyOf", "oneOf", "prefixItems", "items"].includes(key) && Array.isArray(value)) {
83
+ output[key] = value.map(
84
+ (child) => payloadSchema(child, depth + 1, dialect)
85
+ );
86
+ } else if ([
87
+ "additionalProperties",
88
+ "additionalItems",
89
+ "unevaluatedProperties",
90
+ "unevaluatedItems",
91
+ "contentSchema",
92
+ "contains",
93
+ "not",
94
+ "if",
95
+ "then",
96
+ "else",
97
+ "propertyNames",
98
+ "items"
99
+ ].includes(key)) {
100
+ output[key] = payloadSchema(value, depth + 1, dialect);
101
+ }
102
+ }
103
+ return output;
104
+ }
105
+ function messagePayload(schema) {
106
+ const dialect = schema && typeof schema === "object" && "$schema" in schema ? schema.$schema : void 0;
107
+ const version = typeof dialect === "string" ? ["draft-04", "draft-06", "2019-09", "2020-12"].find(
108
+ (version2) => dialect.includes(version2)
109
+ ) : void 0;
110
+ return version ? {
111
+ schemaFormat: `application/schema+json;version=${version}`,
112
+ schema: payloadSchema(schema)
113
+ } : payloadSchema(schema);
114
+ }
34
115
  function generateAsyncApi(eventSchemas, options) {
35
- const channels = {};
116
+ const channels = /* @__PURE__ */ Object.create(null);
36
117
  const appendMessageToChannel = (collection) => {
37
118
  if (!collection) {
38
119
  return;
@@ -46,19 +127,24 @@ function generateAsyncApi(eventSchemas, options) {
46
127
  const channelNames = entry.channel ? [entry.channel] : entry.channels && entry.channels.length > 0 ? entry.channels : [messageKey];
47
128
  const messageName = entry.operation ?? entry.operations?.[0] ?? messageKey;
48
129
  channelNames.forEach((channelName) => {
130
+ if (!channelName || /[?#]/.test(channelName)) {
131
+ throw new Error(
132
+ "AsyncAPI channel addresses must be nonempty and exclude query/fragment delimiters"
133
+ );
134
+ }
49
135
  const existingChannel = channels[channelName];
50
136
  if (!existingChannel || "$ref" in existingChannel) {
51
137
  channels[channelName] = {
52
138
  address: channelName,
53
- messages: {}
139
+ messages: /* @__PURE__ */ Object.create(null)
54
140
  };
55
141
  }
56
142
  const channelEntry = channels[channelName];
57
- channelEntry.messages = channelEntry.messages ?? {};
143
+ channelEntry.messages = channelEntry.messages ?? /* @__PURE__ */ Object.create(null);
58
144
  const messages = channelEntry.messages;
59
145
  const message = {
60
146
  name: messageName,
61
- payload: schema
147
+ payload: messagePayload(schema)
62
148
  };
63
149
  messages[messageName] = message;
64
150
  });
@@ -67,7 +153,7 @@ function generateAsyncApi(eventSchemas, options) {
67
153
  appendMessageToChannel(eventSchemas.clientMessages);
68
154
  appendMessageToChannel(eventSchemas.serverMessages);
69
155
  appendMessageToChannel(eventSchemas.errors);
70
- const operations = {};
156
+ const operations = /* @__PURE__ */ Object.create(null);
71
157
  const addOperationsForCollection = (collection, action) => {
72
158
  if (!collection) {
73
159
  return;
@@ -84,11 +170,11 @@ function generateAsyncApi(eventSchemas, options) {
84
170
  const operation = {
85
171
  action,
86
172
  channel: {
87
- $ref: `#/channels/${channelName}`
173
+ $ref: `#/channels/${pointerSegment(channelName)}`
88
174
  },
89
175
  messages: [
90
176
  {
91
- $ref: `#/channels/${channelName}/messages/${messageName}`
177
+ $ref: `#/channels/${pointerSegment(channelName)}/messages/${pointerSegment(messageName)}`
92
178
  }
93
179
  ]
94
180
  };
@@ -130,7 +216,7 @@ function buildUnionSchema(schemaValidator, record) {
130
216
  return schemaValidator.union(schemas);
131
217
  }
132
218
  function parseSchemaValue(schemaValidator, value, schema, context) {
133
- if (!schema) {
219
+ if (schema === void 0) {
134
220
  return value;
135
221
  }
136
222
  const result = schemaValidator.parse(schema, value);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ws/index.ts","../../src/ws/asyncApiV3Generator/asyncApiV3Generator.ts","../../src/ws/webSocketLike.ts"],"sourcesContent":["export * from './asyncApiV3Generator/asyncApiV3Generator';\nexport * from './types/eventSchema.types';\nexport * from './webSocketLike';\n","import type {\n AsyncAPIObject,\n ChannelObject,\n ChannelsObject,\n MessageObject,\n MessagesObject,\n OperationObject,\n OperationsObject,\n ReferenceObject\n} from '@asyncapi/parser/esm/spec-types/v3';\n\nimport type { AnySchemaValidator } from '@forklaunch/validator';\n\nimport { EventSchema, EventSchemaEntry } from '../types/eventSchema.types';\n\nexport type AsyncApiDocument = AsyncAPIObject;\n\nexport function generateAsyncApi<SV extends AnySchemaValidator>(\n eventSchemas: EventSchema<SV>,\n options?: {\n title?: string;\n version?: string;\n description?: string;\n id?: AsyncApiDocument['id'];\n defaultContentType?: AsyncApiDocument['defaultContentType'];\n }\n): AsyncApiDocument {\n const channels: ChannelsObject = {};\n\n const appendMessageToChannel = (\n collection?: Record<string, EventSchemaEntry<SV>>\n ) => {\n if (!collection) {\n return;\n }\n\n Object.entries(collection).forEach(([messageKey, candidate]) => {\n if (\n !candidate ||\n typeof candidate !== 'object' ||\n Array.isArray(candidate) ||\n !('shape' in candidate)\n ) {\n return;\n }\n\n const entry = candidate as EventSchemaEntry<SV>;\n const schema = entry.shape;\n\n // Determine which channels to use\n const channelNames: string[] = entry.channel\n ? [entry.channel]\n : entry.channels && entry.channels.length > 0\n ? entry.channels\n : [messageKey];\n\n const messageName =\n entry.operation ?? entry.operations?.[0] ?? messageKey;\n\n // Add message to all specified channels\n channelNames.forEach((channelName) => {\n const existingChannel = channels[channelName];\n if (!existingChannel || '$ref' in existingChannel) {\n channels[channelName] = {\n address: channelName,\n messages: {}\n };\n }\n\n const channelEntry = channels[channelName] as ChannelObject;\n channelEntry.messages = (channelEntry.messages ?? {}) as MessagesObject;\n const messages = channelEntry.messages as MessagesObject;\n\n const message: MessageObject = {\n name: messageName,\n payload: schema\n };\n\n messages[messageName] = message;\n });\n });\n };\n\n appendMessageToChannel(eventSchemas.clientMessages);\n appendMessageToChannel(eventSchemas.serverMessages);\n appendMessageToChannel(eventSchemas.errors);\n\n const operations: OperationsObject = {};\n\n const addOperationsForCollection = (\n collection: Record<string, EventSchemaEntry<SV>> | undefined,\n action: 'send' | 'receive'\n ) => {\n if (!collection) {\n return;\n }\n\n Object.entries(collection).forEach(([messageKey, candidate]) => {\n if (\n !candidate ||\n typeof candidate !== 'object' ||\n Array.isArray(candidate) ||\n !('shape' in candidate)\n ) {\n return;\n }\n\n const entry = candidate as EventSchemaEntry<SV>;\n\n // Determine which channels to use\n const channelNames: string[] = entry.channel\n ? [entry.channel]\n : entry.channels && entry.channels.length > 0\n ? entry.channels\n : [messageKey];\n\n const messageName =\n entry.operation ?? entry.operations?.[0] ?? messageKey;\n\n // Create operations for all specified channels\n channelNames.forEach((channelName) => {\n const operationKey = `${action}-${channelName}-${messageName}`;\n\n const operation: OperationObject = {\n action,\n channel: {\n $ref: `#/channels/${channelName}`\n } as ReferenceObject,\n messages: [\n {\n $ref: `#/channels/${channelName}/messages/${messageName}`\n } as ReferenceObject\n ]\n };\n\n operations[operationKey] = operation;\n });\n });\n };\n\n addOperationsForCollection(eventSchemas.clientMessages, 'receive');\n addOperationsForCollection(eventSchemas.serverMessages, 'send');\n\n const { title, version, description } = options ?? {};\n\n const asyncApiDocument: AsyncApiDocument = {\n asyncapi: '3.0.0',\n info: {\n title: title || process.env.API_TITLE || 'Forklaunch WebSocket API',\n version: version || '1.0.0',\n ...(description ? { description } : {})\n },\n ...(options?.id ? { id: options.id } : {}),\n ...(options?.defaultContentType\n ? { defaultContentType: options.defaultContentType }\n : {}),\n ...(Object.keys(channels).length > 0 ? { channels } : {}),\n ...(Object.keys(operations).length > 0 ? { operations } : {})\n };\n\n return asyncApiDocument;\n}\n","import {\n AnySchemaValidator,\n IdiomaticSchema,\n prettyPrintParseErrors,\n SchemaValidator\n} from '@forklaunch/validator';\n\nimport { EventSchema, EventSchemaEntry } from './types/eventSchema.types';\n\ntype SchemaRecord<SV extends AnySchemaValidator> =\n Record<string, EventSchemaEntry<SV>> | undefined;\n\nexport function buildUnionSchema<SV extends AnySchemaValidator>(\n schemaValidator: SchemaValidator,\n record: SchemaRecord<SV>\n): IdiomaticSchema<SV> | undefined {\n if (!record) {\n return undefined;\n }\n\n const schemas = Object.values(record)\n .filter((entry): entry is EventSchemaEntry<SV> => Boolean(entry))\n .map((entry) => entry.shape);\n\n if (schemas.length === 0) {\n return undefined;\n }\n\n if (schemas.length === 1) {\n return schemas[0];\n }\n\n return schemaValidator.union(schemas) as IdiomaticSchema<SV>;\n}\n\nexport function parseSchemaValue<SV extends AnySchemaValidator>(\n schemaValidator: SchemaValidator,\n value: unknown,\n schema: IdiomaticSchema<SV> | undefined,\n context: string\n): unknown {\n if (!schema) {\n return value;\n }\n\n const result = schemaValidator.parse(schema, value);\n if (result.ok) {\n return result.value;\n }\n\n const errors = 'errors' in result ? result.errors || [] : [];\n throw new Error(prettyPrintParseErrors(errors, context));\n}\n\nexport function encodeSchemaValue<SV extends AnySchemaValidator>(\n schemaValidator: SchemaValidator,\n value: unknown,\n schema: IdiomaticSchema<SV> | undefined,\n context: string\n): unknown {\n const validated = parseSchemaValue(schemaValidator, value, schema, context);\n\n if (\n Buffer.isBuffer(validated) ||\n validated instanceof ArrayBuffer ||\n ArrayBuffer.isView(validated)\n ) {\n if (Buffer.isBuffer(validated)) {\n return validated;\n }\n\n if (validated instanceof ArrayBuffer) {\n return Buffer.from(validated);\n }\n\n const view = validated as {\n buffer: ArrayBuffer;\n byteOffset: number;\n byteLength: number;\n };\n const typed = new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n return Buffer.from(typed);\n }\n\n if (typeof validated === 'string') {\n return Buffer.from(validated, 'utf-8');\n }\n\n if (validated === null || validated === undefined) {\n return validated;\n }\n\n return Buffer.from(JSON.stringify(validated), 'utf-8');\n}\n\nexport function decodeSchemaValue<SV extends AnySchemaValidator>(\n schemaValidator: SchemaValidator,\n data: unknown,\n schema: IdiomaticSchema<SV> | undefined,\n context: string\n): unknown {\n let decoded: string;\n let parsed: unknown;\n\n if (Buffer.isBuffer(data)) {\n decoded = data.toString('utf-8');\n } else if (data instanceof ArrayBuffer) {\n decoded = Buffer.from(data).toString('utf-8');\n } else if (ArrayBuffer.isView(data)) {\n const view = data as {\n buffer: ArrayBuffer;\n byteOffset: number;\n byteLength: number;\n };\n decoded = Buffer.from(\n view.buffer,\n view.byteOffset,\n view.byteLength\n ).toString('utf-8');\n } else if (typeof data === 'string') {\n decoded = data;\n } else {\n parsed = data;\n return parseSchemaValue(schemaValidator, parsed, schema, context);\n }\n\n try {\n parsed = JSON.parse(decoded);\n } catch {\n parsed = decoded;\n }\n\n return parseSchemaValue(schemaValidator, parsed, schema, context);\n}\n\nexport function normalizeEncodedValue(\n encoded: unknown,\n context: string,\n allowUndefined = false\n): Buffer | undefined {\n if (encoded === null || encoded === undefined) {\n if (allowUndefined) {\n return undefined;\n }\n throw new Error(`Invalid ${context}`);\n }\n\n if (Buffer.isBuffer(encoded)) {\n return encoded;\n }\n\n if (encoded instanceof ArrayBuffer) {\n return Buffer.from(encoded);\n }\n\n if (ArrayBuffer.isView(encoded)) {\n const view = encoded as ArrayBufferView;\n return Buffer.from(view.buffer, view.byteOffset, view.byteLength);\n }\n\n if (typeof encoded === 'string') {\n return Buffer.from(encoded, 'utf-8');\n }\n\n if (\n typeof encoded === 'number' ||\n typeof encoded === 'boolean' ||\n typeof encoded === 'bigint'\n ) {\n return Buffer.from(JSON.stringify(encoded), 'utf-8');\n }\n\n if (typeof encoded === 'object') {\n return Buffer.from(JSON.stringify(encoded), 'utf-8');\n }\n\n throw new Error(`Unsupported payload type for ${context}`);\n}\n\nexport function createWebSocketSchemas<\n SV extends AnySchemaValidator,\n ES extends EventSchema<SV>\n>(schemaValidator: SchemaValidator, eventSchemas: ES) {\n const clientMessagesSchema = buildUnionSchema<SV>(\n schemaValidator,\n eventSchemas.clientMessages\n );\n const serverMessagesSchema = buildUnionSchema<SV>(\n schemaValidator,\n eventSchemas.serverMessages\n );\n const errorsSchema = buildUnionSchema<SV>(\n schemaValidator,\n eventSchemas.errors\n );\n const pingSchema = eventSchemas.ping?.shape;\n const pongSchema = eventSchemas.pong?.shape;\n const closeReasonSchema = eventSchemas.closeReason\n ? buildUnionSchema<SV>(schemaValidator, eventSchemas.closeReason)\n : undefined;\n\n return {\n clientMessagesSchema,\n serverMessagesSchema,\n errorsSchema,\n pingSchema,\n pongSchema,\n closeReasonSchema\n };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/ws/index.ts","../../src/ws/asyncApiV3Generator/asyncApiV3Generator.ts","../../src/ws/webSocketLike.ts"],"sourcesContent":["export * from './asyncApiV3Generator/asyncApiV3Generator';\nexport * from './types/eventSchema.types';\nexport * from './webSocketLike';\n","import type {\n AsyncAPIObject,\n ChannelObject,\n ChannelsObject,\n MessageObject,\n MessagesObject,\n OperationObject,\n OperationsObject,\n ReferenceObject\n} from '@asyncapi/parser/esm/spec-types/v3';\n\nimport type { AnySchemaValidator } from '@forklaunch/validator';\n\nimport { EventSchema, EventSchemaEntry } from '../types/eventSchema.types';\n\nexport type AsyncApiDocument = AsyncAPIObject;\n\nfunction pointerSegment(value: string): string {\n return encodeURIComponent(\n value.replace(/~/g, '~0').replace(/\\//g, '~1')\n ).replace(\n /[!'()*]/g,\n (character) => `%${character.charCodeAt(0).toString(16).toUpperCase()}`\n );\n}\n\n// AsyncAPI's default Schema Object uses object-form schemas. Keep idiomatic\n// validator instances intact; normalize plain JSON Schema positions only.\nfunction payloadSchema(\n schema: unknown,\n depth = 0,\n rootDialect?: string\n): unknown {\n if (depth > 64) throw new Error('AsyncAPI schema nesting exceeds 64 levels');\n if (typeof schema === 'boolean') return schema ? {} : { not: {} };\n if (!schema || typeof schema !== 'object' || Array.isArray(schema))\n return schema;\n const prototype = Object.getPrototypeOf(schema);\n if (prototype !== null && prototype.constructor?.name !== 'Object')\n return schema;\n const output: Record<string, unknown> = { ...schema };\n const dialect =\n rootDialect ?? (typeof output.$schema === 'string' ? output.$schema : '');\n const draft4 = dialect.includes('/draft-04/');\n const draft6 = dialect.includes('/draft-06/');\n for (const [key, value] of Object.entries(output)) {\n if (\n (draft4 && ['const', 'contains', 'propertyNames'].includes(key)) ||\n ((draft4 || draft6) &&\n [\n 'if',\n 'then',\n 'else',\n 'dependentSchemas',\n 'prefixItems',\n 'unevaluatedProperties',\n 'unevaluatedItems',\n 'contentSchema'\n ].includes(key))\n )\n continue;\n if (\n ['additionalProperties', 'additionalItems'].includes(key) &&\n typeof value === 'boolean'\n )\n continue;\n if (\n [\n 'properties',\n 'patternProperties',\n 'dependentSchemas',\n 'dependencies',\n '$defs',\n 'definitions'\n ].includes(key) &&\n value &&\n typeof value === 'object' &&\n !Array.isArray(value)\n ) {\n output[key] = Object.fromEntries(\n Object.entries(value).map(([name, child]) => [\n name,\n payloadSchema(child, depth + 1, dialect)\n ])\n );\n } else if (\n ['allOf', 'anyOf', 'oneOf', 'prefixItems', 'items'].includes(key) &&\n Array.isArray(value)\n ) {\n output[key] = value.map((child) =>\n payloadSchema(child, depth + 1, dialect)\n );\n } else if (\n [\n 'additionalProperties',\n 'additionalItems',\n 'unevaluatedProperties',\n 'unevaluatedItems',\n 'contentSchema',\n 'contains',\n 'not',\n 'if',\n 'then',\n 'else',\n 'propertyNames',\n 'items'\n ].includes(key)\n ) {\n output[key] = payloadSchema(value, depth + 1, dialect);\n }\n }\n return output;\n}\n\nfunction messagePayload(schema: unknown): MessageObject['payload'] {\n const dialect =\n schema && typeof schema === 'object' && '$schema' in schema\n ? schema.$schema\n : undefined;\n const version =\n typeof dialect === 'string'\n ? ['draft-04', 'draft-06', '2019-09', '2020-12'].find((version) =>\n dialect.includes(version)\n )\n : undefined;\n // The default AsyncAPI Schema Object follows Draft 7. Preserve other dialects\n // through a Multi Format Schema Object instead of changing their semantics.\n return (\n version\n ? {\n schemaFormat: `application/schema+json;version=${version}`,\n schema: payloadSchema(schema)\n }\n : payloadSchema(schema)\n ) as MessageObject['payload'];\n}\n\nexport function generateAsyncApi<SV extends AnySchemaValidator>(\n eventSchemas: EventSchema<SV>,\n options?: {\n title?: string;\n version?: string;\n description?: string;\n id?: AsyncApiDocument['id'];\n defaultContentType?: AsyncApiDocument['defaultContentType'];\n }\n): AsyncApiDocument {\n const channels: ChannelsObject = Object.create(null);\n\n const appendMessageToChannel = (\n collection?: Record<string, EventSchemaEntry<SV>>\n ) => {\n if (!collection) {\n return;\n }\n\n Object.entries(collection).forEach(([messageKey, candidate]) => {\n if (\n !candidate ||\n typeof candidate !== 'object' ||\n Array.isArray(candidate) ||\n !('shape' in candidate)\n ) {\n return;\n }\n\n const entry = candidate as EventSchemaEntry<SV>;\n const schema = entry.shape;\n\n // Determine which channels to use\n const channelNames: string[] = entry.channel\n ? [entry.channel]\n : entry.channels && entry.channels.length > 0\n ? entry.channels\n : [messageKey];\n\n const messageName =\n entry.operation ?? entry.operations?.[0] ?? messageKey;\n\n // Add message to all specified channels\n channelNames.forEach((channelName) => {\n if (!channelName || /[?#]/.test(channelName)) {\n throw new Error(\n 'AsyncAPI channel addresses must be nonempty and exclude query/fragment delimiters'\n );\n }\n const existingChannel = channels[channelName];\n if (!existingChannel || '$ref' in existingChannel) {\n channels[channelName] = {\n address: channelName,\n messages: Object.create(null)\n };\n }\n\n const channelEntry = channels[channelName] as ChannelObject;\n channelEntry.messages = (channelEntry.messages ??\n Object.create(null)) as MessagesObject;\n const messages = channelEntry.messages as MessagesObject;\n\n const message: MessageObject = {\n name: messageName,\n payload: messagePayload(schema)\n };\n\n messages[messageName] = message;\n });\n });\n };\n\n appendMessageToChannel(eventSchemas.clientMessages);\n appendMessageToChannel(eventSchemas.serverMessages);\n appendMessageToChannel(eventSchemas.errors);\n\n const operations: OperationsObject = Object.create(null);\n\n const addOperationsForCollection = (\n collection: Record<string, EventSchemaEntry<SV>> | undefined,\n action: 'send' | 'receive'\n ) => {\n if (!collection) {\n return;\n }\n\n Object.entries(collection).forEach(([messageKey, candidate]) => {\n if (\n !candidate ||\n typeof candidate !== 'object' ||\n Array.isArray(candidate) ||\n !('shape' in candidate)\n ) {\n return;\n }\n\n const entry = candidate as EventSchemaEntry<SV>;\n\n // Determine which channels to use\n const channelNames: string[] = entry.channel\n ? [entry.channel]\n : entry.channels && entry.channels.length > 0\n ? entry.channels\n : [messageKey];\n\n const messageName =\n entry.operation ?? entry.operations?.[0] ?? messageKey;\n\n // Create operations for all specified channels\n channelNames.forEach((channelName) => {\n const operationKey = `${action}-${channelName}-${messageName}`;\n\n const operation: OperationObject = {\n action,\n channel: {\n $ref: `#/channels/${pointerSegment(channelName)}`\n } as ReferenceObject,\n messages: [\n {\n $ref: `#/channels/${pointerSegment(channelName)}/messages/${pointerSegment(messageName)}`\n } as ReferenceObject\n ]\n };\n\n operations[operationKey] = operation;\n });\n });\n };\n\n addOperationsForCollection(eventSchemas.clientMessages, 'receive');\n addOperationsForCollection(eventSchemas.serverMessages, 'send');\n\n const { title, version, description } = options ?? {};\n\n const asyncApiDocument: AsyncApiDocument = {\n asyncapi: '3.0.0',\n info: {\n title: title || process.env.API_TITLE || 'Forklaunch WebSocket API',\n version: version || '1.0.0',\n ...(description ? { description } : {})\n },\n ...(options?.id ? { id: options.id } : {}),\n ...(options?.defaultContentType\n ? { defaultContentType: options.defaultContentType }\n : {}),\n ...(Object.keys(channels).length > 0 ? { channels } : {}),\n ...(Object.keys(operations).length > 0 ? { operations } : {})\n };\n\n return asyncApiDocument;\n}\n","import {\n AnySchemaValidator,\n IdiomaticSchema,\n prettyPrintParseErrors,\n SchemaValidator\n} from '@forklaunch/validator';\n\nimport { EventSchema, EventSchemaEntry } from './types/eventSchema.types';\n\ntype SchemaRecord<SV extends AnySchemaValidator> =\n Record<string, EventSchemaEntry<SV>> | undefined;\n\nexport function buildUnionSchema<SV extends AnySchemaValidator>(\n schemaValidator: SchemaValidator,\n record: SchemaRecord<SV>\n): IdiomaticSchema<SV> | undefined {\n if (!record) {\n return undefined;\n }\n\n const schemas = Object.values(record)\n .filter((entry): entry is EventSchemaEntry<SV> => Boolean(entry))\n .map((entry) => entry.shape);\n\n if (schemas.length === 0) {\n return undefined;\n }\n\n if (schemas.length === 1) {\n return schemas[0];\n }\n\n return schemaValidator.union(schemas) as IdiomaticSchema<SV>;\n}\n\nexport function parseSchemaValue<SV extends AnySchemaValidator>(\n schemaValidator: SchemaValidator,\n value: unknown,\n schema: IdiomaticSchema<SV> | undefined,\n context: string\n): unknown {\n if (schema === undefined) {\n return value;\n }\n\n const result = schemaValidator.parse(schema, value);\n if (result.ok) {\n return result.value;\n }\n\n const errors = 'errors' in result ? result.errors || [] : [];\n throw new Error(prettyPrintParseErrors(errors, context));\n}\n\nexport function encodeSchemaValue<SV extends AnySchemaValidator>(\n schemaValidator: SchemaValidator,\n value: unknown,\n schema: IdiomaticSchema<SV> | undefined,\n context: string\n): unknown {\n const validated = parseSchemaValue(schemaValidator, value, schema, context);\n\n if (\n Buffer.isBuffer(validated) ||\n validated instanceof ArrayBuffer ||\n ArrayBuffer.isView(validated)\n ) {\n if (Buffer.isBuffer(validated)) {\n return validated;\n }\n\n if (validated instanceof ArrayBuffer) {\n return Buffer.from(validated);\n }\n\n const view = validated as {\n buffer: ArrayBuffer;\n byteOffset: number;\n byteLength: number;\n };\n const typed = new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n return Buffer.from(typed);\n }\n\n if (typeof validated === 'string') {\n return Buffer.from(validated, 'utf-8');\n }\n\n if (validated === null || validated === undefined) {\n return validated;\n }\n\n return Buffer.from(JSON.stringify(validated), 'utf-8');\n}\n\nexport function decodeSchemaValue<SV extends AnySchemaValidator>(\n schemaValidator: SchemaValidator,\n data: unknown,\n schema: IdiomaticSchema<SV> | undefined,\n context: string\n): unknown {\n let decoded: string;\n let parsed: unknown;\n\n if (Buffer.isBuffer(data)) {\n decoded = data.toString('utf-8');\n } else if (data instanceof ArrayBuffer) {\n decoded = Buffer.from(data).toString('utf-8');\n } else if (ArrayBuffer.isView(data)) {\n const view = data as {\n buffer: ArrayBuffer;\n byteOffset: number;\n byteLength: number;\n };\n decoded = Buffer.from(\n view.buffer,\n view.byteOffset,\n view.byteLength\n ).toString('utf-8');\n } else if (typeof data === 'string') {\n decoded = data;\n } else {\n parsed = data;\n return parseSchemaValue(schemaValidator, parsed, schema, context);\n }\n\n try {\n parsed = JSON.parse(decoded);\n } catch {\n parsed = decoded;\n }\n\n return parseSchemaValue(schemaValidator, parsed, schema, context);\n}\n\nexport function normalizeEncodedValue(\n encoded: unknown,\n context: string,\n allowUndefined = false\n): Buffer | undefined {\n if (encoded === null || encoded === undefined) {\n if (allowUndefined) {\n return undefined;\n }\n throw new Error(`Invalid ${context}`);\n }\n\n if (Buffer.isBuffer(encoded)) {\n return encoded;\n }\n\n if (encoded instanceof ArrayBuffer) {\n return Buffer.from(encoded);\n }\n\n if (ArrayBuffer.isView(encoded)) {\n const view = encoded as ArrayBufferView;\n return Buffer.from(view.buffer, view.byteOffset, view.byteLength);\n }\n\n if (typeof encoded === 'string') {\n return Buffer.from(encoded, 'utf-8');\n }\n\n if (\n typeof encoded === 'number' ||\n typeof encoded === 'boolean' ||\n typeof encoded === 'bigint'\n ) {\n return Buffer.from(JSON.stringify(encoded), 'utf-8');\n }\n\n if (typeof encoded === 'object') {\n return Buffer.from(JSON.stringify(encoded), 'utf-8');\n }\n\n throw new Error(`Unsupported payload type for ${context}`);\n}\n\nexport function createWebSocketSchemas<\n SV extends AnySchemaValidator,\n ES extends EventSchema<SV>\n>(schemaValidator: SchemaValidator, eventSchemas: ES) {\n const clientMessagesSchema = buildUnionSchema<SV>(\n schemaValidator,\n eventSchemas.clientMessages\n );\n const serverMessagesSchema = buildUnionSchema<SV>(\n schemaValidator,\n eventSchemas.serverMessages\n );\n const errorsSchema = buildUnionSchema<SV>(\n schemaValidator,\n eventSchemas.errors\n );\n const pingSchema = eventSchemas.ping?.shape;\n const pongSchema = eventSchemas.pong?.shape;\n const closeReasonSchema = eventSchemas.closeReason\n ? buildUnionSchema<SV>(schemaValidator, eventSchemas.closeReason)\n : undefined;\n\n return {\n clientMessagesSchema,\n serverMessagesSchema,\n errorsSchema,\n pingSchema,\n pongSchema,\n closeReasonSchema\n };\n}\n"],"mappings":"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","names":["version"]}
package/lib/ws/index.mjs CHANGED
@@ -1,6 +1,87 @@
1
1
  // src/ws/asyncApiV3Generator/asyncApiV3Generator.ts
2
+ function pointerSegment(value) {
3
+ return encodeURIComponent(
4
+ value.replace(/~/g, "~0").replace(/\//g, "~1")
5
+ ).replace(
6
+ /[!'()*]/g,
7
+ (character) => `%${character.charCodeAt(0).toString(16).toUpperCase()}`
8
+ );
9
+ }
10
+ function payloadSchema(schema, depth = 0, rootDialect) {
11
+ if (depth > 64) throw new Error("AsyncAPI schema nesting exceeds 64 levels");
12
+ if (typeof schema === "boolean") return schema ? {} : { not: {} };
13
+ if (!schema || typeof schema !== "object" || Array.isArray(schema))
14
+ return schema;
15
+ const prototype = Object.getPrototypeOf(schema);
16
+ if (prototype !== null && prototype.constructor?.name !== "Object")
17
+ return schema;
18
+ const output = { ...schema };
19
+ const dialect = rootDialect ?? (typeof output.$schema === "string" ? output.$schema : "");
20
+ const draft4 = dialect.includes("/draft-04/");
21
+ const draft6 = dialect.includes("/draft-06/");
22
+ for (const [key, value] of Object.entries(output)) {
23
+ if (draft4 && ["const", "contains", "propertyNames"].includes(key) || (draft4 || draft6) && [
24
+ "if",
25
+ "then",
26
+ "else",
27
+ "dependentSchemas",
28
+ "prefixItems",
29
+ "unevaluatedProperties",
30
+ "unevaluatedItems",
31
+ "contentSchema"
32
+ ].includes(key))
33
+ continue;
34
+ if (["additionalProperties", "additionalItems"].includes(key) && typeof value === "boolean")
35
+ continue;
36
+ if ([
37
+ "properties",
38
+ "patternProperties",
39
+ "dependentSchemas",
40
+ "dependencies",
41
+ "$defs",
42
+ "definitions"
43
+ ].includes(key) && value && typeof value === "object" && !Array.isArray(value)) {
44
+ output[key] = Object.fromEntries(
45
+ Object.entries(value).map(([name, child]) => [
46
+ name,
47
+ payloadSchema(child, depth + 1, dialect)
48
+ ])
49
+ );
50
+ } else if (["allOf", "anyOf", "oneOf", "prefixItems", "items"].includes(key) && Array.isArray(value)) {
51
+ output[key] = value.map(
52
+ (child) => payloadSchema(child, depth + 1, dialect)
53
+ );
54
+ } else if ([
55
+ "additionalProperties",
56
+ "additionalItems",
57
+ "unevaluatedProperties",
58
+ "unevaluatedItems",
59
+ "contentSchema",
60
+ "contains",
61
+ "not",
62
+ "if",
63
+ "then",
64
+ "else",
65
+ "propertyNames",
66
+ "items"
67
+ ].includes(key)) {
68
+ output[key] = payloadSchema(value, depth + 1, dialect);
69
+ }
70
+ }
71
+ return output;
72
+ }
73
+ function messagePayload(schema) {
74
+ const dialect = schema && typeof schema === "object" && "$schema" in schema ? schema.$schema : void 0;
75
+ const version = typeof dialect === "string" ? ["draft-04", "draft-06", "2019-09", "2020-12"].find(
76
+ (version2) => dialect.includes(version2)
77
+ ) : void 0;
78
+ return version ? {
79
+ schemaFormat: `application/schema+json;version=${version}`,
80
+ schema: payloadSchema(schema)
81
+ } : payloadSchema(schema);
82
+ }
2
83
  function generateAsyncApi(eventSchemas, options) {
3
- const channels = {};
84
+ const channels = /* @__PURE__ */ Object.create(null);
4
85
  const appendMessageToChannel = (collection) => {
5
86
  if (!collection) {
6
87
  return;
@@ -14,19 +95,24 @@ function generateAsyncApi(eventSchemas, options) {
14
95
  const channelNames = entry.channel ? [entry.channel] : entry.channels && entry.channels.length > 0 ? entry.channels : [messageKey];
15
96
  const messageName = entry.operation ?? entry.operations?.[0] ?? messageKey;
16
97
  channelNames.forEach((channelName) => {
98
+ if (!channelName || /[?#]/.test(channelName)) {
99
+ throw new Error(
100
+ "AsyncAPI channel addresses must be nonempty and exclude query/fragment delimiters"
101
+ );
102
+ }
17
103
  const existingChannel = channels[channelName];
18
104
  if (!existingChannel || "$ref" in existingChannel) {
19
105
  channels[channelName] = {
20
106
  address: channelName,
21
- messages: {}
107
+ messages: /* @__PURE__ */ Object.create(null)
22
108
  };
23
109
  }
24
110
  const channelEntry = channels[channelName];
25
- channelEntry.messages = channelEntry.messages ?? {};
111
+ channelEntry.messages = channelEntry.messages ?? /* @__PURE__ */ Object.create(null);
26
112
  const messages = channelEntry.messages;
27
113
  const message = {
28
114
  name: messageName,
29
- payload: schema
115
+ payload: messagePayload(schema)
30
116
  };
31
117
  messages[messageName] = message;
32
118
  });
@@ -35,7 +121,7 @@ function generateAsyncApi(eventSchemas, options) {
35
121
  appendMessageToChannel(eventSchemas.clientMessages);
36
122
  appendMessageToChannel(eventSchemas.serverMessages);
37
123
  appendMessageToChannel(eventSchemas.errors);
38
- const operations = {};
124
+ const operations = /* @__PURE__ */ Object.create(null);
39
125
  const addOperationsForCollection = (collection, action) => {
40
126
  if (!collection) {
41
127
  return;
@@ -52,11 +138,11 @@ function generateAsyncApi(eventSchemas, options) {
52
138
  const operation = {
53
139
  action,
54
140
  channel: {
55
- $ref: `#/channels/${channelName}`
141
+ $ref: `#/channels/${pointerSegment(channelName)}`
56
142
  },
57
143
  messages: [
58
144
  {
59
- $ref: `#/channels/${channelName}/messages/${messageName}`
145
+ $ref: `#/channels/${pointerSegment(channelName)}/messages/${pointerSegment(messageName)}`
60
146
  }
61
147
  ]
62
148
  };
@@ -100,7 +186,7 @@ function buildUnionSchema(schemaValidator, record) {
100
186
  return schemaValidator.union(schemas);
101
187
  }
102
188
  function parseSchemaValue(schemaValidator, value, schema, context) {
103
- if (!schema) {
189
+ if (schema === void 0) {
104
190
  return value;
105
191
  }
106
192
  const result = schemaValidator.parse(schema, value);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ws/asyncApiV3Generator/asyncApiV3Generator.ts","../../src/ws/webSocketLike.ts"],"sourcesContent":["import type {\n AsyncAPIObject,\n ChannelObject,\n ChannelsObject,\n MessageObject,\n MessagesObject,\n OperationObject,\n OperationsObject,\n ReferenceObject\n} from '@asyncapi/parser/esm/spec-types/v3';\n\nimport type { AnySchemaValidator } from '@forklaunch/validator';\n\nimport { EventSchema, EventSchemaEntry } from '../types/eventSchema.types';\n\nexport type AsyncApiDocument = AsyncAPIObject;\n\nexport function generateAsyncApi<SV extends AnySchemaValidator>(\n eventSchemas: EventSchema<SV>,\n options?: {\n title?: string;\n version?: string;\n description?: string;\n id?: AsyncApiDocument['id'];\n defaultContentType?: AsyncApiDocument['defaultContentType'];\n }\n): AsyncApiDocument {\n const channels: ChannelsObject = {};\n\n const appendMessageToChannel = (\n collection?: Record<string, EventSchemaEntry<SV>>\n ) => {\n if (!collection) {\n return;\n }\n\n Object.entries(collection).forEach(([messageKey, candidate]) => {\n if (\n !candidate ||\n typeof candidate !== 'object' ||\n Array.isArray(candidate) ||\n !('shape' in candidate)\n ) {\n return;\n }\n\n const entry = candidate as EventSchemaEntry<SV>;\n const schema = entry.shape;\n\n // Determine which channels to use\n const channelNames: string[] = entry.channel\n ? [entry.channel]\n : entry.channels && entry.channels.length > 0\n ? entry.channels\n : [messageKey];\n\n const messageName =\n entry.operation ?? entry.operations?.[0] ?? messageKey;\n\n // Add message to all specified channels\n channelNames.forEach((channelName) => {\n const existingChannel = channels[channelName];\n if (!existingChannel || '$ref' in existingChannel) {\n channels[channelName] = {\n address: channelName,\n messages: {}\n };\n }\n\n const channelEntry = channels[channelName] as ChannelObject;\n channelEntry.messages = (channelEntry.messages ?? {}) as MessagesObject;\n const messages = channelEntry.messages as MessagesObject;\n\n const message: MessageObject = {\n name: messageName,\n payload: schema\n };\n\n messages[messageName] = message;\n });\n });\n };\n\n appendMessageToChannel(eventSchemas.clientMessages);\n appendMessageToChannel(eventSchemas.serverMessages);\n appendMessageToChannel(eventSchemas.errors);\n\n const operations: OperationsObject = {};\n\n const addOperationsForCollection = (\n collection: Record<string, EventSchemaEntry<SV>> | undefined,\n action: 'send' | 'receive'\n ) => {\n if (!collection) {\n return;\n }\n\n Object.entries(collection).forEach(([messageKey, candidate]) => {\n if (\n !candidate ||\n typeof candidate !== 'object' ||\n Array.isArray(candidate) ||\n !('shape' in candidate)\n ) {\n return;\n }\n\n const entry = candidate as EventSchemaEntry<SV>;\n\n // Determine which channels to use\n const channelNames: string[] = entry.channel\n ? [entry.channel]\n : entry.channels && entry.channels.length > 0\n ? entry.channels\n : [messageKey];\n\n const messageName =\n entry.operation ?? entry.operations?.[0] ?? messageKey;\n\n // Create operations for all specified channels\n channelNames.forEach((channelName) => {\n const operationKey = `${action}-${channelName}-${messageName}`;\n\n const operation: OperationObject = {\n action,\n channel: {\n $ref: `#/channels/${channelName}`\n } as ReferenceObject,\n messages: [\n {\n $ref: `#/channels/${channelName}/messages/${messageName}`\n } as ReferenceObject\n ]\n };\n\n operations[operationKey] = operation;\n });\n });\n };\n\n addOperationsForCollection(eventSchemas.clientMessages, 'receive');\n addOperationsForCollection(eventSchemas.serverMessages, 'send');\n\n const { title, version, description } = options ?? {};\n\n const asyncApiDocument: AsyncApiDocument = {\n asyncapi: '3.0.0',\n info: {\n title: title || process.env.API_TITLE || 'Forklaunch WebSocket API',\n version: version || '1.0.0',\n ...(description ? { description } : {})\n },\n ...(options?.id ? { id: options.id } : {}),\n ...(options?.defaultContentType\n ? { defaultContentType: options.defaultContentType }\n : {}),\n ...(Object.keys(channels).length > 0 ? { channels } : {}),\n ...(Object.keys(operations).length > 0 ? { operations } : {})\n };\n\n return asyncApiDocument;\n}\n","import {\n AnySchemaValidator,\n IdiomaticSchema,\n prettyPrintParseErrors,\n SchemaValidator\n} from '@forklaunch/validator';\n\nimport { EventSchema, EventSchemaEntry } from './types/eventSchema.types';\n\ntype SchemaRecord<SV extends AnySchemaValidator> =\n Record<string, EventSchemaEntry<SV>> | undefined;\n\nexport function buildUnionSchema<SV extends AnySchemaValidator>(\n schemaValidator: SchemaValidator,\n record: SchemaRecord<SV>\n): IdiomaticSchema<SV> | undefined {\n if (!record) {\n return undefined;\n }\n\n const schemas = Object.values(record)\n .filter((entry): entry is EventSchemaEntry<SV> => Boolean(entry))\n .map((entry) => entry.shape);\n\n if (schemas.length === 0) {\n return undefined;\n }\n\n if (schemas.length === 1) {\n return schemas[0];\n }\n\n return schemaValidator.union(schemas) as IdiomaticSchema<SV>;\n}\n\nexport function parseSchemaValue<SV extends AnySchemaValidator>(\n schemaValidator: SchemaValidator,\n value: unknown,\n schema: IdiomaticSchema<SV> | undefined,\n context: string\n): unknown {\n if (!schema) {\n return value;\n }\n\n const result = schemaValidator.parse(schema, value);\n if (result.ok) {\n return result.value;\n }\n\n const errors = 'errors' in result ? result.errors || [] : [];\n throw new Error(prettyPrintParseErrors(errors, context));\n}\n\nexport function encodeSchemaValue<SV extends AnySchemaValidator>(\n schemaValidator: SchemaValidator,\n value: unknown,\n schema: IdiomaticSchema<SV> | undefined,\n context: string\n): unknown {\n const validated = parseSchemaValue(schemaValidator, value, schema, context);\n\n if (\n Buffer.isBuffer(validated) ||\n validated instanceof ArrayBuffer ||\n ArrayBuffer.isView(validated)\n ) {\n if (Buffer.isBuffer(validated)) {\n return validated;\n }\n\n if (validated instanceof ArrayBuffer) {\n return Buffer.from(validated);\n }\n\n const view = validated as {\n buffer: ArrayBuffer;\n byteOffset: number;\n byteLength: number;\n };\n const typed = new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n return Buffer.from(typed);\n }\n\n if (typeof validated === 'string') {\n return Buffer.from(validated, 'utf-8');\n }\n\n if (validated === null || validated === undefined) {\n return validated;\n }\n\n return Buffer.from(JSON.stringify(validated), 'utf-8');\n}\n\nexport function decodeSchemaValue<SV extends AnySchemaValidator>(\n schemaValidator: SchemaValidator,\n data: unknown,\n schema: IdiomaticSchema<SV> | undefined,\n context: string\n): unknown {\n let decoded: string;\n let parsed: unknown;\n\n if (Buffer.isBuffer(data)) {\n decoded = data.toString('utf-8');\n } else if (data instanceof ArrayBuffer) {\n decoded = Buffer.from(data).toString('utf-8');\n } else if (ArrayBuffer.isView(data)) {\n const view = data as {\n buffer: ArrayBuffer;\n byteOffset: number;\n byteLength: number;\n };\n decoded = Buffer.from(\n view.buffer,\n view.byteOffset,\n view.byteLength\n ).toString('utf-8');\n } else if (typeof data === 'string') {\n decoded = data;\n } else {\n parsed = data;\n return parseSchemaValue(schemaValidator, parsed, schema, context);\n }\n\n try {\n parsed = JSON.parse(decoded);\n } catch {\n parsed = decoded;\n }\n\n return parseSchemaValue(schemaValidator, parsed, schema, context);\n}\n\nexport function normalizeEncodedValue(\n encoded: unknown,\n context: string,\n allowUndefined = false\n): Buffer | undefined {\n if (encoded === null || encoded === undefined) {\n if (allowUndefined) {\n return undefined;\n }\n throw new Error(`Invalid ${context}`);\n }\n\n if (Buffer.isBuffer(encoded)) {\n return encoded;\n }\n\n if (encoded instanceof ArrayBuffer) {\n return Buffer.from(encoded);\n }\n\n if (ArrayBuffer.isView(encoded)) {\n const view = encoded as ArrayBufferView;\n return Buffer.from(view.buffer, view.byteOffset, view.byteLength);\n }\n\n if (typeof encoded === 'string') {\n return Buffer.from(encoded, 'utf-8');\n }\n\n if (\n typeof encoded === 'number' ||\n typeof encoded === 'boolean' ||\n typeof encoded === 'bigint'\n ) {\n return Buffer.from(JSON.stringify(encoded), 'utf-8');\n }\n\n if (typeof encoded === 'object') {\n return Buffer.from(JSON.stringify(encoded), 'utf-8');\n }\n\n throw new Error(`Unsupported payload type for ${context}`);\n}\n\nexport function createWebSocketSchemas<\n SV extends AnySchemaValidator,\n ES extends EventSchema<SV>\n>(schemaValidator: SchemaValidator, eventSchemas: ES) {\n const clientMessagesSchema = buildUnionSchema<SV>(\n schemaValidator,\n eventSchemas.clientMessages\n );\n const serverMessagesSchema = buildUnionSchema<SV>(\n schemaValidator,\n eventSchemas.serverMessages\n );\n const errorsSchema = buildUnionSchema<SV>(\n schemaValidator,\n eventSchemas.errors\n );\n const pingSchema = eventSchemas.ping?.shape;\n const pongSchema = eventSchemas.pong?.shape;\n const closeReasonSchema = eventSchemas.closeReason\n ? buildUnionSchema<SV>(schemaValidator, eventSchemas.closeReason)\n : undefined;\n\n return {\n clientMessagesSchema,\n serverMessagesSchema,\n errorsSchema,\n pingSchema,\n pongSchema,\n closeReasonSchema\n };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/ws/asyncApiV3Generator/asyncApiV3Generator.ts","../../src/ws/webSocketLike.ts"],"sourcesContent":["import type {\n AsyncAPIObject,\n ChannelObject,\n ChannelsObject,\n MessageObject,\n MessagesObject,\n OperationObject,\n OperationsObject,\n ReferenceObject\n} from '@asyncapi/parser/esm/spec-types/v3';\n\nimport type { AnySchemaValidator } from '@forklaunch/validator';\n\nimport { EventSchema, EventSchemaEntry } from '../types/eventSchema.types';\n\nexport type AsyncApiDocument = AsyncAPIObject;\n\nfunction pointerSegment(value: string): string {\n return encodeURIComponent(\n value.replace(/~/g, '~0').replace(/\\//g, '~1')\n ).replace(\n /[!'()*]/g,\n (character) => `%${character.charCodeAt(0).toString(16).toUpperCase()}`\n );\n}\n\n// AsyncAPI's default Schema Object uses object-form schemas. Keep idiomatic\n// validator instances intact; normalize plain JSON Schema positions only.\nfunction payloadSchema(\n schema: unknown,\n depth = 0,\n rootDialect?: string\n): unknown {\n if (depth > 64) throw new Error('AsyncAPI schema nesting exceeds 64 levels');\n if (typeof schema === 'boolean') return schema ? {} : { not: {} };\n if (!schema || typeof schema !== 'object' || Array.isArray(schema))\n return schema;\n const prototype = Object.getPrototypeOf(schema);\n if (prototype !== null && prototype.constructor?.name !== 'Object')\n return schema;\n const output: Record<string, unknown> = { ...schema };\n const dialect =\n rootDialect ?? (typeof output.$schema === 'string' ? output.$schema : '');\n const draft4 = dialect.includes('/draft-04/');\n const draft6 = dialect.includes('/draft-06/');\n for (const [key, value] of Object.entries(output)) {\n if (\n (draft4 && ['const', 'contains', 'propertyNames'].includes(key)) ||\n ((draft4 || draft6) &&\n [\n 'if',\n 'then',\n 'else',\n 'dependentSchemas',\n 'prefixItems',\n 'unevaluatedProperties',\n 'unevaluatedItems',\n 'contentSchema'\n ].includes(key))\n )\n continue;\n if (\n ['additionalProperties', 'additionalItems'].includes(key) &&\n typeof value === 'boolean'\n )\n continue;\n if (\n [\n 'properties',\n 'patternProperties',\n 'dependentSchemas',\n 'dependencies',\n '$defs',\n 'definitions'\n ].includes(key) &&\n value &&\n typeof value === 'object' &&\n !Array.isArray(value)\n ) {\n output[key] = Object.fromEntries(\n Object.entries(value).map(([name, child]) => [\n name,\n payloadSchema(child, depth + 1, dialect)\n ])\n );\n } else if (\n ['allOf', 'anyOf', 'oneOf', 'prefixItems', 'items'].includes(key) &&\n Array.isArray(value)\n ) {\n output[key] = value.map((child) =>\n payloadSchema(child, depth + 1, dialect)\n );\n } else if (\n [\n 'additionalProperties',\n 'additionalItems',\n 'unevaluatedProperties',\n 'unevaluatedItems',\n 'contentSchema',\n 'contains',\n 'not',\n 'if',\n 'then',\n 'else',\n 'propertyNames',\n 'items'\n ].includes(key)\n ) {\n output[key] = payloadSchema(value, depth + 1, dialect);\n }\n }\n return output;\n}\n\nfunction messagePayload(schema: unknown): MessageObject['payload'] {\n const dialect =\n schema && typeof schema === 'object' && '$schema' in schema\n ? schema.$schema\n : undefined;\n const version =\n typeof dialect === 'string'\n ? ['draft-04', 'draft-06', '2019-09', '2020-12'].find((version) =>\n dialect.includes(version)\n )\n : undefined;\n // The default AsyncAPI Schema Object follows Draft 7. Preserve other dialects\n // through a Multi Format Schema Object instead of changing their semantics.\n return (\n version\n ? {\n schemaFormat: `application/schema+json;version=${version}`,\n schema: payloadSchema(schema)\n }\n : payloadSchema(schema)\n ) as MessageObject['payload'];\n}\n\nexport function generateAsyncApi<SV extends AnySchemaValidator>(\n eventSchemas: EventSchema<SV>,\n options?: {\n title?: string;\n version?: string;\n description?: string;\n id?: AsyncApiDocument['id'];\n defaultContentType?: AsyncApiDocument['defaultContentType'];\n }\n): AsyncApiDocument {\n const channels: ChannelsObject = Object.create(null);\n\n const appendMessageToChannel = (\n collection?: Record<string, EventSchemaEntry<SV>>\n ) => {\n if (!collection) {\n return;\n }\n\n Object.entries(collection).forEach(([messageKey, candidate]) => {\n if (\n !candidate ||\n typeof candidate !== 'object' ||\n Array.isArray(candidate) ||\n !('shape' in candidate)\n ) {\n return;\n }\n\n const entry = candidate as EventSchemaEntry<SV>;\n const schema = entry.shape;\n\n // Determine which channels to use\n const channelNames: string[] = entry.channel\n ? [entry.channel]\n : entry.channels && entry.channels.length > 0\n ? entry.channels\n : [messageKey];\n\n const messageName =\n entry.operation ?? entry.operations?.[0] ?? messageKey;\n\n // Add message to all specified channels\n channelNames.forEach((channelName) => {\n if (!channelName || /[?#]/.test(channelName)) {\n throw new Error(\n 'AsyncAPI channel addresses must be nonempty and exclude query/fragment delimiters'\n );\n }\n const existingChannel = channels[channelName];\n if (!existingChannel || '$ref' in existingChannel) {\n channels[channelName] = {\n address: channelName,\n messages: Object.create(null)\n };\n }\n\n const channelEntry = channels[channelName] as ChannelObject;\n channelEntry.messages = (channelEntry.messages ??\n Object.create(null)) as MessagesObject;\n const messages = channelEntry.messages as MessagesObject;\n\n const message: MessageObject = {\n name: messageName,\n payload: messagePayload(schema)\n };\n\n messages[messageName] = message;\n });\n });\n };\n\n appendMessageToChannel(eventSchemas.clientMessages);\n appendMessageToChannel(eventSchemas.serverMessages);\n appendMessageToChannel(eventSchemas.errors);\n\n const operations: OperationsObject = Object.create(null);\n\n const addOperationsForCollection = (\n collection: Record<string, EventSchemaEntry<SV>> | undefined,\n action: 'send' | 'receive'\n ) => {\n if (!collection) {\n return;\n }\n\n Object.entries(collection).forEach(([messageKey, candidate]) => {\n if (\n !candidate ||\n typeof candidate !== 'object' ||\n Array.isArray(candidate) ||\n !('shape' in candidate)\n ) {\n return;\n }\n\n const entry = candidate as EventSchemaEntry<SV>;\n\n // Determine which channels to use\n const channelNames: string[] = entry.channel\n ? [entry.channel]\n : entry.channels && entry.channels.length > 0\n ? entry.channels\n : [messageKey];\n\n const messageName =\n entry.operation ?? entry.operations?.[0] ?? messageKey;\n\n // Create operations for all specified channels\n channelNames.forEach((channelName) => {\n const operationKey = `${action}-${channelName}-${messageName}`;\n\n const operation: OperationObject = {\n action,\n channel: {\n $ref: `#/channels/${pointerSegment(channelName)}`\n } as ReferenceObject,\n messages: [\n {\n $ref: `#/channels/${pointerSegment(channelName)}/messages/${pointerSegment(messageName)}`\n } as ReferenceObject\n ]\n };\n\n operations[operationKey] = operation;\n });\n });\n };\n\n addOperationsForCollection(eventSchemas.clientMessages, 'receive');\n addOperationsForCollection(eventSchemas.serverMessages, 'send');\n\n const { title, version, description } = options ?? {};\n\n const asyncApiDocument: AsyncApiDocument = {\n asyncapi: '3.0.0',\n info: {\n title: title || process.env.API_TITLE || 'Forklaunch WebSocket API',\n version: version || '1.0.0',\n ...(description ? { description } : {})\n },\n ...(options?.id ? { id: options.id } : {}),\n ...(options?.defaultContentType\n ? { defaultContentType: options.defaultContentType }\n : {}),\n ...(Object.keys(channels).length > 0 ? { channels } : {}),\n ...(Object.keys(operations).length > 0 ? { operations } : {})\n };\n\n return asyncApiDocument;\n}\n","import {\n AnySchemaValidator,\n IdiomaticSchema,\n prettyPrintParseErrors,\n SchemaValidator\n} from '@forklaunch/validator';\n\nimport { EventSchema, EventSchemaEntry } from './types/eventSchema.types';\n\ntype SchemaRecord<SV extends AnySchemaValidator> =\n Record<string, EventSchemaEntry<SV>> | undefined;\n\nexport function buildUnionSchema<SV extends AnySchemaValidator>(\n schemaValidator: SchemaValidator,\n record: SchemaRecord<SV>\n): IdiomaticSchema<SV> | undefined {\n if (!record) {\n return undefined;\n }\n\n const schemas = Object.values(record)\n .filter((entry): entry is EventSchemaEntry<SV> => Boolean(entry))\n .map((entry) => entry.shape);\n\n if (schemas.length === 0) {\n return undefined;\n }\n\n if (schemas.length === 1) {\n return schemas[0];\n }\n\n return schemaValidator.union(schemas) as IdiomaticSchema<SV>;\n}\n\nexport function parseSchemaValue<SV extends AnySchemaValidator>(\n schemaValidator: SchemaValidator,\n value: unknown,\n schema: IdiomaticSchema<SV> | undefined,\n context: string\n): unknown {\n if (schema === undefined) {\n return value;\n }\n\n const result = schemaValidator.parse(schema, value);\n if (result.ok) {\n return result.value;\n }\n\n const errors = 'errors' in result ? result.errors || [] : [];\n throw new Error(prettyPrintParseErrors(errors, context));\n}\n\nexport function encodeSchemaValue<SV extends AnySchemaValidator>(\n schemaValidator: SchemaValidator,\n value: unknown,\n schema: IdiomaticSchema<SV> | undefined,\n context: string\n): unknown {\n const validated = parseSchemaValue(schemaValidator, value, schema, context);\n\n if (\n Buffer.isBuffer(validated) ||\n validated instanceof ArrayBuffer ||\n ArrayBuffer.isView(validated)\n ) {\n if (Buffer.isBuffer(validated)) {\n return validated;\n }\n\n if (validated instanceof ArrayBuffer) {\n return Buffer.from(validated);\n }\n\n const view = validated as {\n buffer: ArrayBuffer;\n byteOffset: number;\n byteLength: number;\n };\n const typed = new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n return Buffer.from(typed);\n }\n\n if (typeof validated === 'string') {\n return Buffer.from(validated, 'utf-8');\n }\n\n if (validated === null || validated === undefined) {\n return validated;\n }\n\n return Buffer.from(JSON.stringify(validated), 'utf-8');\n}\n\nexport function decodeSchemaValue<SV extends AnySchemaValidator>(\n schemaValidator: SchemaValidator,\n data: unknown,\n schema: IdiomaticSchema<SV> | undefined,\n context: string\n): unknown {\n let decoded: string;\n let parsed: unknown;\n\n if (Buffer.isBuffer(data)) {\n decoded = data.toString('utf-8');\n } else if (data instanceof ArrayBuffer) {\n decoded = Buffer.from(data).toString('utf-8');\n } else if (ArrayBuffer.isView(data)) {\n const view = data as {\n buffer: ArrayBuffer;\n byteOffset: number;\n byteLength: number;\n };\n decoded = Buffer.from(\n view.buffer,\n view.byteOffset,\n view.byteLength\n ).toString('utf-8');\n } else if (typeof data === 'string') {\n decoded = data;\n } else {\n parsed = data;\n return parseSchemaValue(schemaValidator, parsed, schema, context);\n }\n\n try {\n parsed = JSON.parse(decoded);\n } catch {\n parsed = decoded;\n }\n\n return parseSchemaValue(schemaValidator, parsed, schema, context);\n}\n\nexport function normalizeEncodedValue(\n encoded: unknown,\n context: string,\n allowUndefined = false\n): Buffer | undefined {\n if (encoded === null || encoded === undefined) {\n if (allowUndefined) {\n return undefined;\n }\n throw new Error(`Invalid ${context}`);\n }\n\n if (Buffer.isBuffer(encoded)) {\n return encoded;\n }\n\n if (encoded instanceof ArrayBuffer) {\n return Buffer.from(encoded);\n }\n\n if (ArrayBuffer.isView(encoded)) {\n const view = encoded as ArrayBufferView;\n return Buffer.from(view.buffer, view.byteOffset, view.byteLength);\n }\n\n if (typeof encoded === 'string') {\n return Buffer.from(encoded, 'utf-8');\n }\n\n if (\n typeof encoded === 'number' ||\n typeof encoded === 'boolean' ||\n typeof encoded === 'bigint'\n ) {\n return Buffer.from(JSON.stringify(encoded), 'utf-8');\n }\n\n if (typeof encoded === 'object') {\n return Buffer.from(JSON.stringify(encoded), 'utf-8');\n }\n\n throw new Error(`Unsupported payload type for ${context}`);\n}\n\nexport function createWebSocketSchemas<\n SV extends AnySchemaValidator,\n ES extends EventSchema<SV>\n>(schemaValidator: SchemaValidator, eventSchemas: ES) {\n const clientMessagesSchema = buildUnionSchema<SV>(\n schemaValidator,\n eventSchemas.clientMessages\n );\n const serverMessagesSchema = buildUnionSchema<SV>(\n schemaValidator,\n eventSchemas.serverMessages\n );\n const errorsSchema = buildUnionSchema<SV>(\n schemaValidator,\n eventSchemas.errors\n );\n const pingSchema = eventSchemas.ping?.shape;\n const pongSchema = eventSchemas.pong?.shape;\n const closeReasonSchema = eventSchemas.closeReason\n ? buildUnionSchema<SV>(schemaValidator, eventSchemas.closeReason)\n : undefined;\n\n return {\n clientMessagesSchema,\n serverMessagesSchema,\n errorsSchema,\n pingSchema,\n pongSchema,\n closeReasonSchema\n };\n}\n"],"mappings":"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","names":["version"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forklaunch/core",
3
- "version": "3.2.1",
3
+ "version": "3.3.0",
4
4
  "description": "forklaunch-js core package. Contains useful building blocks.",
5
5
  "homepage": "https://github.com/forklaunch/forklaunch-js#readme",
6
6
  "bugs": {
@@ -86,7 +86,9 @@
86
86
  },
87
87
  "dependencies": {
88
88
  "@asyncapi/parser": "^3.6.6",
89
+ "@forklaunch/common": "^1.2.32",
89
90
  "@forklaunch/opentelemetry-instrumentation-hyper-express": "0.0.5",
91
+ "@forklaunch/validator": "^1.3.0",
90
92
  "@mikro-orm/core": "7.2.5",
91
93
  "@mikro-orm/mongodb": "7.2.5",
92
94
  "@opentelemetry/api": "^1.9.1",
@@ -113,9 +115,7 @@
113
115
  "pino-pretty": "^13.2.0",
114
116
  "redis": "^6.3.0",
115
117
  "uuid": "^14.0.3",
116
- "zod": "^4.6.7",
117
- "@forklaunch/common": "^1.2.32",
118
- "@forklaunch/validator": "^1.2.33"
118
+ "zod": "^4.6.7"
119
119
  },
120
120
  "devDependencies": {
121
121
  "@eslint/js": "^10.0.1",