@mionjs/client 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 (106) hide show
  1. package/.dist/cjs/_virtual/jit-fns.cjs +315 -0
  2. package/.dist/cjs/_virtual/jit-fns.cjs.map +1 -0
  3. package/.dist/cjs/_virtual/pure-fns.cjs +56 -0
  4. package/.dist/cjs/_virtual/pure-fns.cjs.map +1 -0
  5. package/.dist/cjs/_virtual/router-cache.cjs +2 -0
  6. package/.dist/cjs/_virtual/router-cache.cjs.map +1 -0
  7. package/.dist/cjs/index.cjs +2 -0
  8. package/.dist/cjs/index.cjs.map +1 -0
  9. package/.dist/cjs/index.d.ts +11 -0
  10. package/.dist/cjs/package.json +1 -0
  11. package/.dist/cjs/src/aot/loadClientAOTCaches.cjs +2 -0
  12. package/.dist/cjs/src/aot/loadClientAOTCaches.cjs.map +1 -0
  13. package/.dist/cjs/src/aot/loadClientAOTCaches.d.ts +8 -0
  14. package/.dist/cjs/src/client.cjs +2 -0
  15. package/.dist/cjs/src/client.cjs.map +1 -0
  16. package/.dist/cjs/src/client.d.ts +28 -0
  17. package/.dist/cjs/src/clientMethodsMetadata.cjs +2 -0
  18. package/.dist/cjs/src/clientMethodsMetadata.cjs.map +1 -0
  19. package/.dist/cjs/src/clientMethodsMetadata.d.ts +10 -0
  20. package/.dist/cjs/src/constants.cjs +2 -0
  21. package/.dist/cjs/src/constants.cjs.map +1 -0
  22. package/.dist/cjs/src/constants.d.ts +6 -0
  23. package/.dist/cjs/src/handlersRegistry.cjs +2 -0
  24. package/.dist/cjs/src/handlersRegistry.cjs.map +1 -0
  25. package/.dist/cjs/src/handlersRegistry.d.ts +18 -0
  26. package/.dist/cjs/src/request.cjs +2 -0
  27. package/.dist/cjs/src/request.cjs.map +1 -0
  28. package/.dist/cjs/src/request.d.ts +30 -0
  29. package/.dist/cjs/src/routesFlow.cjs +2 -0
  30. package/.dist/cjs/src/routesFlow.cjs.map +1 -0
  31. package/.dist/cjs/src/routesFlow.d.ts +6 -0
  32. package/.dist/cjs/src/serializer.cjs +2 -0
  33. package/.dist/cjs/src/serializer.cjs.map +1 -0
  34. package/.dist/cjs/src/serializer.d.ts +13 -0
  35. package/.dist/cjs/src/storage.cjs +2 -0
  36. package/.dist/cjs/src/storage.cjs.map +1 -0
  37. package/.dist/cjs/src/storage.d.ts +11 -0
  38. package/.dist/cjs/src/subRequest.cjs +2 -0
  39. package/.dist/cjs/src/subRequest.cjs.map +1 -0
  40. package/.dist/cjs/src/subRequest.d.ts +23 -0
  41. package/.dist/cjs/src/testUtils.cjs +2 -0
  42. package/.dist/cjs/src/testUtils.cjs.map +1 -0
  43. package/.dist/cjs/src/testUtils.d.ts +1 -0
  44. package/.dist/cjs/src/typedEvent.cjs +2 -0
  45. package/.dist/cjs/src/typedEvent.cjs.map +1 -0
  46. package/.dist/cjs/src/typedEvent.d.ts +17 -0
  47. package/.dist/cjs/src/types.cjs +2 -0
  48. package/.dist/cjs/src/types.cjs.map +1 -0
  49. package/.dist/cjs/src/types.d.ts +152 -0
  50. package/.dist/cjs/src/validation.cjs +2 -0
  51. package/.dist/cjs/src/validation.cjs.map +1 -0
  52. package/.dist/cjs/src/validation.d.ts +4 -0
  53. package/.dist/esm/_virtual/jit-fns.js +1391 -0
  54. package/.dist/esm/_virtual/jit-fns.js.map +1 -0
  55. package/.dist/esm/_virtual/pure-fns.js +109 -0
  56. package/.dist/esm/_virtual/pure-fns.js.map +1 -0
  57. package/.dist/esm/_virtual/router-cache.js +5 -0
  58. package/.dist/esm/_virtual/router-cache.js.map +1 -0
  59. package/.dist/esm/index.d.ts +11 -0
  60. package/.dist/esm/index.js +80 -0
  61. package/.dist/esm/index.js.map +1 -0
  62. package/.dist/esm/src/aot/loadClientAOTCaches.d.ts +8 -0
  63. package/.dist/esm/src/aot/loadClientAOTCaches.js +19 -0
  64. package/.dist/esm/src/aot/loadClientAOTCaches.js.map +1 -0
  65. package/.dist/esm/src/client.d.ts +28 -0
  66. package/.dist/esm/src/client.js +185 -0
  67. package/.dist/esm/src/client.js.map +1 -0
  68. package/.dist/esm/src/clientMethodsMetadata.d.ts +10 -0
  69. package/.dist/esm/src/clientMethodsMetadata.js +162 -0
  70. package/.dist/esm/src/clientMethodsMetadata.js.map +1 -0
  71. package/.dist/esm/src/constants.d.ts +6 -0
  72. package/.dist/esm/src/constants.js +25 -0
  73. package/.dist/esm/src/constants.js.map +1 -0
  74. package/.dist/esm/src/handlersRegistry.d.ts +18 -0
  75. package/.dist/esm/src/handlersRegistry.js +70 -0
  76. package/.dist/esm/src/handlersRegistry.js.map +1 -0
  77. package/.dist/esm/src/request.d.ts +30 -0
  78. package/.dist/esm/src/request.js +289 -0
  79. package/.dist/esm/src/request.js.map +1 -0
  80. package/.dist/esm/src/routesFlow.d.ts +6 -0
  81. package/.dist/esm/src/routesFlow.js +61 -0
  82. package/.dist/esm/src/routesFlow.js.map +1 -0
  83. package/.dist/esm/src/serializer.d.ts +13 -0
  84. package/.dist/esm/src/serializer.js +139 -0
  85. package/.dist/esm/src/serializer.js.map +1 -0
  86. package/.dist/esm/src/storage.d.ts +11 -0
  87. package/.dist/esm/src/storage.js +48 -0
  88. package/.dist/esm/src/storage.js.map +1 -0
  89. package/.dist/esm/src/subRequest.d.ts +23 -0
  90. package/.dist/esm/src/subRequest.js +73 -0
  91. package/.dist/esm/src/subRequest.js.map +1 -0
  92. package/.dist/esm/src/testUtils.d.ts +1 -0
  93. package/.dist/esm/src/testUtils.js +48 -0
  94. package/.dist/esm/src/testUtils.js.map +1 -0
  95. package/.dist/esm/src/typedEvent.d.ts +17 -0
  96. package/.dist/esm/src/typedEvent.js +41 -0
  97. package/.dist/esm/src/typedEvent.js.map +1 -0
  98. package/.dist/esm/src/types.d.ts +152 -0
  99. package/.dist/esm/src/types.js +42 -0
  100. package/.dist/esm/src/types.js.map +1 -0
  101. package/.dist/esm/src/validation.d.ts +4 -0
  102. package/.dist/esm/src/validation.js +57 -0
  103. package/.dist/esm/src/validation.js.map +1 -0
  104. package/LICENSE +21 -0
  105. package/README.md +34 -0
  106. package/package.json +74 -0
