@mionjs/core 0.8.0-alpha.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 (136) hide show
  1. package/.dist/cjs/index.cjs +245 -0
  2. package/.dist/cjs/index.cjs.map +1 -0
  3. package/.dist/cjs/index.d.ts +21 -0
  4. package/.dist/cjs/package.json +1 -0
  5. package/.dist/cjs/src/binary/bodyDeserializer.cjs +54 -0
  6. package/.dist/cjs/src/binary/bodyDeserializer.cjs.map +1 -0
  7. package/.dist/cjs/src/binary/bodyDeserializer.d.ts +5 -0
  8. package/.dist/cjs/src/binary/bodySerializer.cjs +49 -0
  9. package/.dist/cjs/src/binary/bodySerializer.cjs.map +1 -0
  10. package/.dist/cjs/src/binary/bodySerializer.d.ts +6 -0
  11. package/.dist/cjs/src/binary/dataView.cjs +212 -0
  12. package/.dist/cjs/src/binary/dataView.cjs.map +1 -0
  13. package/.dist/cjs/src/binary/dataView.d.ts +16 -0
  14. package/.dist/cjs/src/constants.cjs +84 -0
  15. package/.dist/cjs/src/constants.cjs.map +1 -0
  16. package/.dist/cjs/src/constants.d.ts +50 -0
  17. package/.dist/cjs/src/errors.cjs +170 -0
  18. package/.dist/cjs/src/errors.cjs.map +1 -0
  19. package/.dist/cjs/src/errors.d.ts +24 -0
  20. package/.dist/cjs/src/friendlyErrors.cjs +235 -0
  21. package/.dist/cjs/src/friendlyErrors.cjs.map +1 -0
  22. package/.dist/cjs/src/friendlyErrors.d.ts +4 -0
  23. package/.dist/cjs/src/headers.cjs +11 -0
  24. package/.dist/cjs/src/headers.cjs.map +1 -0
  25. package/.dist/cjs/src/headers.d.ts +12 -0
  26. package/.dist/cjs/src/jit/jitUtils.cjs +173 -0
  27. package/.dist/cjs/src/jit/jitUtils.cjs.map +1 -0
  28. package/.dist/cjs/src/jit/jitUtils.d.ts +30 -0
  29. package/.dist/cjs/src/pureFns/pureFn.cjs +80 -0
  30. package/.dist/cjs/src/pureFns/pureFn.cjs.map +1 -0
  31. package/.dist/cjs/src/pureFns/pureFn.d.ts +2 -0
  32. package/.dist/cjs/src/pureFns/pureServerFn.cjs +20 -0
  33. package/.dist/cjs/src/pureFns/pureServerFn.cjs.map +1 -0
  34. package/.dist/cjs/src/pureFns/pureServerFn.d.ts +4 -0
  35. package/.dist/cjs/src/pureFns/quickHash.cjs +62 -0
  36. package/.dist/cjs/src/pureFns/quickHash.cjs.map +1 -0
  37. package/.dist/cjs/src/pureFns/quickHash.d.ts +7 -0
  38. package/.dist/cjs/src/pureFns/restoreJitFns.cjs +88 -0
  39. package/.dist/cjs/src/pureFns/restoreJitFns.cjs.map +1 -0
  40. package/.dist/cjs/src/pureFns/restoreJitFns.d.ts +3 -0
  41. package/.dist/cjs/src/routerUtils.cjs +209 -0
  42. package/.dist/cjs/src/routerUtils.cjs.map +1 -0
  43. package/.dist/cjs/src/routerUtils.d.ts +24 -0
  44. package/.dist/cjs/src/types/formats/formatBrands.types.cjs +45 -0
  45. package/.dist/cjs/src/types/formats/formatBrands.types.cjs.map +1 -0
  46. package/.dist/cjs/src/types/formats/formatBrands.types.d.ts +45 -0
  47. package/.dist/cjs/src/types/formats/formats.types.cjs +27 -0
  48. package/.dist/cjs/src/types/formats/formats.types.cjs.map +1 -0
  49. package/.dist/cjs/src/types/formats/formats.types.d.ts +37 -0
  50. package/.dist/cjs/src/types/formats/formatsParams.types.cjs +60 -0
  51. package/.dist/cjs/src/types/formats/formatsParams.types.cjs.map +1 -0
  52. package/.dist/cjs/src/types/formats/formatsParams.types.d.ts +234 -0
  53. package/.dist/cjs/src/types/formats/friendlyErrors.types.cjs +53 -0
  54. package/.dist/cjs/src/types/formats/friendlyErrors.types.cjs.map +1 -0
  55. package/.dist/cjs/src/types/formats/friendlyErrors.types.d.ts +71 -0
  56. package/.dist/cjs/src/types/general.types.cjs +145 -0
  57. package/.dist/cjs/src/types/general.types.cjs.map +1 -0
  58. package/.dist/cjs/src/types/general.types.d.ts +246 -0
  59. package/.dist/cjs/src/types/method.types.cjs +26 -0
  60. package/.dist/cjs/src/types/method.types.cjs.map +1 -0
  61. package/.dist/cjs/src/types/method.types.d.ts +60 -0
  62. package/.dist/cjs/src/types/pureFunctions.types.cjs +39 -0
  63. package/.dist/cjs/src/types/pureFunctions.types.cjs.map +1 -0
  64. package/.dist/cjs/src/types/pureFunctions.types.d.ts +75 -0
  65. package/.dist/cjs/src/utils.cjs +47 -0
  66. package/.dist/cjs/src/utils.cjs.map +1 -0
  67. package/.dist/cjs/src/utils.d.ts +9 -0
  68. package/.dist/esm/index.d.ts +21 -0
  69. package/.dist/esm/index.js +245 -0
  70. package/.dist/esm/index.js.map +1 -0
  71. package/.dist/esm/src/binary/bodyDeserializer.d.ts +5 -0
  72. package/.dist/esm/src/binary/bodyDeserializer.js +54 -0
  73. package/.dist/esm/src/binary/bodyDeserializer.js.map +1 -0
  74. package/.dist/esm/src/binary/bodySerializer.d.ts +6 -0
  75. package/.dist/esm/src/binary/bodySerializer.js +49 -0
  76. package/.dist/esm/src/binary/bodySerializer.js.map +1 -0
  77. package/.dist/esm/src/binary/dataView.d.ts +16 -0
  78. package/.dist/esm/src/binary/dataView.js +212 -0
  79. package/.dist/esm/src/binary/dataView.js.map +1 -0
  80. package/.dist/esm/src/constants.d.ts +50 -0
  81. package/.dist/esm/src/constants.js +84 -0
  82. package/.dist/esm/src/constants.js.map +1 -0
  83. package/.dist/esm/src/errors.d.ts +24 -0
  84. package/.dist/esm/src/errors.js +170 -0
  85. package/.dist/esm/src/errors.js.map +1 -0
  86. package/.dist/esm/src/friendlyErrors.d.ts +4 -0
  87. package/.dist/esm/src/friendlyErrors.js +235 -0
  88. package/.dist/esm/src/friendlyErrors.js.map +1 -0
  89. package/.dist/esm/src/headers.d.ts +12 -0
  90. package/.dist/esm/src/headers.js +11 -0
  91. package/.dist/esm/src/headers.js.map +1 -0
  92. package/.dist/esm/src/jit/jitUtils.d.ts +30 -0
  93. package/.dist/esm/src/jit/jitUtils.js +173 -0
  94. package/.dist/esm/src/jit/jitUtils.js.map +1 -0
  95. package/.dist/esm/src/pureFns/pureFn.d.ts +2 -0
  96. package/.dist/esm/src/pureFns/pureFn.js +80 -0
  97. package/.dist/esm/src/pureFns/pureFn.js.map +1 -0
  98. package/.dist/esm/src/pureFns/pureServerFn.d.ts +4 -0
  99. package/.dist/esm/src/pureFns/pureServerFn.js +20 -0
  100. package/.dist/esm/src/pureFns/pureServerFn.js.map +1 -0
  101. package/.dist/esm/src/pureFns/quickHash.d.ts +7 -0
  102. package/.dist/esm/src/pureFns/quickHash.js +62 -0
  103. package/.dist/esm/src/pureFns/quickHash.js.map +1 -0
  104. package/.dist/esm/src/pureFns/restoreJitFns.d.ts +3 -0
  105. package/.dist/esm/src/pureFns/restoreJitFns.js +88 -0
  106. package/.dist/esm/src/pureFns/restoreJitFns.js.map +1 -0
  107. package/.dist/esm/src/routerUtils.d.ts +24 -0
  108. package/.dist/esm/src/routerUtils.js +209 -0
  109. package/.dist/esm/src/routerUtils.js.map +1 -0
  110. package/.dist/esm/src/types/formats/formatBrands.types.d.ts +45 -0
  111. package/.dist/esm/src/types/formats/formatBrands.types.js +45 -0
  112. package/.dist/esm/src/types/formats/formatBrands.types.js.map +1 -0
  113. package/.dist/esm/src/types/formats/formats.types.d.ts +37 -0
  114. package/.dist/esm/src/types/formats/formats.types.js +27 -0
  115. package/.dist/esm/src/types/formats/formats.types.js.map +1 -0
  116. package/.dist/esm/src/types/formats/formatsParams.types.d.ts +234 -0
  117. package/.dist/esm/src/types/formats/formatsParams.types.js +60 -0
  118. package/.dist/esm/src/types/formats/formatsParams.types.js.map +1 -0
  119. package/.dist/esm/src/types/formats/friendlyErrors.types.d.ts +71 -0
  120. package/.dist/esm/src/types/formats/friendlyErrors.types.js +53 -0
  121. package/.dist/esm/src/types/formats/friendlyErrors.types.js.map +1 -0
  122. package/.dist/esm/src/types/general.types.d.ts +246 -0
  123. package/.dist/esm/src/types/general.types.js +145 -0
  124. package/.dist/esm/src/types/general.types.js.map +1 -0
  125. package/.dist/esm/src/types/method.types.d.ts +60 -0
  126. package/.dist/esm/src/types/method.types.js +26 -0
  127. package/.dist/esm/src/types/method.types.js.map +1 -0
  128. package/.dist/esm/src/types/pureFunctions.types.d.ts +75 -0
  129. package/.dist/esm/src/types/pureFunctions.types.js +39 -0
  130. package/.dist/esm/src/types/pureFunctions.types.js.map +1 -0
  131. package/.dist/esm/src/utils.d.ts +9 -0
  132. package/.dist/esm/src/utils.js +47 -0
  133. package/.dist/esm/src/utils.js.map +1 -0
  134. package/LICENSE +21 -0
  135. package/README.md +32 -0
  136. package/package.json +58 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataView.cjs","sources":["../../../../src/binary/dataView.ts"],"sourcesContent":["/* ########\n * 2025 mion\n * Author: Ma-jerez\n * License: MIT\n * The software is provided \"as is\", without warranty of any kind.\n * ######## */\n\n// this code is based on from seqproto library https://github.com/oramasearch/seqproto\n\nimport type {StrictArrayBuffer, BinaryInput, DataViewSerializer, DataViewDeserializer} from '../types/general.types.ts';\n\nconst STR = 1;\nconst NUM = 2;\nconst POW_2_32 = 2 ** 32;\nconst LE = true; // always use little endian\n\n// ############## create serializer & deserializer ##############\n\nconst DEFAULT_OPTIONS = {\n maxPoolItems: 100,\n maxStrCacheLength: 64,\n maxCacheSize: 1000,\n bufferSize: 2 ** 24,\n averageResponseSizeMultiplier: 2,\n responseAverageSizes: new Map<string, number>(),\n stringBytesCache: new Map<string, Uint8Array>(),\n};\n\nexport type SerializationOptions = typeof DEFAULT_OPTIONS;\n\n// ############## DataView-based serializer & deserializer ##############\n// Uses byte-level precision (1-byte minimum unit) instead of 4-byte units\n\nconst textEncoder = new TextEncoder();\nconst textDecoder = new TextDecoder();\n\nlet opts = {...DEFAULT_OPTIONS};\n\nexport function setSerializationOptions(options: Partial<SerializationOptions>) {\n opts = {...opts, ...options};\n}\n\n/**\n * Creates a DataView-based serializer for binary serialization.\n * @param routeId - The route ID for buffer size calculation and tracking\n * @param workflowRouteIds - Optional array of route IDs for routesFlow requests.\n * When provided, buffer size is calculated by summing sizes for each route.\n */\nexport function createDataViewSerializer(routeId: string, workflowRouteIds?: string[]): DataViewSerializer {\n const size = calculateBufferSizeForRequest(routeId, workflowRouteIds);\n if (size >= POW_2_32) throw new Error('bufferSize option must be strictly less than 2 ** 32');\n return new DataViewSerializerImpl(routeId, size);\n}\n\n/** Creates a deserializer from ArrayBuffer or any typed array view (including Node.js Buffer) */\nexport function createDataViewDeserializer(routeId: string, input: BinaryInput): DataViewDeserializer {\n // Extract ArrayBuffer and offset/length from typed array views (Uint8Array, Buffer, etc.)\n if (ArrayBuffer.isView(input)) {\n const buffer = input.buffer as StrictArrayBuffer;\n return new DataViewDeserializerImpl(routeId, buffer, input.byteOffset, input.byteLength);\n }\n // Plain ArrayBuffer\n return new DataViewDeserializerImpl(routeId, input as StrictArrayBuffer);\n}\n\n// TODO: at the moment we do not resize the buffer, if data does not fit it will throw an error,\n// anything that uses the serializer should catch the error and resize the buffer\nclass DataViewSerializerImpl implements DataViewSerializer {\n readonly buffer: ArrayBuffer;\n private uint8View: Uint8Array; // Reusable view\n readonly routeId: string;\n index: number = 0; // byte offset\n view: DataView;\n hasEnded: boolean = false;\n constructor(routeId: string, size: number) {\n this.routeId = routeId;\n this.buffer = new ArrayBuffer(size);\n this.view = new DataView(this.buffer);\n this.uint8View = new Uint8Array(this.buffer);\n }\n reset(): void {\n this.index = 0;\n this.hasEnded = false;\n }\n resize(size: number): void {\n (this as any).buffer = new ArrayBuffer(size);\n this.view = new DataView(this.buffer);\n this.uint8View = new Uint8Array(this.buffer);\n }\n getBuffer(): StrictArrayBuffer {\n const buff = this.buffer.slice(0, this.index);\n return buff;\n }\n getBufferView(): Uint8Array {\n return new Uint8Array(this.buffer, 0, this.index);\n }\n markAsEnded(): void {\n this.hasEnded = true;\n updateResponseSize(this.routeId, this.index);\n }\n getLength(): number {\n return this.index;\n }\n serString(str: string, skipCache?: boolean): void {\n if (str.length >= opts.maxStrCacheLength || skipCache) {\n const targetView = this.uint8View.subarray(this.index + 4);\n const result = textEncoder.encodeInto(str, targetView);\n this.view.setUint32(this.index, result.written, LE);\n this.index += 4 + result.written;\n return;\n }\n const cached = opts.stringBytesCache.get(str);\n if (cached) {\n this.uint8View.set(cached, this.index + 4);\n this.view.setUint32(this.index, cached.length, LE);\n this.index += 4 + cached.length;\n return;\n }\n\n // Encode directly into working view\n const targetView = this.uint8View.subarray(this.index + 4);\n const result = textEncoder.encodeInto(str, targetView);\n const written = result.written!;\n\n this.view.setUint32(this.index, written, LE);\n this.index += 4 + written;\n\n // Cache the encoded bytes (create slice only for caching)\n if (opts.stringBytesCache.size >= opts.maxCacheSize) evictStringBytesCache();\n opts.stringBytesCache.set(str, this.uint8View.slice(this.index - written, this.index));\n }\n serFloat64(n: number): void {\n this.view.setFloat64(this.index, n, LE);\n this.index += 8;\n }\n serEnum(n: number | string): void {\n if (typeof n === 'number') {\n this.view.setUint32(this.index, NUM, LE);\n this.index += 4;\n this.view.setUint32(this.index, n, LE);\n this.index += 4;\n return;\n }\n this.view.setUint32(this.index, STR, LE);\n this.index += 4;\n this.serString(n);\n }\n setBitMask(bitMaskIndex: number, bitIndex: number): void {\n const newBitmask = this.view.getUint8(bitMaskIndex) | (1 << bitIndex);\n this.view.setUint8(bitMaskIndex, newBitmask);\n }\n}\n\nclass DataViewDeserializerImpl implements DataViewDeserializer {\n readonly buffer: StrictArrayBuffer;\n private uint8View: Uint8Array; // Reusable view\n readonly routeId: string;\n index: number = 0;\n view: DataView;\n hasEnded: boolean = false;\n constructor(routeId: string, buffer: StrictArrayBuffer, byteOffset?: number, byteLength?: number) {\n this.routeId = routeId;\n this.buffer = buffer;\n // index should always start at 0 because DataView/Uint8Array already account for byteOffset\n this.index = 0;\n this.view = new DataView(buffer, byteOffset, byteLength);\n this.uint8View = new Uint8Array(buffer, byteOffset, byteLength);\n }\n reset(): void {\n this.index = 0;\n this.hasEnded = false;\n }\n setBuffer(buffer: StrictArrayBuffer, byteOffset?: number, byteLength?: number): void {\n // index should always start at 0 because DataView/Uint8Array already account for byteOffset\n this.index = 0;\n (this as any).buffer = buffer;\n this.view = new DataView(buffer, byteOffset, byteLength);\n this.uint8View = new Uint8Array(buffer, byteOffset, byteLength); // Update working view\n this.hasEnded = false;\n }\n markAsEnded(): void {\n this.hasEnded = true;\n }\n getLength(): number {\n return this.index;\n }\n desString(): string {\n const len = this.view.getUint32(this.index, LE);\n this.index += 4;\n\n const decoded = textDecoder.decode(this.uint8View.subarray(this.index, this.index + len));\n this.index += len;\n return decoded;\n }\n /** Deserialize a string that will be used as a property name, with prototype pollution protection */\n desSafePropName(): string {\n const key = this.desString();\n const len = key.length;\n if (len === 9) {\n if (key === '__proto__' || key === 'prototype') throw new Error(`Unsafe property name: ${key}`);\n } else if (len === 11) {\n if (key === 'constructor') throw new Error(`Unsafe property name: ${key}`);\n }\n return key;\n }\n desFloat64(): number {\n const value = this.view.getFloat64(this.index, LE);\n this.index += 8;\n return value;\n }\n desEnum(): number | string {\n const type = this.view.getUint32(this.index, LE);\n this.index += 4;\n if (type === NUM) {\n const value = this.view.getUint32(this.index, LE);\n this.index += 4;\n return value;\n }\n return this.desString();\n }\n}\n\n/**\n * Calculates buffer size for a request, handling both single routes and routesFlows.\n * For routesFlows, sums up the buffer sizes for each individual route.\n */\nfunction calculateBufferSizeForRequest(routeId: string, workflowRouteIds?: string[]): number {\n if (!workflowRouteIds || workflowRouteIds.length === 0) {\n return calculateDefaultBufferSize(routeId);\n }\n\n // For routesFlows, sum up the buffer sizes for each individual route\n let totalSize = 0;\n for (const id of workflowRouteIds) {\n totalSize += calculateDefaultBufferSize(id);\n }\n return totalSize;\n}\n\n/** Returns the average response size for the given route, multiplied by a factor for safety margin */\nfunction calculateDefaultBufferSize(routeId: string): number {\n const size = opts.responseAverageSizes.get(routeId);\n if (!size) return opts.bufferSize;\n return size * opts.averageResponseSizeMultiplier;\n}\n\nfunction updateResponseSize(routeId: string, responseSize: number) {\n const currentSize = opts.responseAverageSizes.get(routeId) || opts.bufferSize;\n const average = (currentSize + responseSize) / 2;\n opts.responseAverageSizes.set(routeId, Math.floor(average));\n}\n\nfunction evictStringBytesCache(): void {\n const entries = Array.from(opts.stringBytesCache.entries());\n opts.stringBytesCache.clear();\n for (let i = Math.floor(entries.length / 2); i < entries.length; i++) {\n opts.stringBytesCache.set(entries[i][0], entries[i][1]);\n }\n}\n"],"names":["targetView","result"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { BinaryInput, DataViewSerializer, DataViewDeserializer } from '../types/general.types.ts';