@@ -0,0 +1,162 @@
1
+ import { pureFnsCache, jitFnsCache } from "virtual:mion-aot/caches";
2
+ import { MION_ROUTES, getRoutePath, isRpcError, RpcError, addSerializedJitCaches, isTestEnv, routesCache, addRoutesToCache } from "@mionjs/core";
3
+ import { __ΩClientOptions as ___ClientOptions } from "./types.js";
4
+ import { STORAGE_KEY } from "./constants.js";
5
+ import { deserializeResponseBody } from "./serializer.js";
6
+ import { getStorage } from "./storage.js";
7
+ const __ΩRecord = ["K", "T", "Record", `l'e#"Rb!b"Pde"!N#!w#y`];
8
+ function __assignType(fn, args) {
9
+ return fn.__type = args, fn;
10
+ }
11
+ async function fetchRemoteMethodsMetadata(methodIds, options) {
12
+ validateClientCaches(), restoreFromLocalStorage(methodIds, options);
13
+ const missingAfterLocal = methodIds.filter(__assignType((path) => !routesCache.hasMetadata(path), ["path", "", 'P"2!"/"']));
14
+ if (!missingAfterLocal.length)
15
+ return;
16
+ const shouldReturnAllMethods = !0, body = {
17
+ [MION_ROUTES.methodsMetadataById]: [missingAfterLocal, shouldReturnAllMethods]
18
+ };
19
+ try {
20
+ const path = getRoutePath([MION_ROUTES.methodsMetadataById], options), url = new URL(path, options.baseURL), response = await fetch(url, {
21
+ method: "POST",
22
+ headers: { "Content-Type": "application/json" },
23
+ body: JSON.stringify(body)
24
+ }), deserialized = await deserializeResponseBody(response), platformError = deserialized[MION_ROUTES.platformError], serializableMethodsData = deserialized[MION_ROUTES.methodsMetadataById];
25
+ if (isRpcError(platformError))
26
+ throw platformError;
27
+ if (isRpcError(serializableMethodsData))
28
+ throw serializableMethodsData;
29
+ if (!serializableMethodsData)
30
+ throw new RpcError({
31
+ type: "cant-fetch-remote-methods-metadata",
32
+ publicMessage: "Failed to fetch remote methods metadata",
33
+ errorData: { response }
34
+ });
35
+ storeDependencies(serializableMethodsData.deps, serializableMethodsData.purFnDeps, options), storeMethodsMetadata(serializableMethodsData.methods, options), addToCaches(serializableMethodsData);
36
+ } catch (error) {
37
+ throw new Error(`Error fetching validation and serialization metadata: ${error?.message}`);
38
+ }
39
+ }
40
+ fetchRemoteMethodsMetadata.__type = ["methodIds", () => ___ClientOptions, "options", "fetchRemoteMethodsMetadata", 'P&F2!n"2#"/$'];
41
+ function getSerializedMethodDataKey(methodId, options) {
42
+ return `${STORAGE_KEY}:serialized-method-data:${options.baseURL}:${methodId}`;
43
+ }
44
+ getSerializedMethodDataKey.__type = ["methodId", () => ___ClientOptions, "options", "getSerializedMethodDataKey", 'P&2!n"2#"/$'];
45
+ function getJitCompiledFnKey(jitFnHash, options) {
46
+ return `${STORAGE_KEY}:jit-compiled-fn:${options.baseURL}:${jitFnHash}`;
47
+ }
48
+ getJitCompiledFnKey.__type = ["jitFnHash", () => ___ClientOptions, "options", "getJitCompiledFnKey", 'P&2!n"2#"/$'];
49
+ function getJitPureFnKey(namespace, pureFnHash, options) {
50
+ return `${STORAGE_KEY}:jit-pure-fn:${options.baseURL}:${namespace}:${pureFnHash}`;
51
+ }
52
+ getJitPureFnKey.__type = ["namespace", "pureFnHash", () => ___ClientOptions, "options", "getJitPureFnKey", 'P&2!&2"n#2$"/%'];
53
+ function storeDependencies(deps, pureFnDeps, options) {
54
+ Object.entries(deps).forEach(__assignType(([hash, jitFnData]) => {
55
+ const key = getJitCompiledFnKey(hash, options);
56
+ try {
57
+ getStorage().setItem(key, JSON.stringify(jitFnData));
58
+ } catch (error) {
59
+ console.warn(`Failed to store JIT function dependency ${hash}:`, error);
60
+ }
61
+ }, ["JitCompiledFnData", "param0", "", 'PP&"w!G2""/#'])), Object.entries(pureFnDeps).forEach(__assignType(([namespace, nsPureFns]) => {
62
+ Object.entries(nsPureFns).forEach(__assignType(([fnHash, pureFnData]) => {
63
+ const key = getJitPureFnKey(namespace, fnHash, options);
64
+ try {
65
+ getStorage().setItem(key, JSON.stringify(pureFnData));
66
+ } catch (error) {
67
+ console.warn(`Failed to store pure function dependency ${namespace}::${fnHash}:`, error);
68
+ }
69
+ }, ["PureFunctionData", "param0", "", 'PP&"w!G2""/#']));
70
+ }, ["param0", "", 'P"2!"/"']));
71
+ }
72
+ storeDependencies.__type = [() => __ΩRecord, "JitCompiledFnData", "deps", "PureFnsDataCache", "pureFnDeps", () => ___ClientOptions, "options", "storeDependencies", `P&"w"o!#2#"w$2%n&2'"/(`];
73
+ function storeMethodsMetadata(methods, options) {
74
+ Object.entries(methods).forEach(__assignType(([methodId, methodData]) => {
75
+ const key = getSerializedMethodDataKey(methodId, options);
76
+ try {
77
+ getStorage().setItem(key, JSON.stringify(methodData));
78
+ } catch (error) {
79
+ console.warn(`Failed to store method metadata ${methodId}:`, error);
80
+ }
81
+ }, ["param0", "", 'P"2!"/"']));
82
+ }
83
+ storeMethodsMetadata.__type = ["MethodsCache", "methods", () => ___ClientOptions, "options", "storeMethodsMetadata", 'P"w!2"n#2$"/%'];
84
+ function restoreAllDependencies(options) {
85
+ const deps = {}, pureFnDeps = {}, pureFnKeyPrefix = `${STORAGE_KEY}:jit-pure-fn:${options.baseURL}:`;
86
+ for (let i = 0; i < getStorage().length; i++) {
87
+ const key = getStorage().key(i);
88
+ if (key?.startsWith(`${STORAGE_KEY}:jit-compiled-fn:${options.baseURL}:`))
89
+ try {
90
+ const data = getStorage().getItem(key);
91
+ if (data) {
92
+ const parsedData = JSON.parse(data);
93
+ deps[parsedData.jitFnHash] = parsedData;
94
+ }
95
+ } catch (error) {
96
+ console.warn(`Failed to restore JIT function from key ${key}:`, error);
97
+ }
98
+ }
99
+ for (let i = 0; i < getStorage().length; i++) {
100
+ const key = getStorage().key(i);
101
+ if (key?.startsWith(pureFnKeyPrefix))
102
+ try {
103
+ const data = getStorage().getItem(key);
104
+ if (data) {
105
+ const parsedData = JSON.parse(data), namespace = key.slice(pureFnKeyPrefix.length).split(":")[0] || parsedData.namespace;
106
+ pureFnDeps[namespace] || (pureFnDeps[namespace] = {}), pureFnDeps[namespace][parsedData.fnName] = parsedData;
107
+ }
108
+ } catch (error) {
109
+ console.warn(`Failed to restore pure function from key ${key}:`, error);
110
+ }
111
+ }
112
+ (Object.keys(deps).length > 0 || Object.keys(pureFnDeps).length > 0) && addSerializedJitCaches(deps, pureFnDeps);
113
+ }
114
+ restoreAllDependencies.__type = [() => ___ClientOptions, "options", "restoreAllDependencies", 'Pn!2""/#'];
115
+ function restoreFromLocalStorage(methodIds, options) {
116
+ restoreAllDependencies(options);
117
+ const methods = {};
118
+ let anyMethodsRestored = !1;
119
+ methodIds.forEach(__assignType((id) => {
120
+ if (routesCache.hasMetadata(id))
121
+ return;
122
+ const methodKey = getSerializedMethodDataKey(id, options), methodMetaJson = getStorage().getItem(methodKey);
123
+ if (methodMetaJson)
124
+ try {
125
+ const methodMeta = JSON.parse(methodMetaJson);
126
+ methods[id] = methodMeta, anyMethodsRestored = !0;
127
+ } catch (error) {
128
+ console.warn(`Failed to restore method metadata for ${id}:`, error), getStorage().removeItem(methodKey);
129
+ }
130
+ }, ["id", "", 'P"2!"/"'])), anyMethodsRestored && addToCaches({
131
+ methods,
132
+ deps: {},
133
+ purFnDeps: {}
134
+ });
135
+ }
136
+ restoreFromLocalStorage.__type = ["methodIds", () => ___ClientOptions, "options", "restoreFromLocalStorage", 'P&F2!n"2#"/$'];
137
+ function addToCaches(serializableMethodsData) {
138
+ addSerializedJitCaches(serializableMethodsData.deps, serializableMethodsData.purFnDeps), addRoutesToCache(serializableMethodsData.methods);
139
+ }
140
+ addToCaches.__type = ["SerializableMethodsData", "serializableMethodsData", "addToCaches", 'P"w!2""/#'];
141
+ function getAOTCaches() {
142
+ return { jitFnsCache, pureFnsCache };
143
+ }
144
+ getAOTCaches.__type = ["getAOTCaches", 'P"/!'];
145
+ let clientCachesValidated = !1;
146
+ function validateClientCaches() {
147
+ if (clientCachesValidated || isTestEnv())
148
+ return;
149
+ clientCachesValidated = !0;
150
+ const missingRoutes = Object.values(MION_ROUTES).filter(__assignType((routeId) => !routesCache.hasMetadata(routeId), ["routeId", "", 'P"2!"/"']));
151
+ if (missingRoutes.length > 0)
152
+ throw new Error(`AOT cache not loaded: Required MION_ROUTES not found in router cache: ${missingRoutes.join(", ")}. Make sure to import '@mionjs/client/aot' or 'virtual:mion-aot/caches' before using the client.`);
153
+ }
154
+ validateClientCaches.__type = ["validateClientCaches", 'P"/!'];
155
+ export {
156
+ fetchRemoteMethodsMetadata,
157
+ getAOTCaches,
158
+ restoreAllDependencies,
159
+ storeDependencies,
160
+ storeMethodsMetadata
161
+ };
162
+ //# sourceMappingURL=clientMethodsMetadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clientMethodsMetadata.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,6 @@
1
+ import { ClientOptions } from './types.ts';
2
+ export declare const DEFAULT_PREFILL_OPTIONS: ClientOptions;
3
+ export declare const MAX_GET_URL_LENGTH = 4096;
4
+ export declare const STORAGE_KEY = "mionkit:client";
5
+ export declare const ROUTES_FLOW_KEY = "mion-routes-flow";
6
+ export declare const ROUTES_FLOW_PATH = "/mion-routes-flow";
@@ -0,0 +1,25 @@
1
+ const DEFAULT_PREFILL_OPTIONS = {
2
+ baseURL: "",
3
+ fetchOptions: {
4
+ method: "PUT",
5
+ headers: { "Content-Type": "application/json" }
6
+ },
7
+ /** Prefix for all routes, i.e: api/v1 */
8
+ basePath: "",
9
+ /** Suffix for all routes, i.e: .json */
10
+ suffix: "",
11
+ /** Enables automatic parameter validation */
12
+ validateParams: !0,
13
+ /** Set true to automatically generate and id for every error */
14
+ autoGenerateErrorId: !1,
15
+ /** Default serializer mode - stringifyJson as default native serializer */
16
+ serializer: "stringifyJson"
17
+ }, MAX_GET_URL_LENGTH = 4096, STORAGE_KEY = "mionkit:client", ROUTES_FLOW_KEY = "mion-routes-flow", ROUTES_FLOW_PATH = `/${ROUTES_FLOW_KEY}`;
18
+ export {
19
+ DEFAULT_PREFILL_OPTIONS,
20
+ MAX_GET_URL_LENGTH,
21
+ ROUTES_FLOW_KEY,
22
+ ROUTES_FLOW_PATH,
23
+ STORAGE_KEY
24
+ };
25
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,18 @@
1
+ import { RpcError } from '@mionjs/core';
2
+ import { ErrorHandler, SuccessHandler } from './types';
3
+ export declare class HandlersRegistry {
4
+ private errorHandlers;
5
+ private successHandlers;
6
+ register(handlerId: string, errorType: string, handler: ErrorHandler<any>): void;
7
+ unregister(handlerId: string, errorType: string): void;
8
+ hasHandler(handlerId: string, errorType: string): boolean;
9
+ executeHandler(handlerId: string, error: RpcError<string>): boolean;
10
+ registerSuccess(handlerId: string, handler: SuccessHandler<any>): void;
11
+ unregisterSuccess(handlerId: string): void;
12
+ hasSuccessHandler(handlerId: string): boolean;
13
+ executeSuccessHandler(handlerId: string, result: any): boolean;
14
+ clearHandlers(handlerId: string): void;
15
+ clearAll(): void;
16
+ getHandlerIds(): string[];
17
+ getErrorTypes(handlerId: string): string[];
18
+ }
@@ -0,0 +1,70 @@
1
+ class HandlersRegistry {
2
+ errorHandlers = /* @__PURE__ */ new Map();
3
+ successHandlers = /* @__PURE__ */ new Map();
4
+ /** Register an error handler for a specific handler (middleFn) and error type */
5
+ register(handlerId, errorType, handler) {
6
+ let handlerMap = this.errorHandlers.get(handlerId);
7
+ handlerMap || (handlerMap = /* @__PURE__ */ new Map(), this.errorHandlers.set(handlerId, handlerMap)), handlerMap.set(errorType, handler);
8
+ }
9
+ /** Unregister an error handler for a specific handler and error type */
10
+ unregister(handlerId, errorType) {
11
+ const handlerMap = this.errorHandlers.get(handlerId);
12
+ handlerMap && (handlerMap.delete(errorType), handlerMap.size === 0 && this.errorHandlers.delete(handlerId));
13
+ }
14
+ /** Check if an error handler exists for a specific handler ID and error type */
15
+ hasHandler(handlerId, errorType) {
16
+ return this.errorHandlers.get(handlerId)?.has(errorType) ?? !1;
17
+ }
18
+ /** Get and execute the handler for an error, if it exists */
19
+ executeHandler(handlerId, error) {
20
+ const handlerMap = this.errorHandlers.get(handlerId);
21
+ if (!handlerMap)
22
+ return !1;
23
+ const handler = handlerMap.get(error.type);
24
+ return handler ? (handler(error), !0) : !1;
25
+ }
26
+ /** Register a success handler for a specific middleFn */
27
+ registerSuccess(handlerId, handler) {
28
+ this.successHandlers.set(handlerId, handler);
29
+ }
30
+ /** Unregister a success handler for a specific middleFn */
31
+ unregisterSuccess(handlerId) {
32
+ this.successHandlers.delete(handlerId);
33
+ }
34
+ /** Check if a success handler exists for a specific handler ID */
35
+ hasSuccessHandler(handlerId) {
36
+ return this.successHandlers.has(handlerId);
37
+ }
38
+ /** Get and execute the success handler for a middleFn result, if it exists */
39
+ executeSuccessHandler(handlerId, result) {
40
+ const handler = this.successHandlers.get(handlerId);
41
+ return handler ? (handler(result), !0) : !1;
42
+ }
43
+ /** Clear all handlers (both error and success) for a specific handler ID */
44
+ clearHandlers(handlerId) {
45
+ this.errorHandlers.delete(handlerId), this.successHandlers.delete(handlerId);
46
+ }
47
+ /** Clear all registered handlers (both error and success) */
48
+ clearAll() {
49
+ this.errorHandlers.clear(), this.successHandlers.clear();
50
+ }
51
+ /** Get all registered handler IDs */
52
+ getHandlerIds() {
53
+ const errorIds = Array.from(this.errorHandlers.keys()), successIds = Array.from(this.successHandlers.keys());
54
+ return [.../* @__PURE__ */ new Set([...errorIds, ...successIds])];
55
+ }
56
+ /** Get all error types registered for a handler ID */
57
+ getErrorTypes(handlerId) {
58
+ const handlerMap = this.errorHandlers.get(handlerId);
59
+ return handlerMap ? Array.from(handlerMap.keys()) : [];
60
+ }
61
+ static __type = ["ErrorHandler", "errorHandlers", function() {
62
+ return /* @__PURE__ */ new Map();
63
+ }, "SuccessHandler", "successHandlers", function() {
64
+ return /* @__PURE__ */ new Map();
65
+ }, "handlerId", "errorType", "handler", "register", "unregister", "hasHandler", "RpcError", "error", "executeHandler", "registerSuccess", "unregisterSuccess", "hasSuccessHandler", "result", "executeSuccessHandler", "clearHandlers", "clearAll", "getHandlerIds", "getErrorTypes", "HandlersRegistry", `&&"w!EE3";>#&"w$E3%;>&P&2'&2("w!2)$0*P&2'&2($0+P&2'&2()0,P&2'"w-2.)0/P&2'"w$2)$00P&2'$01P&2')02P&2'"23)04P&2'$05P$06P&F07P&2'&F085w9`];
66
+ }
67
+ export {
68
+ HandlersRegistry
69
+ };
70
+ //# sourceMappingURL=handlersRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlersRegistry.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,30 @@
1
+ import { ResponseBody } from '@mionjs/router';
2
+ import { ClientOptions, HSubRequest, SubRequest, RSubRequest, PrefilledMiddleFnsCache } from './types.ts';
3
+ import { RunTypeError } from '@mionjs/core';
4
+ export declare class MionClientRequest<RR extends RSubRequest<any>, MiddleFnRequestsList extends HSubRequest<any>[]> {
5
+ readonly options: ClientOptions;
6
+ private readonly prefilledMiddleFnsCache;
7
+ readonly route?: RR | undefined;
8
+ readonly middleFns?: MiddleFnRequestsList | undefined;
9
+ readonly workflowSubRequests?: RSubRequest<any>[] | undefined;
10
+ readonly path: string;
11
+ readonly requestId: string;
12
+ readonly subRequestList: {
13
+ [key: string]: SubRequest<any>;
14
+ };
15
+ response: Response | undefined;
16
+ constructor(options: ClientOptions, prefilledMiddleFnsCache: PrefilledMiddleFnsCache, route?: RR | undefined, middleFns?: MiddleFnRequestsList | undefined, workflowSubRequests?: RSubRequest<any>[] | undefined);
17
+ call(): Promise<ResponseBody>;
18
+ validateParams(subReqList?: SubRequest<any>[]): Promise<RunTypeError[]>;
19
+ prefill(subReqList?: SubRequest<any>[]): Promise<void>;
20
+ removePrefill(subRequests?: SubRequest<any>[]): Promise<void>;
21
+ addSubRequest(subRequest: SubRequest<any>): void;
22
+ private onError;
23
+ private getResponseValueFromBodyOrHeader;
24
+ private restorePrefilledMiddleFns;
25
+ private restorePrefilledMiddleFnsForWorkflow;
26
+ private storePrefilledMiddleFns;
27
+ private removePrefilledMiddleFns;
28
+ private isQueryRoute;
29
+ private getPrefilledMiddleFnCacheKey;
30
+ }
@@ -0,0 +1,289 @@
1
+ import { __ΩSubRequest as ___SubRequest, __ΩClientOptions as ___ClientOptions, __ΩPrefilledMiddleFnsCache as ___PrefilledMiddleFnsCache, __ΩRSubRequest as ___RSubRequest, __ΩRequestErrors as ___RequestErrors } from "./types.js";
2
+ import { getRoutePath, toBase64Url, MION_ROUTES, isRpcError, RpcError, routesCache, HandlerType, HeadersSubset } from "@mionjs/core";
3
+ import { fetchRemoteMethodsMetadata } from "./clientMethodsMetadata.js";
4
+ import { validateSubRequests } from "./validation.js";
5
+ import { serializeRequestBody, deserializeResponseBody } from "./serializer.js";
6
+ import { ROUTES_FLOW_KEY, MAX_GET_URL_LENGTH } from "./constants.js";
7
+ const __ΩRecord = ["K", "T", "Record", `l'e#"Rb!b"Pde"!N#!w#y`];
8
+ function __assignType(fn, args) {
9
+ return fn.__type = args, fn;
10
+ }
11
+ class MionClientRequest {
12
+ options;
13
+ prefilledMiddleFnsCache;
14
+ route;
15
+ middleFns;
16
+ workflowSubRequests;
17
+ path;
18
+ requestId;
19
+ subRequestList = {};
20
+ response;
21
+ constructor(options, prefilledMiddleFnsCache, route, middleFns, workflowSubRequests) {
22
+ if (this.options = options, this.prefilledMiddleFnsCache = prefilledMiddleFnsCache, this.route = route, this.middleFns = middleFns, this.workflowSubRequests = workflowSubRequests, workflowSubRequests && workflowSubRequests.length > 0) {
23
+ const routePaths = workflowSubRequests.map(__assignType((sr) => getRoutePath(sr.pointer, this.options), ["sr", "", 'P"2!"/"'])), query = buildRoutesFlowQuery(routePaths, workflowSubRequests), flowPath = getRoutePath([ROUTES_FLOW_KEY], this.options);
24
+ this.path = `${flowPath}?data=${toBase64Url(JSON.stringify(query))}`, this.requestId = "mion-routes-flow", workflowSubRequests.forEach(__assignType((sr) => this.addSubRequest(sr), ["sr", "", 'P"2!"/"']));
25
+ } else
26
+ this.path = route ? getRoutePath(route.pointer, this.options) : "no-route", this.requestId = route ? route.id : "no-route", route && this.addSubRequest(route);
27
+ middleFns && middleFns.forEach(__assignType((middleFn) => this.addSubRequest(middleFn), ["middleFn", "", 'P"2!"/"']));
28
+ }
29
+ /** Calls a remote route */
30
+ async call() {
31
+ const errors = /* @__PURE__ */ new Map();
32
+ try {
33
+ const subRequestIds = Object.keys(this.subRequestList);
34
+ if (await fetchRemoteMethodsMetadata(subRequestIds, this.options), this.restorePrefilledMiddleFns(errors), errors.size || (validateSubRequests(subRequestIds, this, errors), errors.size))
35
+ return Promise.reject(errors);
36
+ } catch (error) {
37
+ return this.onError(error, "Error preparing request", errors), Promise.reject(errors);
38
+ }
39
+ try {
40
+ const serialized = serializeRequestBody(this), headersFromParams = extractRequestHeaders(this), url = new URL(this.path, this.options.baseURL);
41
+ let fetchOptions;
42
+ if (this.isQueryRoute() && serialized.contentType.includes("json")) {
43
+ const encoded = toBase64Url(serialized.body), testUrl = new URL(this.path, this.options.baseURL);
44
+ testUrl.searchParams.set("data", encoded), testUrl.toString().length <= MAX_GET_URL_LENGTH ? (url.searchParams.set("data", encoded), fetchOptions = {
45
+ ...this.options.fetchOptions,
46
+ method: "GET",
47
+ headers: { ...this.options.fetchOptions.headers, ...headersFromParams },
48
+ body: void 0
49
+ }) : fetchOptions = {
50
+ ...this.options.fetchOptions,
51
+ method: "POST",
52
+ headers: {
53
+ ...this.options.fetchOptions.headers,
54
+ ...headersFromParams,
55
+ "Content-Type": serialized.contentType
56
+ },
57
+ body: serialized.body
58
+ };
59
+ } else
60
+ fetchOptions = {
61
+ ...this.options.fetchOptions,
62
+ method: "POST",
63
+ headers: { ...this.options.fetchOptions.headers, ...headersFromParams, "Content-Type": serialized.contentType },
64
+ body: serialized.body
65
+ };
66
+ this.response = await fetch(url, fetchOptions);
67
+ } catch (error) {
68
+ return this.onError(error, "Error executing request", errors), Promise.reject(errors);
69
+ }
70
+ try {
71
+ const deserialized = await deserializeResponseBody(this.response);
72
+ if (MION_ROUTES.platformError in deserialized) {
73
+ const platformError = deserialized[MION_ROUTES.platformError];
74
+ return Object.entries(this.subRequestList).forEach(__assignType(([id, methodMeta]) => {
75
+ methodMeta.isResolved = !0, methodMeta.error = platformError, errors.set(id, platformError);
76
+ }, ["param0", "", 'P"2!"/"'])), Promise.reject(errors);
77
+ }
78
+ return Object.entries(this.subRequestList).forEach(__assignType(([id, methodMeta]) => {
79
+ const resp = this.getResponseValueFromBodyOrHeader(id, deserialized, this.response.headers);
80
+ methodMeta.isResolved = !0, isRpcError(resp) ? (methodMeta.error = resp, errors.set(id, resp)) : methodMeta.resolvedValue = resp;
81
+ }, ["param0", "", 'P"2!"/"'])), Object.entries(deserialized).forEach(__assignType(([id, value]) => {
82
+ !(id in this.subRequestList) && isRpcError(value) && errors.set(id, value);
83
+ }, ["param0", "", 'P"2!"/"'])), errors.size ? Promise.reject(errors) : deserialized;
84
+ } catch (error) {
85
+ return this.onError(error, "Error parsing response", errors), Promise.reject(errors);
86
+ }
87
+ }
88
+ /** Validate params */
89
+ async validateParams(subReqList) {
90
+ subReqList && subReqList.forEach(__assignType((subRequest) => this.addSubRequest(subRequest), ["subRequest", "", 'P"2!"/"']));
91
+ const errors = /* @__PURE__ */ new Map();
92
+ try {
93
+ const subRequestIds = Object.keys(this.subRequestList);
94
+ return await fetchRemoteMethodsMetadata(subRequestIds, this.options), validateSubRequests(subRequestIds, this, errors, !1), Object.values(this.subRequestList).map(__assignType((subRequest) => subRequest.error?.errorData || [], ["subRequest", "", 'P"2!"/"'])).flat();
95
+ } catch (error) {
96
+ return this.onError(error, "Error preparing request", errors), Promise.reject(errors);
97
+ }
98
+ }
99
+ /** Prefills and stores SubRequest */
100
+ async prefill(subReqList) {
101
+ subReqList && subReqList.forEach(__assignType((subRequest) => this.addSubRequest(subRequest), ["subRequest", "", 'P"2!"/"']));
102
+ const errors = /* @__PURE__ */ new Map();
103
+ try {
104
+ const subRequestIds = Object.keys(this.subRequestList);
105
+ return await fetchRemoteMethodsMetadata(subRequestIds, this.options), validateSubRequests(subRequestIds, this, errors, !1), errors.size || (serializeRequestBody(this), this.storePrefilledMiddleFns(errors), errors.size) ? Promise.reject(errors) : void 0;
106
+ } catch (error) {
107
+ return this.onError(error, "Error preparing request", errors), Promise.reject(errors);
108
+ }
109
+ }
110
+ /** Removes Prefills and stores SubRequest */
111
+ async removePrefill(subRequests) {
112
+ subRequests && subRequests.forEach(__assignType((subRequest) => this.addSubRequest(subRequest), ["subRequest", "", 'P"2!"/"'])), this.removePrefilledMiddleFns();
113
+ }
114
+ addSubRequest(subRequest) {
115
+ if (subRequest.isResolved)
116
+ throw new Error(`SubRequest ${subRequest.id} is already resolved`);
117
+ this.subRequestList[subRequest.id] = subRequest;
118
+ }
119
+ onError(error, stageMessage, errors) {
120
+ if (isRpcError(error)) {
121
+ errors.set(this.requestId, error);
122
+ return;
123
+ }
124
+ const message = error?.message ? `${stageMessage}: ${error.message}` : `${stageMessage}: Unknown Error`;
125
+ errors.set(this.requestId, new RpcError({
126
+ type: error?.name || "unknown-error",
127
+ publicMessage: message,
128
+ originalError: error instanceof Error ? error : void 0
129
+ }));
130
+ }
131
+ getResponseValueFromBodyOrHeader(id, respBody, headers) {
132
+ const headersSubset = reconstructHeadersSubsetFromResponse(id, headers);
133
+ return headersSubset || respBody[id];
134
+ }
135
+ restorePrefilledMiddleFns(errors) {
136
+ if (this.workflowSubRequests && this.workflowSubRequests.length > 0) {
137
+ this.restorePrefilledMiddleFnsForWorkflow(errors);
138
+ return;
139
+ }
140
+ const methodMeta = routesCache.getMetadata(this.requestId);
141
+ if (!methodMeta) {
142
+ errors.set(this.requestId, new RpcError({
143
+ type: "route-metadata-not-found",
144
+ publicMessage: `Metadata for Route '${this.requestId} not found.'.`
145
+ }));
146
+ return;
147
+ }
148
+ (methodMeta.middleFnIds?.filter(__assignType((id) => !!id && this.requestId !== id, ["id", "", 'P"2!"/"'])) || []).forEach(__assignType((id) => {
149
+ if (this.subRequestList[id])
150
+ return;
151
+ const cacheKey = this.getPrefilledMiddleFnCacheKey(id), cachedSubRequest = this.prefilledMiddleFnsCache.get(cacheKey);
152
+ if (cachedSubRequest) {
153
+ const clonedSubRequest = {
154
+ ...cachedSubRequest,
155
+ isResolved: !1,
156
+ resolvedValue: void 0,
157
+ error: void 0
158
+ };
159
+ this.addSubRequest(clonedSubRequest);
160
+ }
161
+ }, ["id", "", 'P"2!"/"']));
162
+ }
163
+ /** Restore prefilled middleFns for all routes in a routesFlow, deduplicating by ID */
164
+ restorePrefilledMiddleFnsForWorkflow(errors) {
165
+ const workflowRouteIds = new Set(this.workflowSubRequests.map(__assignType((sr) => sr.id, ["sr", "", 'P"2!"/"'])));
166
+ for (const routeSubRequest of this.workflowSubRequests) {
167
+ const methodMeta = routesCache.getMetadata(routeSubRequest.id);
168
+ if (!methodMeta) {
169
+ errors.set(routeSubRequest.id, new RpcError({
170
+ type: "route-metadata-not-found",
171
+ publicMessage: `Metadata for Route '${routeSubRequest.id}' not found.`
172
+ }));
173
+ continue;
174
+ }
175
+ (methodMeta.middleFnIds?.filter(__assignType((id) => !!id && !workflowRouteIds.has(id), ["id", "", 'P"2!"/"'])) || []).forEach(__assignType((id) => {
176
+ if (this.subRequestList[id])
177
+ return;
178
+ const cacheKey = this.getPrefilledMiddleFnCacheKey(id), cachedSubRequest = this.prefilledMiddleFnsCache.get(cacheKey);
179
+ if (cachedSubRequest) {
180
+ const clonedSubRequest = {
181
+ ...cachedSubRequest,
182
+ isResolved: !1,
183
+ resolvedValue: void 0,
184
+ error: void 0
185
+ };
186
+ this.addSubRequest(clonedSubRequest);
187
+ }
188
+ }, ["id", "", 'P"2!"/"']));
189
+ }
190
+ }
191
+ storePrefilledMiddleFns(errors) {
192
+ Object.keys(this.subRequestList).forEach(__assignType((id) => {
193
+ const subRequest = this.subRequestList[id], methodMeta = routesCache.getMetadata(id);
194
+ if (!methodMeta)
195
+ throw new Error(`Remote method ${id} not found.`);
196
+ if (methodMeta.type === HandlerType.route) {
197
+ errors.set(id, new RpcError({
198
+ type: "routes-cant-be-prefilled",
199
+ publicMessage: `Remote method ${id} is a route and can't be prefilled.`
200
+ }));
201
+ return;
202
+ }
203
+ const cacheKey = this.getPrefilledMiddleFnCacheKey(id);
204
+ this.prefilledMiddleFnsCache.set(cacheKey, subRequest);
205
+ }, ["id", "", 'P"2!"/"']));
206
+ }
207
+ removePrefilledMiddleFns() {
208
+ Object.keys(this.subRequestList).forEach(__assignType((id) => {
209
+ const cacheKey = this.getPrefilledMiddleFnCacheKey(id);
210
+ this.prefilledMiddleFnsCache.delete(cacheKey);
211
+ }, ["id", "", 'P"2!"/"']));
212
+ }
213
+ /** Returns true if the route is a query (isMutation === false) and not a routesFlow */
214
+ isQueryRoute() {
215
+ return this.workflowSubRequests ? !1 : routesCache.getMetadata(this.requestId)?.options?.isMutation === !1;
216
+ }
217
+ getPrefilledMiddleFnCacheKey(id) {
218
+ return `${this.options.baseURL}:${id}`;
219
+ }
220
+ static __type = ["RR", "MiddleFnRequestsList", "path", "requestId", () => ___SubRequest, "subRequestList", function() {
221
+ return {};
222
+ }, "response", () => ___ClientOptions, "options", () => ___PrefilledMiddleFnsCache, "prefilledMiddleFnsCache", "route", "middleFns", () => ___RSubRequest, "workflowSubRequests", "constructor", "ResponseBody", "call", () => ___SubRequest, "subReqList", "RunTypeError", "validateParams", () => ___SubRequest, "prefill", () => ___SubRequest, "subRequests", "removePrefill", () => ___SubRequest, "subRequest", "addSubRequest", "error", "stageMessage", () => ___RequestErrors, "errors", "onError", "id", "respBody", "headers", "getResponseValueFromBodyOrHeader", () => ___RequestErrors, "restorePrefilledMiddleFns", () => ___RequestErrors, "restorePrefilledMiddleFnsForWorkflow", () => ___RequestErrors, "storePrefilledMiddleFns", "removePrefilledMiddleFns", "isQueryRoute", "getPrefilledMiddleFnCacheKey", "MionClientRequest", 'b!b"&3#9&3$9P&"o%"LM3&9>\'P!-J3(Pn)2*:9n+2,;9e"!2-8:9e""2.8:9"o/"F208:9"01P"w2`03P"o4"F258"w6F`07P"o8"F258$`09P"o:"F2;8$`0<P"o="2>"0?P"2@&2AnB2C$0D;P&2E"w22F!2G"0H;PnI2C$0J;PnK2C$0L;PnM2C$0N;P$0O;P)0P;P&2E&0Q;5wR'];
223
+ }
224
+ function extractRequestHeaders(req) {
225
+ const headers = {}, subRequestIds = Object.keys(req.subRequestList);
226
+ for (let i = 0; i < subRequestIds.length; i++) {
227
+ const id = subRequestIds[i], subRequest = req.subRequestList[id];
228
+ if (!subRequest)
229
+ continue;
230
+ const method = routesCache.getMetadata(id);
231
+ if (!method || method.type !== HandlerType.headersMiddleFn || !method.headersParam)
232
+ continue;
233
+ const params = subRequest.params, extracted = extractHeadersFromParams(params);
234
+ Object.assign(headers, extracted);
235
+ }
236
+ return headers;
237
+ }
238
+ extractRequestHeaders.__type = [() => MionClientRequest, "req", () => __ΩRecord, "extractRequestHeaders", 'PP""7!2"&&o##/$'];
239
+ function extractHeadersFromParams(params) {
240
+ if (!params || params.length === 0)
241
+ throw new RpcError({
242
+ type: "missing-headers-param",
243
+ publicMessage: "HeadersFn requires a HeadersSubset parameter."
244
+ });
245
+ const firstParam = params[0];
246
+ if (firstParam instanceof HeadersSubset || firstParam && typeof firstParam == "object" && "headers" in firstParam && typeof firstParam.headers == "object")
247
+ return firstParam.headers;
248
+ throw new RpcError({
249
+ type: "invalid-headers-param",
250
+ publicMessage: "HeadersFn first parameter must be a HeadersSubset instance or object with headers property."
251
+ });
252
+ }
253
+ extractHeadersFromParams.__type = ["params", () => __ΩRecord, "extractHeadersFromParams", 'P"F2!&&o"#/#'];
254
+ function reconstructHeadersSubsetFromResponse(methodId, responseHeaders) {
255
+ const method = routesCache.getMetadata(methodId);
256
+ if (!method?.headersReturn?.headerNames || method.headersReturn.headerNames.length === 0)
257
+ return;
258
+ const headerNames = method.headersReturn.headerNames, headersMap = {};
259
+ for (const name of headerNames) {
260
+ const value = responseHeaders.get(name);
261
+ value != null && (headersMap[name] = value);
262
+ }
263
+ if (Object.keys(headersMap).length > 0)
264
+ return new HeadersSubset(headersMap);
265
+ }
266
+ reconstructHeadersSubsetFromResponse.__type = ["methodId", "responseHeaders", () => HeadersSubset, "reconstructHeadersSubsetFromResponse", 'P&2!!2"PP&&7#-J/$'];
267
+ function buildRoutesFlowQuery(routePaths, workflowSubRequests) {
268
+ const allMappings = [];
269
+ for (const sr of workflowSubRequests) {
270
+ const mappings = sr.mappings;
271
+ if (Array.isArray(mappings) && mappings.length > 0)
272
+ for (const ref of mappings)
273
+ allMappings.push({
274
+ fromId: ref.fromRequestId,
275
+ toId: ref.toRequestId,
276
+ bodyHash: ref.bodyHash,
277
+ paramIndex: ref.paramIndex
278
+ });
279
+ }
280
+ return {
281
+ routes: routePaths,
282
+ mappings: allMappings.length > 0 ? allMappings : void 0
283
+ };
284
+ }
285
+ buildRoutesFlowQuery.__type = ["routePaths", () => ___RSubRequest, "workflowSubRequests", "RoutesFlowQuery", "buildRoutesFlowQuery", 'P&F2!"o""F2#"w$/%'];
286
+ export {
287
+ MionClientRequest
288
+ };
289
+ //# sourceMappingURL=request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,6 @@
1
+ import { HSubRequest, RSubRequest, SubRequest, WorkflowResult } from './types.ts';
2
+ import { MapFromServerFnRef } from '@mionjs/core';
3
+ export declare function routesFlow<Routes extends RSubRequest<any>[], MiddleFns extends Record<string, HSubRequest<any>> = Record<string, never>>(routeSubRequests: [...Routes], middleFns?: MiddleFns): Promise<WorkflowResult<Routes, MiddleFns>>;
4
+ export declare const mapFromSymbol: unique symbol;
5
+ export declare function mapFrom<FromSR extends SubRequest<any>, MappedInput>(source: FromSR, mapper: (value: FromSR['resolvedValue']) => MappedInput, bodyHash?: string): MapFromServerFnRef<(value: FromSR['resolvedValue']) => MappedInput>;
6
+ export declare function isMapFromRef(ref: any): ref is MapFromServerFnRef<any>;