2
+ declare const DEFAULT_OPTIONS: {
3
+ maxPoolItems: number;
4
+ maxStrCacheLength: number;
5
+ maxCacheSize: number;
6
+ bufferSize: number;
7
+ averageResponseSizeMultiplier: number;
8
+ responseAverageSizes: Map<string, number>;
9
+ stringBytesCache: Map<string, Uint8Array<ArrayBufferLike>>;
10
+ };
11
+ export type SerializationOptions = typeof DEFAULT_OPTIONS;
12
+ export declare function setSerializationOptions(options: Partial<SerializationOptions>): void;
13
+ export declare function createDataViewSerializer(routeId: string, workflowRouteIds?: string[]): DataViewSerializer;
14
+ export declare function createDataViewDeserializer(routeId: string, input: BinaryInput): DataViewDeserializer;
15
+ export {};
16
+ export declare type __ΩSerializationOptions = any[];
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const DEFAULT_CORE_OPTIONS = {
4
+ /** automatically generate and uuid */
5
+ autoGenerateErrorId: false
6
+ };
7
+ const PATH_SEPARATOR = "/";
8
+ const ROUTE_PATH_ROOT = PATH_SEPARATOR;
9
+ const ROUTER_ITEM_SEPARATOR_CHAR = "/";
10
+ const MAX_UNKNOWN_KEYS = 10;
11
+ const MAX_STACK_DEPTH = 50;
12
+ const MION_ROUTES = {
13
+ /** get remote methods metadata by method id */
14
+ methodsMetadataById: "mion@methodsMetadataById",
15
+ /** get remote methods metadata by route path, this include all middleFns in the ExecutionChain of the route. */
16
+ methodsMetadataByPath: "mion@methodsMetadataByPath",
17
+ /** Platform or adapters errors that occur before reaching the router or outside the router and are platform/adapter related */
18
+ platformError: "mion@platformError",
19
+ /** not-found route. This route is called when a requested route doesn't exist */
20
+ notFound: "mion@notFound",
21
+ /**
22
+ * !IMPORTANT!!
23
+ * This is technically not a route, but a special key used to store unexpected errors in the response body.
24
+ * is declared as a route to reuse existing router serialization/deserialization logic.
25
+ * Errors thrown by routes/middleFns, these are not strongly typed
26
+ * */
27
+ thrownErrors: "@thrownErrors"
28
+ };
29
+ const MIME_TYPES = {
30
+ json: "application/json",
31
+ octetStream: "application/octet-stream"
32
+ };
33
+ const StatusCodes = {
34
+ /** Any error in the server that is not related to the application, ie: server not ready, etc... */
35
+ SERVER_ERROR: 500,
36
+ /** Any expected and strongly typed error returned by a route/middleFn. ie: entity not found, etc. */
37
+ APPLICATION_ERROR: 400,
38
+ /** Any thrown or unexpected error in the application, ie: validation error, not found, etc, database error, serialization error, etc...
39
+ * These are are typically irrecoverable and can be handled globally, ie redirect to login page if auth fails
40
+ */
41
+ UNEXPECTED_ERROR: 422,
42
+ /** Not found error */
43
+ NOT_FOUND: 404,
44
+ /** Standard success code */
45
+ OK: 200
46
+ };
47
+ const HandlerType = {
48
+ route: 1,
49
+ middleFn: 2,
50
+ headersMiddleFn: 3,
51
+ rawMiddleFn: 4
52
+ };
53
+ const JIT_FUNCTION_IDS = {
54
+ isType: "is",
55
+ typeErrors: "te",
56
+ prepareForJson: "tj",
57
+ restoreFromJson: "fj",
58
+ stringifyJson: "sj",
59
+ toJSCode: "tc",
60
+ toBinary: "tBi",
61
+ fromBinary: "fBi",
62
+ format: "fmt",
63
+ unknownKeyErrors: "uk",
64
+ hasUnknownKeys: "hk",
65
+ stripUnknownKeys: "sk",
66
+ unknownKeysToUndefined: "ku",
67
+ aux: "aux",
68
+ mock: "mock",
69
+ pureFunction: "pf"
70
+ };
71
+ const EMPTY_HASH = "";
72
+ exports.DEFAULT_CORE_OPTIONS = DEFAULT_CORE_OPTIONS;
73
+ exports.EMPTY_HASH = EMPTY_HASH;
74
+ exports.HandlerType = HandlerType;
75
+ exports.JIT_FUNCTION_IDS = JIT_FUNCTION_IDS;
76
+ exports.MAX_STACK_DEPTH = MAX_STACK_DEPTH;
77
+ exports.MAX_UNKNOWN_KEYS = MAX_UNKNOWN_KEYS;
78
+ exports.MIME_TYPES = MIME_TYPES;
79
+ exports.MION_ROUTES = MION_ROUTES;
80
+ exports.PATH_SEPARATOR = PATH_SEPARATOR;
81
+ exports.ROUTER_ITEM_SEPARATOR_CHAR = ROUTER_ITEM_SEPARATOR_CHAR;
82
+ exports.ROUTE_PATH_ROOT = ROUTE_PATH_ROOT;
83
+ exports.StatusCodes = StatusCodes;
84
+ //# sourceMappingURL=constants.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,50 @@
1
+ import { CoreRouterOptions } from './types/general.types.ts';
2
+ export declare const DEFAULT_CORE_OPTIONS: CoreRouterOptions;
3
+ export declare const PATH_SEPARATOR = "/";
4
+ export declare const ROUTE_PATH_ROOT = "/";
5
+ export declare const ROUTER_ITEM_SEPARATOR_CHAR = "/";
6
+ export declare const MAX_UNKNOWN_KEYS = 10;
7
+ export declare const MAX_STACK_DEPTH = 50;
8
+ export declare const MION_ROUTES: {
9
+ readonly methodsMetadataById: "mion@methodsMetadataById";
10
+ readonly methodsMetadataByPath: "mion@methodsMetadataByPath";
11
+ readonly platformError: "mion@platformError";
12
+ readonly notFound: "mion@notFound";
13
+ readonly thrownErrors: "@thrownErrors";
14
+ };
15
+ export declare const MIME_TYPES: {
16
+ readonly json: "application/json";
17
+ readonly octetStream: "application/octet-stream";
18
+ };
19
+ export declare const StatusCodes: {
20
+ readonly SERVER_ERROR: 500;
21
+ readonly APPLICATION_ERROR: 400;
22
+ readonly UNEXPECTED_ERROR: 422;
23
+ readonly NOT_FOUND: 404;
24
+ readonly OK: 200;
25
+ };
26
+ export declare const HandlerType: {
27
+ readonly route: 1;
28
+ readonly middleFn: 2;
29
+ readonly headersMiddleFn: 3;
30
+ readonly rawMiddleFn: 4;
31
+ };
32
+ export declare const JIT_FUNCTION_IDS: {
33
+ readonly isType: "is";
34
+ readonly typeErrors: "te";
35
+ readonly prepareForJson: "tj";
36
+ readonly restoreFromJson: "fj";
37
+ readonly stringifyJson: "sj";
38
+ readonly toJSCode: "tc";
39
+ readonly toBinary: "tBi";
40
+ readonly fromBinary: "fBi";
41
+ readonly format: "fmt";
42
+ readonly unknownKeyErrors: "uk";
43
+ readonly hasUnknownKeys: "hk";
44
+ readonly stripUnknownKeys: "sk";
45
+ readonly unknownKeysToUndefined: "ku";
46
+ readonly aux: "aux";
47
+ readonly mock: "mock";
48
+ readonly pureFunction: "pf";
49
+ };
50
+ export declare const EMPTY_HASH = "";
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const src_constants = require("./constants.cjs");
4
+ const src_utils = require("./utils.cjs");
5
+ const src_jit_jitUtils = require("./jit/jitUtils.cjs");
6
+ const __ΩReadonly = ["T", "Readonly", 'l+e#!e"!fRb!Pde"!gN#%w"y'];
7
+ const __ΩRecord = ["K", "T", "Record", `l'e#"Rb!b"Pde"!N#!w#y`];
8
+ function __assignType(fn, args) {
9
+ fn.__type = args;
10
+ return fn;
11
+ }
12
+ const __ΩValidationErrorData = ["RunTypeError", "typeErrors", "ValidationErrorData", 'P"w!F4"Mw#y'];
13
+ const __ΩValidationError = ["validation-error", () => __ΩValidationErrorData, () => RpcError, "ValidationError", 'P.!n"7#w$y'];
14
+ let options = { ...src_constants.DEFAULT_CORE_OPTIONS };
15
+ function setErrorOptions(opts) {
16
+ options = opts;
17
+ }
18
+ setErrorOptions.__type = ["CoreRouterOptions", "opts", "setErrorOptions", 'P"w!2""/#'];
19
+ class TypedError extends Error {
20
+ /**
21
+ * Unique error identifier,
22
+ * Ideally this should be a symbol but we need to be able to serialize it so a namespaced prop is used instead
23
+ */
24
+ // eslint-disable-next-line @typescript-eslint/prefer-as-const
25
+ "mion@isΣrrθr" = true;
26
+ /** Error type, can be used as discriminator in union types*/
27
+ type;
28
+ // Note: message and name are NOT declared as properties here
29
+ // They are inherited from Error class and assigned in constructor
30
+ // This prevents them from being included in type reflection for JIT validation
31
+ constructor({ message, originalError, type }) {
32
+ const errorMessage = message || originalError?.message || "";
33
+ super(errorMessage);
34
+ this.type = type;
35
+ Object.defineProperty(this, "message", {
36
+ value: errorMessage,
37
+ writable: true,
38
+ enumerable: false,
39
+ configurable: true
40
+ });
41
+ Object.defineProperty(this, "name", {
42
+ value: "TypedError",
43
+ writable: true,
44
+ enumerable: false,
45
+ configurable: true
46
+ });
47
+ if (originalError?.stack) {
48
+ try {
49
+ this.stack = originalError.stack;
50
+ } catch {
51
+ try {
52
+ Object.defineProperty(this, "stack", {
53
+ value: originalError.stack,
54
+ writable: true,
55
+ configurable: true
56
+ });
57
+ } catch {
58
+ }
59
+ }
60
+ }
61
+ Object.setPrototypeOf(this, TypedError.prototype);
62
+ }
63
+ static __type = ["ErrType", () => Error, true, "mion@isΣrrθr", function() {
64
+ return true;
65
+ }, "type", "TypedErrorParams", "param0", "constructor", "TypedError", `b!P7".#3$9>%e!!3&9P"w'2("0)5w*`];
66
+ }
67
+ class RpcError extends TypedError {
68
+ // Note: name is NOT declared as a property here
69
+ // It is inherited from Error class and assigned in constructor
70
+ // This prevents it from being included in type reflection for JIT validation
71
+ /**
72
+ * id of the error, ideally each error should unique identifiable
73
+ * * if RouterOptions.autoGenerateErrorId is set to true and id with timestamp+uuid will be generated
74
+ * */
75
+ id;
76
+ /** the message that will be returned in the response */
77
+ publicMessage;
78
+ /** options data related to the error, ie validation data, must be json serializable */
79
+ errorData;
80
+ /** optional http status code */
81
+ statusCode;
82
+ constructor({ message, publicMessage, originalError, errorData, type, id, statusCode }) {
83
+ const originalMessage = message || originalError?.message || publicMessage || "";
84
+ super({
85
+ message: originalMessage,
86
+ originalError,
87
+ type
88
+ });
89
+ const { autoGenerateErrorId } = options;
90
+ this.id = id ?? (autoGenerateErrorId ? src_utils.randomUUID_V7() : void 0);
91
+ this.publicMessage = publicMessage || "";
92
+ this.errorData = errorData;
93
+ this.statusCode = statusCode;
94
+ Object.defineProperty(this, "name", {
95
+ value: "RpcError",
96
+ writable: true,
97
+ enumerable: false,
98
+ configurable: true
99
+ });
100
+ Object.setPrototypeOf(this, RpcError.prototype);
101
+ }
102
+ static __type = ["ErrType", "ErrData", () => TypedError, "id", "publicMessage", () => __ΩReadonly, "errorData", "statusCode", "AnyErrorParams", "param0", "constructor", "RpcErrorParams", "RpcError", `b!"c"Pe"!7#P'&J3$89&3%9e!"o&"3'89'3(8P"w)2*"0+5e!!6""w,x"w-`];
103
+ }
104
+ function hasUnknownKeys(obj, keys) {
105
+ for (const prop in obj) {
106
+ let found = false;
107
+ for (let j = 0; j < keys.length; j++) {
108
+ if (keys[j] === prop) {
109
+ found = true;
110
+ break;
111
+ }
112
+ }
113
+ if (!found)
114
+ return true;
115
+ }
116
+ return false;
117
+ }
118
+ hasUnknownKeys.__type = [() => __ΩRecord, "StrNumber", "obj", "keys", "hasUnknownKeys", 'P"w""o!#2#"w"F2$)/%'];
119
+ function isTypedError(error) {
120
+ if (!error)
121
+ return false;
122
+ if (error instanceof TypedError)
123
+ return true;
124
+ return error && error["mion@isΣrrθr"] === true && (typeof error.type === "string" || typeof error.type === "number") && !hasUnknownKeys(error, ["mion@isΣrrθr", "type", "message"]);
125
+ }
126
+ isTypedError.__type = ["error", "isTypedError", 'P"2!!/"'];
127
+ function isRpcError(error) {
128
+ if (!error)
129
+ return false;
130
+ if (error instanceof RpcError)
131
+ return true;
132
+ return error && error["mion@isΣrrθr"] === true && (typeof error.type === "string" || typeof error.type === "number") && (error.id === void 0 || typeof error.id === "string" || typeof error.id === "number") && !hasUnknownKeys(error, ["mion@isΣrrθr", "id", "message", "publicMessage", "errorData", "type", "statusCode"]);
133
+ }
134
+ isRpcError.__type = ["error", "isRpcError", 'P"2!!/"'];
135
+ function isAnyError(error) {
136
+ if (!error)
137
+ return false;
138
+ const tErr = error;
139
+ if (tErr["mion@isΣrrθr"] === true)
140
+ return true;
141
+ if (typeof Error.isError === "function")
142
+ return Error.isError(error);
143
+ return error instanceof Error;
144
+ }
145
+ isAnyError.__type = ["error", "isAnyError", 'P"2!!/"'];
146
+ let errorDeserializersRegistered = false;
147
+ function registerErrorDeserializers() {
148
+ if (errorDeserializersRegistered)
149
+ return;
150
+ if (!TypedError || !RpcError)
151
+ return;
152
+ errorDeserializersRegistered = true;
153
+ src_jit_jitUtils.getJitUtils().setDeserializeFn(TypedError, __assignType((data) => {
154
+ return new TypedError(data);
155
+ }, ["DataOnly", "data", "", 'P"w!2""/#']));
156
+ src_jit_jitUtils.getJitUtils().setDeserializeFn(RpcError, __assignType((data) => {
157
+ return new RpcError(data);
158
+ }, ["DataOnly", "data", "", 'P"w!2""/#']));
159
+ }
160
+ registerErrorDeserializers.__type = ["registerErrorDeserializers", 'P"/!'];
161
+ exports.RpcError = RpcError;
162
+ exports.TypedError = TypedError;
163
+ exports.__ΩValidationError = __ΩValidationError;
164
+ exports.__ΩValidationErrorData = __ΩValidationErrorData;
165
+ exports.isAnyError = isAnyError;
166
+ exports.isRpcError = isRpcError;
167
+ exports.isTypedError = isTypedError;
168
+ exports.registerErrorDeserializers = registerErrorDeserializers;
169
+ exports.setErrorOptions = setErrorOptions;
170
+ //# sourceMappingURL=errors.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,24 @@
1
+ import { CoreRouterOptions, AnyErrorParams, TypedErrorParams, RpcErrorParams, RunTypeError } from './types/general.types.ts';
2
+ export interface ValidationErrorData {
3
+ typeErrors: RunTypeError[];
4
+ }
5
+ export type ValidationError = RpcError<'validation-error', ValidationErrorData>;
6
+ export declare function setErrorOptions(opts: CoreRouterOptions): void;
7
+ export declare class TypedError<ErrType extends string> extends Error {
8
+ readonly 'mion@isΣrrθr': true;
9
+ readonly type: ErrType;
10
+ constructor({ message, originalError, type }: TypedErrorParams<ErrType>);
11
+ }
12
+ export declare class RpcError<ErrType extends string, ErrData = any> extends TypedError<ErrType> implements RpcErrorParams<ErrType, ErrData> {
13
+ readonly id?: number | string;
14
+ readonly publicMessage: string;
15
+ readonly errorData?: Readonly<ErrData>;
16
+ statusCode?: number;
17
+ constructor({ message, publicMessage, originalError, errorData, type, id, statusCode }: AnyErrorParams<ErrType, ErrData>);
18
+ }
19
+ export declare function isTypedError(error: any): error is TypedError<any>;
20
+ export declare function isRpcError(error: any): error is RpcError<string>;
21
+ export declare function isAnyError(error: any): error is TypedError<any> | RpcError<string> | Error;
22
+ export declare function registerErrorDeserializers(): void;
23
+ export declare type __ΩValidationErrorData = any[];
24
+ export declare type __ΩValidationError = any[];
@@ -0,0 +1,235 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const src_utils = require("./utils.cjs");
4
+ function isMapKeyPath(segment) {
5
+ return typeof segment === "object" && segment !== null && "failed" in segment && segment.failed === "mapKey";
6
+ }
7
+ function isMapValuePath(segment) {
8
+ return typeof segment === "object" && segment !== null && "failed" in segment && segment.failed === "mapVal";
9
+ }
10
+ function isSetItemPath(segment) {
11
+ return typeof segment === "object" && segment !== null && "key" in segment && "index" in segment && !("failed" in segment);
12
+ }
13
+ function defaultErrorPrinter(error) {
14
+ const lastSegment = error.path.length > 0 ? error.path[error.path.length - 1] : "value";
15
+ let prop;
16
+ if (isMapKeyPath(lastSegment)) {
17
+ prop = `mapKey[${lastSegment.index}]`;
18
+ } else if (isMapValuePath(lastSegment)) {
19
+ prop = `mapValue[${lastSegment.index}]`;
20
+ } else if (isSetItemPath(lastSegment)) {
21
+ prop = `setItem[${lastSegment.index}]`;
22
+ } else {
23
+ prop = lastSegment;
24
+ }
25
+ if (error.format) {
26
+ const param = error.format.formatPath[0];
27
+ return `${prop}: ${param} validation failed (expected ${error.format.val})`;
28
+ }
29
+ return `${prop}: expected ${error.expected}`;
30
+ }
31
+ function mergeErrorIntoParams(params, error) {
32
+ params.rtErrors.push(error);
33
+ params.rtError = error;
34
+ if (error.format) {
35
+ const paramKey = error.format.formatPath[0];
36
+ params[paramKey] = error.format;
37
+ }
38
+ }
39
+ function createAggregatedParams(error) {
40
+ const lastSegment = error.path[error.path.length - 1];
41
+ let propName;
42
+ let index;
43
+ let mapErrorType;
44
+ if (isMapKeyPath(lastSegment)) {
45
+ propName = lastSegment.index;
46
+ index = lastSegment.index;
47
+ mapErrorType = "key";
48
+ } else if (isMapValuePath(lastSegment)) {
49
+ propName = lastSegment.index;
50
+ index = lastSegment.index;
51
+ mapErrorType = "value";
52
+ } else if (isSetItemPath(lastSegment)) {
53
+ propName = lastSegment.index;
54
+ index = lastSegment.index;
55
+ } else {
56
+ propName = lastSegment;
57
+ index = typeof propName === "number" ? propName : void 0;
58
+ }
59
+ const params = {
60
+ rtError: error,
61
+ rtErrors: [error],
62
+ propName,
63
+ index,
64
+ mapErrorType
65
+ };
66
+ if (error.format) {
67
+ const paramKey = error.format.formatPath[0];
68
+ params[paramKey] = error.format;
69
+ }
70
+ return params;
71
+ }
72
+ function pathToKey(path) {
73
+ return path.map((segment) => {
74
+ if (isMapKeyPath(segment)) {
75
+ return `$mapKey[${segment.index}]`;
76
+ } else if (isMapValuePath(segment)) {
77
+ return `$mapVal[${segment.index}]`;
78
+ } else if (isSetItemPath(segment)) {
79
+ return `$setItem[${segment.index}]`;
80
+ }
81
+ return String(segment);
82
+ }).join(".");
83
+ }
84
+ function getOrCreatePath(obj, path) {
85
+ if (path.length === 0) return null;
86
+ let current = obj;
87
+ for (let i = 0; i < path.length - 1; i++) {
88
+ const segment = path[i];
89
+ let key;
90
+ if (isMapKeyPath(segment)) {
91
+ if (current["$keys"] === void 0) {
92
+ current["$keys"] = {};
93
+ }
94
+ current = current["$keys"];
95
+ key = segment.index;
96
+ } else if (isMapValuePath(segment)) {
97
+ if (current["$values"] === void 0) {
98
+ current["$values"] = {};
99
+ }
100
+ current = current["$values"];
101
+ key = segment.index;
102
+ } else if (isSetItemPath(segment)) {
103
+ key = segment.index;
104
+ } else {
105
+ key = segment;
106
+ }
107
+ if (current[key] === void 0) {
108
+ current[key] = {};
109
+ }
110
+ current = current[key];
111
+ }
112
+ const lastSegment = path[path.length - 1];
113
+ let finalKey;
114
+ if (isMapKeyPath(lastSegment)) {
115
+ if (current["$keys"] === void 0) {
116
+ current["$keys"] = {};
117
+ }
118
+ return { target: current["$keys"], key: lastSegment.index };
119
+ } else if (isMapValuePath(lastSegment)) {
120
+ if (current["$values"] === void 0) {
121
+ current["$values"] = {};
122
+ }
123
+ return { target: current["$values"], key: lastSegment.index };
124
+ } else if (isSetItemPath(lastSegment)) {
125
+ finalKey = lastSegment.index;
126
+ } else {
127
+ finalKey = lastSegment;
128
+ }
129
+ return { target: current, key: finalKey };
130
+ }
131
+ function getHandler(errorsMap, path) {
132
+ if (!errorsMap) return null;
133
+ if (typeof errorsMap === "function") {
134
+ return errorsMap;
135
+ }
136
+ let current = errorsMap;
137
+ for (let i = 0; i < path.length; i++) {
138
+ const segment = path[i];
139
+ if (current === void 0 || current === null) return null;
140
+ if (isMapKeyPath(segment)) {
141
+ if (typeof current === "object" && current !== null && "$key" in current) {
142
+ const keyHandler = current["$key"];
143
+ if (typeof keyHandler === "function") {
144
+ return keyHandler;
145
+ }
146
+ }
147
+ if (typeof current === "function") {
148
+ return current;
149
+ }
150
+ return null;
151
+ }
152
+ if (isMapValuePath(segment)) {
153
+ if (typeof current === "object" && current !== null && "$value" in current) {
154
+ const valueHandler = current["$value"];
155
+ if (typeof valueHandler === "function") {
156
+ return valueHandler;
157
+ }
158
+ current = valueHandler;
159
+ continue;
160
+ }
161
+ if (typeof current === "function") {
162
+ return current;
163
+ }
164
+ return null;
165
+ }
166
+ if (isSetItemPath(segment)) {
167
+ if (typeof current === "object" && current !== null && "$item" in current) {
168
+ const itemHandler = current["$item"];
169
+ if (typeof itemHandler === "function") {
170
+ return itemHandler;
171
+ }
172
+ current = itemHandler;
173
+ continue;
174
+ }
175
+ if (typeof current === "function") {
176
+ return current;
177
+ }
178
+ return null;
179
+ }
180
+ if (typeof segment === "number") {
181
+ if (typeof current === "function") {
182
+ return current;
183
+ }
184
+ continue;
185
+ }
186
+ if (typeof current === "function") return null;
187
+ current = current[segment];
188
+ }
189
+ if (typeof current === "function") {
190
+ return current;
191
+ }
192
+ return null;
193
+ }
194
+ function getFriendlyErrors(errors, errorsMap) {
195
+ const result = {};
196
+ const aggregatedByPath = /* @__PURE__ */ new Map();
197
+ for (const error of errors) {
198
+ const pathKey = pathToKey(error.path);
199
+ const existing = aggregatedByPath.get(pathKey);
200
+ if (existing) {
201
+ mergeErrorIntoParams(existing, error);
202
+ } else {
203
+ aggregatedByPath.set(pathKey, createAggregatedParams(error));
204
+ }
205
+ }
206
+ for (const [pathKey, aggregatedParams] of aggregatedByPath) {
207
+ const path = aggregatedParams.rtErrors[0].path;
208
+ const handler = getHandler(errorsMap, path);
209
+ let message;
210
+ if (handler) {
211
+ message = handler(aggregatedParams);
212
+ } else {
213
+ if (!src_utils.isTestEnv()) {
214
+ console.warn(
215
+ `[mion] Using defaultErrorPrinter for "${pathKey || "$root"}". Consider providing a custom error handler for better user-facing messages.`
216
+ );
217
+ }
218
+ const messages = aggregatedParams.rtErrors.map((err) => defaultErrorPrinter(err));
219
+ message = [...new Set(messages)].join("; ");
220
+ }
221
+ if (path.length === 0) {
222
+ result["$root"] = message;
223
+ } else {
224
+ const pathInfo = getOrCreatePath(result, path);
225
+ if (pathInfo) {
226
+ const { target, key } = pathInfo;
227
+ target[key] = message;
228
+ }
229
+ }
230
+ }
231
+ return result;
232
+ }
233
+ exports.defaultErrorPrinter = defaultErrorPrinter;
234
+ exports.getFriendlyErrors = getFriendlyErrors;
235
+ //# sourceMappingURL=friendlyErrors.cjs.map