@mionjs/client 0.8.0-alpha.0 → 0.8.4

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 (130) hide show
  1. package/.dist/cjs/index.cjs +1 -1
  2. package/.dist/cjs/index.d.ts +7 -6
  3. package/.dist/cjs/src/client.cjs +1 -1
  4. package/.dist/cjs/src/client.cjs.map +1 -1
  5. package/.dist/cjs/src/client.d.ts +9 -7
  6. package/.dist/cjs/src/constants.cjs +1 -1
  7. package/.dist/cjs/src/constants.cjs.map +1 -1
  8. package/.dist/cjs/src/constants.d.ts +1 -1
  9. package/.dist/cjs/src/lib/clientMethodsMetadata.cjs +2 -0
  10. package/.dist/cjs/src/lib/clientMethodsMetadata.cjs.map +1 -0
  11. package/.dist/cjs/src/lib/clientMethodsMetadata.d.ts +10 -0
  12. package/.dist/cjs/src/lib/fetchRemoteMethodsMetadata.cjs +2 -0
  13. package/.dist/cjs/src/lib/fetchRemoteMethodsMetadata.cjs.map +1 -0
  14. package/.dist/cjs/src/lib/fetchRemoteMethodsMetadata.d.ts +2 -0
  15. package/.dist/cjs/src/{handlersRegistry.cjs → lib/handlersRegistry.cjs} +1 -1
  16. package/.dist/cjs/src/lib/handlersRegistry.cjs.map +1 -0
  17. package/.dist/cjs/src/{handlersRegistry.d.ts → lib/handlersRegistry.d.ts} +1 -1
  18. package/.dist/cjs/src/lib/serializer.cjs +2 -0
  19. package/.dist/cjs/src/lib/serializer.cjs.map +1 -0
  20. package/.dist/{esm/src → cjs/src/lib}/serializer.d.ts +3 -5
  21. package/.dist/cjs/src/lib/storage.cjs +2 -0
  22. package/.dist/cjs/src/lib/storage.cjs.map +1 -0
  23. package/.dist/cjs/src/lib/testUtils.cjs +2 -0
  24. package/.dist/cjs/src/lib/testUtils.cjs.map +1 -0
  25. package/.dist/cjs/src/lib/typedEvent.cjs +2 -0
  26. package/.dist/cjs/src/lib/typedEvent.cjs.map +1 -0
  27. package/.dist/{esm/src → cjs/src/lib}/typedEvent.d.ts +1 -1
  28. package/.dist/cjs/src/lib/validation.cjs +2 -0
  29. package/.dist/cjs/src/lib/validation.cjs.map +1 -0
  30. package/.dist/cjs/src/{validation.d.ts → lib/validation.d.ts} +2 -2
  31. package/.dist/cjs/src/request.cjs +1 -1
  32. package/.dist/cjs/src/request.cjs.map +1 -1
  33. package/.dist/cjs/src/request.d.ts +10 -4
  34. package/.dist/cjs/src/routesFlow.cjs +1 -1
  35. package/.dist/cjs/src/routesFlow.cjs.map +1 -1
  36. package/.dist/cjs/src/routesFlow.d.ts +2 -2
  37. package/.dist/cjs/src/subRequest.cjs +1 -1
  38. package/.dist/cjs/src/subRequest.cjs.map +1 -1
  39. package/.dist/cjs/src/subRequest.d.ts +5 -6
  40. package/.dist/cjs/src/types.cjs +1 -1
  41. package/.dist/cjs/src/types.d.ts +55 -64
  42. package/.dist/esm/index.d.ts +7 -6
  43. package/.dist/esm/index.js +10 -48
  44. package/.dist/esm/src/client.d.ts +9 -7
  45. package/.dist/esm/src/client.js +32 -58
  46. package/.dist/esm/src/client.js.map +1 -1
  47. package/.dist/esm/src/constants.d.ts +1 -1
  48. package/.dist/esm/src/constants.js +1 -1
  49. package/.dist/esm/src/constants.js.map +1 -1
  50. package/.dist/esm/src/lib/clientMethodsMetadata.d.ts +10 -0
  51. package/.dist/esm/src/lib/clientMethodsMetadata.js +125 -0
  52. package/.dist/esm/src/lib/clientMethodsMetadata.js.map +1 -0
  53. package/.dist/esm/src/lib/fetchRemoteMethodsMetadata.d.ts +2 -0
  54. package/.dist/esm/src/lib/fetchRemoteMethodsMetadata.js +31 -0
  55. package/.dist/esm/src/lib/fetchRemoteMethodsMetadata.js.map +1 -0
  56. package/.dist/esm/src/{handlersRegistry.d.ts → lib/handlersRegistry.d.ts} +1 -1
  57. package/.dist/esm/src/{handlersRegistry.js → lib/handlersRegistry.js} +0 -5
  58. package/.dist/esm/src/lib/handlersRegistry.js.map +1 -0
  59. package/.dist/{cjs/src → esm/src/lib}/serializer.d.ts +3 -5
  60. package/.dist/esm/src/{serializer.js → lib/serializer.js} +88 -72
  61. package/.dist/esm/src/lib/serializer.js.map +1 -0
  62. package/.dist/esm/src/{storage.js → lib/storage.js} +1 -6
  63. package/.dist/esm/src/lib/storage.js.map +1 -0
  64. package/.dist/esm/src/lib/testUtils.js +11 -0
  65. package/.dist/esm/src/lib/testUtils.js.map +1 -0
  66. package/.dist/{cjs/src → esm/src/lib}/typedEvent.d.ts +1 -1
  67. package/.dist/esm/src/{typedEvent.js → lib/typedEvent.js} +0 -2
  68. package/.dist/esm/src/lib/typedEvent.js.map +1 -0
  69. package/.dist/esm/src/{validation.d.ts → lib/validation.d.ts} +2 -2
  70. package/.dist/esm/src/{validation.js → lib/validation.js} +3 -10
  71. package/.dist/esm/src/lib/validation.js.map +1 -0
  72. package/.dist/esm/src/request.d.ts +10 -4
  73. package/.dist/esm/src/request.js +123 -78
  74. package/.dist/esm/src/request.js.map +1 -1
  75. package/.dist/esm/src/routesFlow.d.ts +2 -2
  76. package/.dist/esm/src/routesFlow.js +13 -14
  77. package/.dist/esm/src/routesFlow.js.map +1 -1
  78. package/.dist/esm/src/subRequest.d.ts +5 -6
  79. package/.dist/esm/src/subRequest.js +13 -28
  80. package/.dist/esm/src/subRequest.js.map +1 -1
  81. package/.dist/esm/src/types.d.ts +55 -64
  82. package/.dist/esm/src/types.js +1 -41
  83. package/.dist/esm/src/types.js.map +1 -1
  84. package/package.json +8 -14
  85. package/.dist/cjs/_virtual/jit-fns.cjs +0 -315
  86. package/.dist/cjs/_virtual/jit-fns.cjs.map +0 -1
  87. package/.dist/cjs/_virtual/pure-fns.cjs +0 -56
  88. package/.dist/cjs/_virtual/pure-fns.cjs.map +0 -1
  89. package/.dist/cjs/_virtual/router-cache.cjs +0 -2
  90. package/.dist/cjs/_virtual/router-cache.cjs.map +0 -1
  91. package/.dist/cjs/src/aot/loadClientAOTCaches.cjs +0 -2
  92. package/.dist/cjs/src/aot/loadClientAOTCaches.cjs.map +0 -1
  93. package/.dist/cjs/src/aot/loadClientAOTCaches.d.ts +0 -8
  94. package/.dist/cjs/src/clientMethodsMetadata.cjs +0 -2
  95. package/.dist/cjs/src/clientMethodsMetadata.cjs.map +0 -1
  96. package/.dist/cjs/src/clientMethodsMetadata.d.ts +0 -10
  97. package/.dist/cjs/src/handlersRegistry.cjs.map +0 -1
  98. package/.dist/cjs/src/serializer.cjs +0 -2
  99. package/.dist/cjs/src/serializer.cjs.map +0 -1
  100. package/.dist/cjs/src/storage.cjs +0 -2
  101. package/.dist/cjs/src/storage.cjs.map +0 -1
  102. package/.dist/cjs/src/testUtils.cjs +0 -2
  103. package/.dist/cjs/src/testUtils.cjs.map +0 -1
  104. package/.dist/cjs/src/typedEvent.cjs +0 -2
  105. package/.dist/cjs/src/typedEvent.cjs.map +0 -1
  106. package/.dist/cjs/src/validation.cjs +0 -2
  107. package/.dist/cjs/src/validation.cjs.map +0 -1
  108. package/.dist/esm/_virtual/jit-fns.js +0 -1391
  109. package/.dist/esm/_virtual/jit-fns.js.map +0 -1
  110. package/.dist/esm/_virtual/pure-fns.js +0 -109
  111. package/.dist/esm/_virtual/pure-fns.js.map +0 -1
  112. package/.dist/esm/_virtual/router-cache.js +0 -5
  113. package/.dist/esm/_virtual/router-cache.js.map +0 -1
  114. package/.dist/esm/src/aot/loadClientAOTCaches.d.ts +0 -8
  115. package/.dist/esm/src/aot/loadClientAOTCaches.js +0 -19
  116. package/.dist/esm/src/aot/loadClientAOTCaches.js.map +0 -1
  117. package/.dist/esm/src/clientMethodsMetadata.d.ts +0 -10
  118. package/.dist/esm/src/clientMethodsMetadata.js +0 -162
  119. package/.dist/esm/src/clientMethodsMetadata.js.map +0 -1
  120. package/.dist/esm/src/handlersRegistry.js.map +0 -1
  121. package/.dist/esm/src/serializer.js.map +0 -1
  122. package/.dist/esm/src/storage.js.map +0 -1
  123. package/.dist/esm/src/testUtils.js +0 -48
  124. package/.dist/esm/src/testUtils.js.map +0 -1
  125. package/.dist/esm/src/typedEvent.js.map +0 -1
  126. package/.dist/esm/src/validation.js.map +0 -1
  127. /package/.dist/cjs/src/{storage.d.ts → lib/storage.d.ts} +0 -0
  128. /package/.dist/cjs/src/{testUtils.d.ts → lib/testUtils.d.ts} +0 -0
  129. /package/.dist/esm/src/{storage.d.ts → lib/storage.d.ts} +0 -0
  130. /package/.dist/esm/src/{testUtils.d.ts → lib/testUtils.d.ts} +0 -0
@@ -1,104 +1,96 @@
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";
1
+ import { getRoutePath, toBase64Url, routesCache, MION_ROUTES, isRpcError, RpcError, HandlerType, HeadersSubset } from "@mionjs/core";
2
+ import { fetchRemoteMethodsMetadata } from "./lib/fetchRemoteMethodsMetadata.js";
3
+ import { createMetadataSubRequest } from "./lib/clientMethodsMetadata.js";
4
+ import { validateSubRequests } from "./lib/validation.js";
5
+ import { serializeRequestBody, deserializeResponseBody } from "./lib/serializer.js";
6
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
7
  class MionClientRequest {
12
8
  options;
13
9
  prefilledMiddleFnsCache;
14
10
  route;
15
11
  middleFns;
16
12
  workflowSubRequests;
13
+ signal;
17
14
  path;
18
15
  requestId;
19
16
  subRequestList = {};
20
17
  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!"/"']));
18
+ constructor(options, prefilledMiddleFnsCache, route, middleFns, workflowSubRequests, signal) {
19
+ if (this.options = options, this.prefilledMiddleFnsCache = prefilledMiddleFnsCache, this.route = route, this.middleFns = middleFns, this.workflowSubRequests = workflowSubRequests, this.signal = signal, workflowSubRequests && workflowSubRequests.length > 0) {
20
+ const routePaths = workflowSubRequests.map((sr) => getRoutePath(sr.pointer, this.options)), query = buildRoutesFlowQuery(routePaths, workflowSubRequests), flowPath = getRoutePath([ROUTES_FLOW_KEY], this.options);
21
+ this.path = `${flowPath}?data=${toBase64Url(JSON.stringify(query))}`, this.requestId = "mion-routes-flow", workflowSubRequests.forEach((sr) => this.addSubRequest(sr));
25
22
  } else
26
23
  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!"/"']));
24
+ middleFns && middleFns.forEach((middleFn) => this.addSubRequest(middleFn));
28
25
  }
29
26
  /** Calls a remote route */
30
27
  async call() {
31
- const errors = /* @__PURE__ */ new Map();
28
+ if (this.signal?.aborted) {
29
+ const errors = /* @__PURE__ */ new Map();
30
+ return this.onError(this.signal.reason ?? new DOMException("This operation was aborted", "AbortError"), "Request aborted", errors), Promise.reject(errors);
31
+ }
32
+ return this.makeCall(this.options.serializer);
33
+ }
34
+ /** Call flow that auto-detects missing metadata and uses optimistic serialization when needed */
35
+ async makeCall(originalSerializer, skipOptimistic) {
36
+ const errors = /* @__PURE__ */ new Map(), subRequestIds = Object.keys(this.subRequestList), isOptimistic = !subRequestIds.every((id) => routesCache.hasMetadata(id)) && !skipOptimistic;
32
37
  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))
38
+ if (isOptimistic) {
39
+ this.options.serializer = "optimistic", this.restorePrefilledMiddleFns();
40
+ const allSubRequestIds = Object.keys(this.subRequestList);
41
+ this.addSubRequest(createMetadataSubRequest(allSubRequestIds));
42
+ } else if (this.options.serializer = originalSerializer, await fetchRemoteMethodsMetadata(subRequestIds, this.options, this.signal), this.restorePrefilledMiddleFns(errors), errors.size || (validateSubRequests(subRequestIds, this, errors), errors.size))
35
43
  return Promise.reject(errors);
36
44
  } catch (error) {
37
45
  return this.onError(error, "Error preparing request", errors), Promise.reject(errors);
38
46
  }
39
47
  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
- };
48
+ let serialized;
49
+ try {
50
+ serialized = serializeRequestBody(this);
51
+ } catch (serializeError) {
52
+ if (isOptimistic)
53
+ return delete this.subRequestList[MION_ROUTES.methodsMetadata], this.makeCall(originalSerializer, !0);
54
+ throw serializeError;
55
+ }
56
+ const headersFromParams = extractRequestHeaders(this), url = new URL(this.path, this.options.baseURL), fetchOptions = buildFetchOptions(url, serialized, headersFromParams, this.options, isOptimistic, this.isQueryRoute(), this.signal);
66
57
  this.response = await fetch(url, fetchOptions);
67
58
  } catch (error) {
68
59
  return this.onError(error, "Error executing request", errors), Promise.reject(errors);
69
60
  }
70
61
  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;
62
+ if (this.signal?.aborted)
63
+ return this.onError(this.signal.reason, "Request aborted", errors), Promise.reject(errors);
64
+ const deserialized = await deserializeResponseBody(this.response, this.options);
65
+ return this.handlePlatformError(deserialized, errors) ? Promise.reject(errors) : isOptimistic && !this.signal?.aborted && this.shouldRetryWithProperSerialization(deserialized) ? this.retryWithProperSerialization(originalSerializer) : (this.resolveSubRequests(deserialized, errors, isOptimistic ? MION_ROUTES.methodsMetadata : void 0), errors.size ? Promise.reject(errors) : deserialized);
84
66
  } catch (error) {
85
67
  return this.onError(error, "Error parsing response", errors), Promise.reject(errors);
86
68
  }
87
69
  }
70
+ /** Checks if the response contains errors that require retry with proper JIT serialization */
71
+ shouldRetryWithProperSerialization(deserialized) {
72
+ return Object.values(deserialized).some((value) => isRpcError(value) && (value.type === "serialization-error" || value.type === "validation-error" || value.type === "parsing-json-request-error"));
73
+ }
74
+ /** Retries the request with proper JIT serialization after metadata has been cached */
75
+ async retryWithProperSerialization(originalSerializer) {
76
+ return delete this.subRequestList[MION_ROUTES.methodsMetadata], Object.values(this.subRequestList).forEach((sr) => {
77
+ sr.isResolved = !1, sr.resolvedValue = void 0, sr.error = void 0;
78
+ }), this.makeCall(originalSerializer);
79
+ }
88
80
  /** Validate params */
89
81
  async validateParams(subReqList) {
90
- subReqList && subReqList.forEach(__assignType((subRequest) => this.addSubRequest(subRequest), ["subRequest", "", 'P"2!"/"']));
82
+ subReqList && subReqList.forEach((subRequest) => this.addSubRequest(subRequest));
91
83
  const errors = /* @__PURE__ */ new Map();
92
84
  try {
93
85
  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();
86
+ return await fetchRemoteMethodsMetadata(subRequestIds, this.options), validateSubRequests(subRequestIds, this, errors, !1), Object.values(this.subRequestList).map((subRequest) => subRequest.error?.errorData || []).flat();
95
87
  } catch (error) {
96
88
  return this.onError(error, "Error preparing request", errors), Promise.reject(errors);
97
89
  }
98
90
  }
99
91
  /** Prefills and stores SubRequest */
100
92
  async prefill(subReqList) {
101
- subReqList && subReqList.forEach(__assignType((subRequest) => this.addSubRequest(subRequest), ["subRequest", "", 'P"2!"/"']));
93
+ subReqList && subReqList.forEach((subRequest) => this.addSubRequest(subRequest));
102
94
  const errors = /* @__PURE__ */ new Map();
103
95
  try {
104
96
  const subRequestIds = Object.keys(this.subRequestList);
@@ -109,14 +101,53 @@ class MionClientRequest {
109
101
  }
110
102
  /** Removes Prefills and stores SubRequest */
111
103
  async removePrefill(subRequests) {
112
- subRequests && subRequests.forEach(__assignType((subRequest) => this.addSubRequest(subRequest), ["subRequest", "", 'P"2!"/"'])), this.removePrefilledMiddleFns();
104
+ subRequests && subRequests.forEach((subRequest) => this.addSubRequest(subRequest)), this.removePrefilledMiddleFns();
113
105
  }
114
106
  addSubRequest(subRequest) {
115
107
  if (subRequest.isResolved)
116
108
  throw new Error(`SubRequest ${subRequest.id} is already resolved`);
117
109
  this.subRequestList[subRequest.id] = subRequest;
118
110
  }
111
+ /** Checks for platform-level errors and propagates them to all subrequests. Returns true if a platform error was found */
112
+ handlePlatformError(deserialized, errors) {
113
+ if (!(MION_ROUTES.platformError in deserialized))
114
+ return !1;
115
+ const platformError = deserialized[MION_ROUTES.platformError];
116
+ return Object.entries(this.subRequestList).forEach(([id, methodMeta]) => {
117
+ methodMeta.isResolved = !0, methodMeta.error = platformError, errors.set(id, platformError);
118
+ }), !0;
119
+ }
120
+ /** Resolves sub request values from the deserialized response body and collects errors */
121
+ resolveSubRequests(deserialized, errors, skipId) {
122
+ Object.entries(this.subRequestList).forEach(([id, methodMeta]) => {
123
+ if (id === skipId)
124
+ return;
125
+ const resp = this.getResponseValueFromBodyOrHeader(id, deserialized, this.response.headers);
126
+ methodMeta.isResolved = !0, isRpcError(resp) ? (methodMeta.error = resp, errors.set(id, resp)) : methodMeta.resolvedValue = resp;
127
+ }), Object.entries(deserialized).forEach(([id, value]) => {
128
+ !(id in this.subRequestList) && isRpcError(value) && errors.set(id, value);
129
+ });
130
+ }
119
131
  onError(error, stageMessage, errors) {
132
+ const reason = this.signal?.aborted ? this.signal.reason : void 0;
133
+ if (reason instanceof DOMException) {
134
+ if (reason.name === "TimeoutError") {
135
+ errors.set(this.requestId, new RpcError({
136
+ type: "request-timeout",
137
+ publicMessage: "Request timed out",
138
+ originalError: error instanceof Error ? error : void 0
139
+ }));
140
+ return;
141
+ }
142
+ if (reason.name === "AbortError") {
143
+ errors.set(this.requestId, new RpcError({
144
+ type: "request-aborted",
145
+ publicMessage: "Request was aborted",
146
+ originalError: error instanceof Error ? error : void 0
147
+ }));
148
+ return;
149
+ }
150
+ }
120
151
  if (isRpcError(error)) {
121
152
  errors.set(this.requestId, error);
122
153
  return;
@@ -132,6 +163,7 @@ class MionClientRequest {
132
163
  const headersSubset = reconstructHeadersSubsetFromResponse(id, headers);
133
164
  return headersSubset || respBody[id];
134
165
  }
166
+ /** When errors is omitted, silently skips routes without cached metadata (used by optimistic flow) */
135
167
  restorePrefilledMiddleFns(errors) {
136
168
  if (this.workflowSubRequests && this.workflowSubRequests.length > 0) {
137
169
  this.restorePrefilledMiddleFnsForWorkflow(errors);
@@ -139,13 +171,13 @@ class MionClientRequest {
139
171
  }
140
172
  const methodMeta = routesCache.getMetadata(this.requestId);
141
173
  if (!methodMeta) {
142
- errors.set(this.requestId, new RpcError({
174
+ errors && errors.set(this.requestId, new RpcError({
143
175
  type: "route-metadata-not-found",
144
176
  publicMessage: `Metadata for Route '${this.requestId} not found.'.`
145
177
  }));
146
178
  return;
147
179
  }
148
- (methodMeta.middleFnIds?.filter(__assignType((id) => !!id && this.requestId !== id, ["id", "", 'P"2!"/"'])) || []).forEach(__assignType((id) => {
180
+ (methodMeta.middleFnIds?.filter((id) => !!id && this.requestId !== id) || []).forEach((id) => {
149
181
  if (this.subRequestList[id])
150
182
  return;
151
183
  const cacheKey = this.getPrefilledMiddleFnCacheKey(id), cachedSubRequest = this.prefilledMiddleFnsCache.get(cacheKey);
@@ -158,21 +190,21 @@ class MionClientRequest {
158
190
  };
159
191
  this.addSubRequest(clonedSubRequest);
160
192
  }
161
- }, ["id", "", 'P"2!"/"']));
193
+ });
162
194
  }
163
195
  /** Restore prefilled middleFns for all routes in a routesFlow, deduplicating by ID */
164
196
  restorePrefilledMiddleFnsForWorkflow(errors) {
165
- const workflowRouteIds = new Set(this.workflowSubRequests.map(__assignType((sr) => sr.id, ["sr", "", 'P"2!"/"'])));
197
+ const workflowRouteIds = new Set(this.workflowSubRequests.map((sr) => sr.id));
166
198
  for (const routeSubRequest of this.workflowSubRequests) {
167
199
  const methodMeta = routesCache.getMetadata(routeSubRequest.id);
168
200
  if (!methodMeta) {
169
- errors.set(routeSubRequest.id, new RpcError({
201
+ errors && errors.set(routeSubRequest.id, new RpcError({
170
202
  type: "route-metadata-not-found",
171
203
  publicMessage: `Metadata for Route '${routeSubRequest.id}' not found.`
172
204
  }));
173
205
  continue;
174
206
  }
175
- (methodMeta.middleFnIds?.filter(__assignType((id) => !!id && !workflowRouteIds.has(id), ["id", "", 'P"2!"/"'])) || []).forEach(__assignType((id) => {
207
+ (methodMeta.middleFnIds?.filter((id) => !!id && !workflowRouteIds.has(id)) || []).forEach((id) => {
176
208
  if (this.subRequestList[id])
177
209
  return;
178
210
  const cacheKey = this.getPrefilledMiddleFnCacheKey(id), cachedSubRequest = this.prefilledMiddleFnsCache.get(cacheKey);
@@ -185,11 +217,11 @@ class MionClientRequest {
185
217
  };
186
218
  this.addSubRequest(clonedSubRequest);
187
219
  }
188
- }, ["id", "", 'P"2!"/"']));
220
+ });
189
221
  }
190
222
  }
191
223
  storePrefilledMiddleFns(errors) {
192
- Object.keys(this.subRequestList).forEach(__assignType((id) => {
224
+ Object.keys(this.subRequestList).forEach((id) => {
193
225
  const subRequest = this.subRequestList[id], methodMeta = routesCache.getMetadata(id);
194
226
  if (!methodMeta)
195
227
  throw new Error(`Remote method ${id} not found.`);
@@ -202,13 +234,13 @@ class MionClientRequest {
202
234
  }
203
235
  const cacheKey = this.getPrefilledMiddleFnCacheKey(id);
204
236
  this.prefilledMiddleFnsCache.set(cacheKey, subRequest);
205
- }, ["id", "", 'P"2!"/"']));
237
+ });
206
238
  }
207
239
  removePrefilledMiddleFns() {
208
- Object.keys(this.subRequestList).forEach(__assignType((id) => {
240
+ Object.keys(this.subRequestList).forEach((id) => {
209
241
  const cacheKey = this.getPrefilledMiddleFnCacheKey(id);
210
242
  this.prefilledMiddleFnsCache.delete(cacheKey);
211
- }, ["id", "", 'P"2!"/"']));
243
+ });
212
244
  }
213
245
  /** Returns true if the route is a query (isMutation === false) and not a routesFlow */
214
246
  isQueryRoute() {
@@ -217,9 +249,26 @@ class MionClientRequest {
217
249
  getPrefilledMiddleFnCacheKey(id) {
218
250
  return `${this.options.baseURL}:${id}`;
219
251
  }
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'];
252
+ }
253
+ function buildFetchOptions(url, serialized, headersFromParams, options, isOptimistic, isQuery, signal) {
254
+ if (!isOptimistic && isQuery && serialized.contentType.includes("json")) {
255
+ const encoded = toBase64Url(serialized.body), testUrl = new URL(url.pathname + url.search, url.origin);
256
+ if (testUrl.searchParams.set("data", encoded), testUrl.toString().length <= MAX_GET_URL_LENGTH)
257
+ return url.searchParams.set("data", encoded), {
258
+ ...options.fetchOptions,
259
+ method: "GET",
260
+ headers: { ...options.fetchOptions.headers, ...headersFromParams },
261
+ body: void 0,
262
+ signal
263
+ };
264
+ }
265
+ return {
266
+ ...options.fetchOptions,
267
+ method: "POST",
268
+ headers: { ...options.fetchOptions.headers, ...headersFromParams, "Content-Type": serialized.contentType },
269
+ body: serialized.body,
270
+ signal
271
+ };
223
272
  }
224
273
  function extractRequestHeaders(req) {
225
274
  const headers = {}, subRequestIds = Object.keys(req.subRequestList);
@@ -235,7 +284,6 @@ function extractRequestHeaders(req) {
235
284
  }
236
285
  return headers;
237
286
  }
238
- extractRequestHeaders.__type = [() => MionClientRequest, "req", () => __ΩRecord, "extractRequestHeaders", 'PP""7!2"&&o##/$'];
239
287
  function extractHeadersFromParams(params) {
240
288
  if (!params || params.length === 0)
241
289
  throw new RpcError({
@@ -250,7 +298,6 @@ function extractHeadersFromParams(params) {
250
298
  publicMessage: "HeadersFn first parameter must be a HeadersSubset instance or object with headers property."
251
299
  });
252
300
  }
253
- extractHeadersFromParams.__type = ["params", () => __ΩRecord, "extractHeadersFromParams", 'P"F2!&&o"#/#'];
254
301
  function reconstructHeadersSubsetFromResponse(methodId, responseHeaders) {
255
302
  const method = routesCache.getMetadata(methodId);
256
303
  if (!method?.headersReturn?.headerNames || method.headersReturn.headerNames.length === 0)
@@ -263,7 +310,6 @@ function reconstructHeadersSubsetFromResponse(methodId, responseHeaders) {
263
310
  if (Object.keys(headersMap).length > 0)
264
311
  return new HeadersSubset(headersMap);
265
312
  }
266
- reconstructHeadersSubsetFromResponse.__type = ["methodId", "responseHeaders", () => HeadersSubset, "reconstructHeadersSubsetFromResponse", 'P&2!!2"PP&&7#-J/$'];
267
313
  function buildRoutesFlowQuery(routePaths, workflowSubRequests) {
268
314
  const allMappings = [];
269
315
  for (const sr of workflowSubRequests) {
@@ -282,7 +328,6 @@ function buildRoutesFlowQuery(routePaths, workflowSubRequests) {
282
328
  mappings: allMappings.length > 0 ? allMappings : void 0
283
329
  };
284
330
  }
285
- buildRoutesFlowQuery.__type = ["routePaths", () => ___RSubRequest, "workflowSubRequests", "RoutesFlowQuery", "buildRoutesFlowQuery", 'P&F2!"o""F2#"w$/%'];
286
331
  export {
287
332
  MionClientRequest
288
333
  };
@@ -1 +1 @@
1
- {"version":3,"file":"request.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"request.js","sources":["../../../src/request.ts"],"sourcesContent":["/* ########\n * 2023 mion\n * Author: Ma-jerez\n * License: MIT\n * The software is provided \"as is\", without warranty of any kind.\n * ######## */\n\nimport type {ResponseBody} from '@mionjs/router';\nimport {\n ClientOptions,\n MiddlewareSubRequest,\n SubRequest,\n RouteSubRequest,\n RequestErrors,\n PrefilledMiddleFnsCache,\n} from './types.ts';\nimport type {RunTypeError, RoutesFlowQuery, RoutesFlowMapping} from '@mionjs/core';\nimport {RpcError, isRpcError, routesCache, MION_ROUTES, HandlerType, HeadersSubset, toBase64Url} from '@mionjs/core';\nimport type {SerializerMode} from '@mionjs/core';\nimport {getRoutePath} from '@mionjs/core';\nimport {fetchRemoteMethodsMetadata} from './lib/fetchRemoteMethodsMetadata.ts';\nimport {createMetadataSubRequest} from './lib/clientMethodsMetadata.ts';\nimport {validateSubRequests} from './lib/validation.ts';\nimport {serializeRequestBody, deserializeResponseBody} from './lib/serializer.ts';\nimport {ROUTES_FLOW_KEY, MAX_GET_URL_LENGTH} from './constants.ts';\n\nexport class MionClientRequest<RR extends RouteSubRequest<any>, MiddleFnRequestsList extends MiddlewareSubRequest<any>[]> {\n readonly path: string;\n readonly requestId: string;\n readonly subRequestList: {[key: string]: SubRequest<any>} = {};\n response: Response | undefined;\n\n constructor(\n public readonly options: ClientOptions,\n private readonly prefilledMiddleFnsCache: PrefilledMiddleFnsCache,\n public readonly route?: RR,\n public readonly middleFns?: MiddleFnRequestsList,\n /** Array of routesFlow subrequests when executing a routesFlow */\n public readonly workflowSubRequests?: RouteSubRequest<any>[],\n /** Composed abort signal for this request */\n public readonly signal?: AbortSignal\n ) {\n if (workflowSubRequests && workflowSubRequests.length > 0) {\n const routePaths = workflowSubRequests.map((sr) => getRoutePath(sr.pointer, this.options));\n const query = buildRoutesFlowQuery(routePaths, workflowSubRequests);\n const flowPath = getRoutePath([ROUTES_FLOW_KEY], this.options);\n this.path = `${flowPath}?data=${toBase64Url(JSON.stringify(query))}`;\n this.requestId = 'mion-routes-flow';\n workflowSubRequests.forEach((sr) => this.addSubRequest(sr));\n } else {\n this.path = route ? getRoutePath(route.pointer, this.options) : 'no-route';\n this.requestId = route ? route.id : 'no-route';\n if (route) this.addSubRequest(route);\n }\n if (middleFns) middleFns.forEach((middleFn) => this.addSubRequest(middleFn));\n }\n\n /** Calls a remote route */\n async call(): Promise<ResponseBody> {\n if (this.signal?.aborted) {\n const errors: RequestErrors = new Map();\n this.onError(\n this.signal.reason ?? new DOMException('This operation was aborted', 'AbortError'),\n 'Request aborted',\n errors\n );\n return Promise.reject(errors);\n }\n return this.makeCall(this.options.serializer);\n }\n\n /** Call flow that auto-detects missing metadata and uses optimistic serialization when needed */\n private async makeCall(originalSerializer: SerializerMode, skipOptimistic?: boolean): Promise<ResponseBody> {\n const errors: RequestErrors = new Map();\n const subRequestIds = Object.keys(this.subRequestList);\n const allCached = subRequestIds.every((id) => routesCache.hasMetadata(id));\n const isOptimistic = !allCached && !skipOptimistic;\n\n try {\n if (isOptimistic) {\n (this.options as any).serializer = 'optimistic';\n this.restorePrefilledMiddleFns();\n // Add metadata subrequest (after prefilled restore so we include all IDs)\n const allSubRequestIds = Object.keys(this.subRequestList);\n this.addSubRequest(createMetadataSubRequest(allSubRequestIds));\n } else {\n (this.options as any).serializer = originalSerializer;\n await fetchRemoteMethodsMetadata(subRequestIds, this.options, this.signal);\n this.restorePrefilledMiddleFns(errors);\n if (errors.size) return Promise.reject(errors);\n validateSubRequests(subRequestIds, this, errors);\n if (errors.size) return Promise.reject(errors);\n }\n } catch (error: any) {\n this.onError(error, 'Error preparing request', errors);\n return Promise.reject(errors);\n }\n\n try {\n let serialized: ReturnType<typeof serializeRequestBody>;\n try {\n serialized = serializeRequestBody(this);\n } catch (serializeError) {\n if (isOptimistic) {\n // JSON.stringify failed → fall back to standard, will fetch metadata\n delete this.subRequestList[MION_ROUTES.methodsMetadata];\n return this.makeCall(originalSerializer, true);\n }\n throw serializeError;\n }\n\n const headersFromParams = extractRequestHeaders(this);\n const url = new URL(this.path, this.options.baseURL);\n const fetchOptions = buildFetchOptions(\n url,\n serialized,\n headersFromParams,\n this.options,\n isOptimistic,\n this.isQueryRoute(),\n this.signal\n );\n this.response = await fetch(url, fetchOptions);\n } catch (error: any) {\n this.onError(error, 'Error executing request', errors);\n return Promise.reject(errors);\n }\n\n try {\n // If the signal already aborted while fetch was in flight, don't try to read a possibly\n // truncated response body — surface the abort directly.\n if (this.signal?.aborted) {\n this.onError(this.signal.reason, 'Request aborted', errors);\n return Promise.reject(errors);\n }\n const deserialized = await deserializeResponseBody(this.response, this.options);\n if (this.handlePlatformError(deserialized, errors)) return Promise.reject(errors);\n\n // Never retry an aborted request — the user explicitly canceled it.\n if (isOptimistic && !this.signal?.aborted && this.shouldRetryWithProperSerialization(deserialized)) {\n return this.retryWithProperSerialization(originalSerializer);\n }\n\n this.resolveSubRequests(deserialized, errors, isOptimistic ? MION_ROUTES.methodsMetadata : undefined);\n if (errors.size) return Promise.reject(errors);\n return deserialized;\n } catch (error) {\n this.onError(error, 'Error parsing response', errors);\n return Promise.reject(errors);\n }\n }\n\n /** Checks if the response contains errors that require retry with proper JIT serialization */\n private shouldRetryWithProperSerialization(deserialized: ResponseBody): boolean {\n return Object.values(deserialized).some(\n (value) =>\n isRpcError(value) &&\n (value.type === 'serialization-error' ||\n value.type === 'validation-error' ||\n value.type === 'parsing-json-request-error')\n );\n }\n\n /** Retries the request with proper JIT serialization after metadata has been cached */\n private async retryWithProperSerialization(originalSerializer: SerializerMode): Promise<ResponseBody> {\n delete this.subRequestList[MION_ROUTES.methodsMetadata];\n Object.values(this.subRequestList).forEach((sr) => {\n sr.isResolved = false;\n sr.resolvedValue = undefined;\n sr.error = undefined;\n });\n return this.makeCall(originalSerializer);\n }\n\n /** Validate params */\n async validateParams(subReqList?: SubRequest<any>[]): Promise<RunTypeError[]> {\n if (subReqList) subReqList.forEach((subRequest) => this.addSubRequest(subRequest));\n const errors: RequestErrors = new Map();\n try {\n const subRequestIds = Object.keys(this.subRequestList);\n await fetchRemoteMethodsMetadata(subRequestIds, this.options);\n validateSubRequests(subRequestIds, this, errors, false);\n return Object.values(this.subRequestList)\n .map((subRequest) => subRequest.error?.errorData || [])\n .flat();\n } catch (error: any) {\n this.onError(error, 'Error preparing request', errors);\n return Promise.reject(errors);\n }\n }\n\n /** Prefills and stores SubRequest */\n async prefill(subReqList?: SubRequest<any>[]): Promise<void> {\n if (subReqList) subReqList.forEach((subRequest) => this.addSubRequest(subRequest));\n const errors: RequestErrors = new Map();\n try {\n const subRequestIds = Object.keys(this.subRequestList);\n await fetchRemoteMethodsMetadata(subRequestIds, this.options);\n\n validateSubRequests(subRequestIds, this, errors, false);\n if (errors.size) return Promise.reject(errors);\n\n serializeRequestBody(this);\n\n this.storePrefilledMiddleFns(errors);\n if (errors.size) return Promise.reject(errors);\n\n return;\n } catch (error: any) {\n this.onError(error, 'Error preparing request', errors);\n return Promise.reject(errors);\n }\n }\n\n /** Removes Prefills and stores SubRequest */\n async removePrefill(subRequests?: SubRequest<any>[]): Promise<void> {\n if (subRequests) subRequests.forEach((subRequest) => this.addSubRequest(subRequest));\n this.removePrefilledMiddleFns();\n }\n\n addSubRequest(subRequest: SubRequest<any>) {\n if (subRequest.isResolved) throw new Error(`SubRequest ${subRequest.id} is already resolved`);\n this.subRequestList[subRequest.id] = subRequest;\n }\n\n /** Checks for platform-level errors and propagates them to all subrequests. Returns true if a platform error was found */\n private handlePlatformError(deserialized: ResponseBody, errors: RequestErrors): boolean {\n if (!(MION_ROUTES.platformError in deserialized)) return false;\n const platformError = deserialized[MION_ROUTES.platformError];\n Object.entries(this.subRequestList).forEach(([id, methodMeta]) => {\n methodMeta.isResolved = true;\n methodMeta.error = platformError as RpcError<string>;\n errors.set(id, platformError as RpcError<string>);\n });\n return true;\n }\n\n /** Resolves sub request values from the deserialized response body and collects errors */\n private resolveSubRequests(deserialized: ResponseBody, errors: RequestErrors, skipId?: string): void {\n Object.entries(this.subRequestList).forEach(([id, methodMeta]) => {\n if (id === skipId) return;\n const resp = this.getResponseValueFromBodyOrHeader(id, deserialized, (this.response as Response).headers);\n methodMeta.isResolved = true;\n if (isRpcError(resp)) {\n methodMeta.error = resp;\n errors.set(id, resp);\n } else {\n methodMeta.resolvedValue = resp;\n }\n });\n\n Object.entries(deserialized).forEach(([id, value]) => {\n if (!(id in this.subRequestList) && isRpcError(value)) {\n errors.set(id, value);\n }\n });\n }\n\n private onError(error: any, stageMessage: string, errors: RequestErrors): void {\n // Detect abort/timeout via signal.reason FIRST. We must do this before the isRpcError early return\n // because errors that surface from later stages (deserialization, retry, etc.) may already be\n // wrapped as RpcError but the user-facing reason is still abort/timeout.\n const reason = this.signal?.aborted ? this.signal.reason : undefined;\n if (reason instanceof DOMException) {\n if (reason.name === 'TimeoutError') {\n errors.set(\n this.requestId,\n new RpcError({\n type: 'request-timeout',\n publicMessage: 'Request timed out',\n originalError: error instanceof Error ? error : undefined,\n })\n );\n return;\n }\n if (reason.name === 'AbortError') {\n errors.set(\n this.requestId,\n new RpcError({\n type: 'request-aborted',\n publicMessage: 'Request was aborted',\n originalError: error instanceof Error ? error : undefined,\n })\n );\n return;\n }\n }\n if (isRpcError(error)) {\n errors.set(this.requestId, error);\n return;\n }\n const message = error?.message ? `${stageMessage}: ${error.message}` : `${stageMessage}: Unknown Error`;\n errors.set(\n this.requestId,\n new RpcError({\n type: error?.name || 'unknown-error',\n publicMessage: message,\n originalError: error instanceof Error ? error : undefined,\n })\n );\n }\n\n private getResponseValueFromBodyOrHeader(id: string, respBody: ResponseBody, headers: Headers): any {\n const headersSubset = reconstructHeadersSubsetFromResponse(id, headers);\n if (headersSubset) return headersSubset;\n return respBody[id];\n }\n\n /** When errors is omitted, silently skips routes without cached metadata (used by optimistic flow) */\n private restorePrefilledMiddleFns(errors?: RequestErrors): void {\n if (this.workflowSubRequests && this.workflowSubRequests.length > 0) {\n this.restorePrefilledMiddleFnsForWorkflow(errors);\n return;\n }\n\n const methodMeta = routesCache.getMetadata(this.requestId);\n if (!methodMeta) {\n if (errors) {\n errors.set(\n this.requestId,\n new RpcError({\n type: 'route-metadata-not-found',\n publicMessage: `Metadata for Route '${this.requestId} not found.'.`,\n })\n );\n }\n return;\n }\n const missingIds = methodMeta.middleFnIds?.filter((id) => !!id && this.requestId !== id) || [];\n missingIds.forEach((id) => {\n const subRequest = this.subRequestList[id];\n if (subRequest) return;\n const cacheKey = this.getPrefilledMiddleFnCacheKey(id);\n const cachedSubRequest = this.prefilledMiddleFnsCache.get(cacheKey);\n if (cachedSubRequest) {\n const clonedSubRequest: SubRequest<any> = {\n ...cachedSubRequest,\n isResolved: false,\n resolvedValue: undefined,\n error: undefined,\n };\n this.addSubRequest(clonedSubRequest);\n }\n });\n }\n\n /** Restore prefilled middleFns for all routes in a routesFlow, deduplicating by ID */\n private restorePrefilledMiddleFnsForWorkflow(errors?: RequestErrors): void {\n const workflowRouteIds = new Set(this.workflowSubRequests!.map((sr) => sr.id));\n\n for (const routeSubRequest of this.workflowSubRequests!) {\n const methodMeta = routesCache.getMetadata(routeSubRequest.id);\n if (!methodMeta) {\n if (errors) {\n errors.set(\n routeSubRequest.id,\n new RpcError({\n type: 'route-metadata-not-found',\n publicMessage: `Metadata for Route '${routeSubRequest.id}' not found.`,\n })\n );\n }\n continue;\n }\n const missingIds = methodMeta.middleFnIds?.filter((id) => !!id && !workflowRouteIds.has(id)) || [];\n missingIds.forEach((id) => {\n const subRequest = this.subRequestList[id];\n if (subRequest) return;\n const cacheKey = this.getPrefilledMiddleFnCacheKey(id);\n const cachedSubRequest = this.prefilledMiddleFnsCache.get(cacheKey);\n if (cachedSubRequest) {\n const clonedSubRequest: SubRequest<any> = {\n ...cachedSubRequest,\n isResolved: false,\n resolvedValue: undefined,\n error: undefined,\n };\n this.addSubRequest(clonedSubRequest);\n }\n });\n }\n }\n\n private storePrefilledMiddleFns(errors: RequestErrors): void {\n Object.keys(this.subRequestList).forEach((id) => {\n const subRequest = this.subRequestList[id];\n const methodMeta = routesCache.getMetadata(id);\n if (!methodMeta) throw new Error(`Remote method ${id} not found.`);\n if (methodMeta.type === HandlerType.route) {\n errors.set(\n id,\n new RpcError({\n type: 'routes-cant-be-prefilled',\n publicMessage: `Remote method ${id} is a route and can't be prefilled.`,\n })\n );\n return;\n }\n const cacheKey = this.getPrefilledMiddleFnCacheKey(id);\n this.prefilledMiddleFnsCache.set(cacheKey, subRequest);\n });\n }\n\n private removePrefilledMiddleFns(): void {\n Object.keys(this.subRequestList).forEach((id) => {\n const cacheKey = this.getPrefilledMiddleFnCacheKey(id);\n this.prefilledMiddleFnsCache.delete(cacheKey);\n });\n }\n\n /** Returns true if the route is a query (isMutation === false) and not a routesFlow */\n private isQueryRoute(): boolean {\n if (this.workflowSubRequests) return false;\n const meta = routesCache.getMetadata(this.requestId);\n // strict false value required for queries\n return meta?.options?.isMutation === false;\n }\n\n private getPrefilledMiddleFnCacheKey(id: string): string {\n return `${this.options.baseURL}:${id}`;\n }\n}\n\n/**\n * Builds the RequestInit options for the fetch call, choosing between GET and POST:\n * - GET (query): Used for non-mutation routes (isMutation === false) with JSON serialization,\n * where the base64url-encoded body fits within the URL length limit. The serialized data is\n * sent as a `?data=` query parameter, with no request body.\n * - POST (mutation/route call): Used for all other cases: mutations, optimistic requests,\n * routesFlow calls, non-JSON serializers, or when the GET URL would exceed MAX_GET_URL_LENGTH.\n * The serialized data is sent in the request body with the appropriate Content-Type header.\n */\nfunction buildFetchOptions(\n url: URL,\n serialized: ReturnType<typeof serializeRequestBody>,\n headersFromParams: Record<string, string>,\n options: ClientOptions,\n isOptimistic: boolean,\n isQuery: boolean,\n signal?: AbortSignal\n): RequestInit {\n if (!isOptimistic && isQuery && serialized.contentType.includes('json')) {\n const encoded = toBase64Url(serialized.body as string);\n const testUrl = new URL(url.pathname + url.search, url.origin);\n testUrl.searchParams.set('data', encoded);\n\n if (testUrl.toString().length <= MAX_GET_URL_LENGTH) {\n url.searchParams.set('data', encoded);\n return {\n ...options.fetchOptions,\n method: 'GET',\n headers: {...options.fetchOptions.headers, ...headersFromParams},\n body: undefined,\n signal,\n };\n }\n }\n\n return {\n ...options.fetchOptions,\n method: 'POST',\n headers: {...options.fetchOptions.headers, ...headersFromParams, 'Content-Type': serialized.contentType},\n body: serialized.body as BodyInit,\n signal,\n };\n}\n\n/** Extracts headers from HeadersSubset params in headersFn methods */\nfunction extractRequestHeaders(req: MionClientRequest<any, any>): Record<string, string> {\n const headers: Record<string, string> = {};\n const subRequestIds = Object.keys(req.subRequestList);\n\n for (let i = 0; i < subRequestIds.length; i++) {\n const id = subRequestIds[i];\n const subRequest = req.subRequestList[id];\n if (!subRequest) continue;\n\n const method = routesCache.getMetadata(id);\n if (!method || method.type !== HandlerType.headersMiddleFn || !method.headersParam) continue;\n\n const params = subRequest.params;\n const extracted = extractHeadersFromParams(params);\n Object.assign(headers, extracted);\n }\n\n return headers;\n}\n\n/** Extracts headers from a HeadersSubset parameter */\nfunction extractHeadersFromParams(params: any[]): Record<string, string> {\n if (!params || params.length === 0) {\n throw new RpcError({\n type: 'missing-headers-param',\n publicMessage: 'HeadersFn requires a HeadersSubset parameter.',\n });\n }\n\n const firstParam = params[0];\n\n if (firstParam instanceof HeadersSubset) {\n return firstParam.headers as Record<string, string>;\n }\n\n if (firstParam && typeof firstParam === 'object' && 'headers' in firstParam && typeof firstParam.headers === 'object') {\n return firstParam.headers as Record<string, string>;\n }\n\n throw new RpcError({\n type: 'invalid-headers-param',\n publicMessage: 'HeadersFn first parameter must be a HeadersSubset instance or object with headers property.',\n });\n}\n\n/** Reconstructs a HeadersSubset from HTTP response headers for methods that return HeadersSubset */\nfunction reconstructHeadersSubsetFromResponse(\n methodId: string,\n responseHeaders: Headers\n): HeadersSubset<string, string> | undefined {\n const method = routesCache.getMetadata(methodId);\n\n if (!method?.headersReturn?.headerNames || method.headersReturn.headerNames.length === 0) {\n return undefined;\n }\n\n const headerNames = method.headersReturn.headerNames;\n const headersMap: Record<string, string> = {};\n\n for (const name of headerNames) {\n const value = responseHeaders.get(name);\n if (value !== undefined && value !== null) {\n headersMap[name] = value;\n }\n }\n\n if (Object.keys(headersMap).length > 0) {\n return new HeadersSubset(headersMap);\n }\n\n return undefined;\n}\n\n/** Builds a RoutesFlowQuery from route paths and subrequests, collecting any mapFrom mappings */\nfunction buildRoutesFlowQuery(routePaths: string[], workflowSubRequests: RouteSubRequest<any>[]): RoutesFlowQuery {\n const allMappings: RoutesFlowMapping[] = [];\n for (const sr of workflowSubRequests) {\n // Duck-type check for mappings array (avoids circular import of MionSubRequest)\n const mappings = (sr as any).mappings;\n if (Array.isArray(mappings) && mappings.length > 0) {\n for (const ref of mappings) {\n allMappings.push({\n fromId: ref.fromRequestId,\n toId: ref.toRequestId,\n bodyHash: ref.bodyHash,\n paramIndex: ref.paramIndex,\n });\n }\n }\n }\n return {\n routes: routePaths,\n mappings: allMappings.length > 0 ? allMappings : undefined,\n };\n}\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { HSubRequest, RSubRequest, SubRequest, WorkflowResult } from './types.ts';
1
+ import { RouteSubRequest, RoutesFlowBuilder, SubRequest } from './types.ts';
2
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>>;
3
+ export declare function routesFlow<Routes extends RouteSubRequest<any>[]>(routeSubRequests: [...Routes]): RoutesFlowBuilder<Routes>;
4
4
  export declare const mapFromSymbol: unique symbol;
5
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
6
  export declare function isMapFromRef(ref: any): ref is MapFromServerFnRef<any>;
@@ -1,8 +1,5 @@
1
- import { PURE_SERVER_FN_NAMESPACE, RpcError, __ΩMapFromServerFnRef as ___MapFromServerFnRef } from "@mionjs/core";
2
- function __assignType(fn, args) {
3
- return fn.__type = args, fn;
4
- }
5
- async function routesFlow(routeSubRequests, middleFns) {
1
+ import { PURE_SERVER_FN_NAMESPACE, RpcError } from "@mionjs/core";
2
+ function routesFlow(routeSubRequests) {
6
3
  if (!routeSubRequests || routeSubRequests.length === 0)
7
4
  throw new RpcError({
8
5
  type: "routesFlow-empty-routes",
@@ -21,12 +18,15 @@ async function routesFlow(routeSubRequests, middleFns) {
21
18
  type: "routesFlow-client-mismatch",
22
19
  publicMessage: `All subrequests in a routesFlow must use the same client instance. Subrequest at index ${i} has a different client.`
23
20
  });
24
- const [results, errors, middleFnResults, middleFnErrors] = await client.executeCallWithWorkflow(routeSubRequests, middleFns ?? {}), emptyResults = routeSubRequests.map(() => {
25
- }), emptyErrors = routeSubRequests.map(() => {
26
- });
27
- return [results ?? emptyResults, errors ?? emptyErrors, middleFnResults, middleFnErrors];
21
+ return {
22
+ async call(setup) {
23
+ const middleFns = setup?.middleFns ?? {}, [results, errors, middleFnResults, middleFnErrors] = await client.execute(void 0, routeSubRequests, middleFns, setup?.signal, setup?.timeout), emptyResults = routeSubRequests.map(() => {
24
+ }), emptyErrors = routeSubRequests.map(() => {
25
+ });
26
+ return [results ?? emptyResults, errors ?? emptyErrors, middleFnResults, middleFnErrors];
27
+ }
28
+ };
28
29
  }
29
- routesFlow.__type = ["routeSubRequests", "middleFns", "WorkflowResult", "routesFlow", 'PP"@G2!"2"8"w#`/$'];
30
30
  const mapFromSymbol = /* @__PURE__ */ Symbol("MapFromServerFnRef");
31
31
  function mapFrom(source, mapper, bodyHash) {
32
32
  if (!bodyHash)
@@ -41,17 +41,16 @@ function mapFrom(source, mapper, bodyHash) {
41
41
  fromRequestId: source.id,
42
42
  toRequestId: "",
43
43
  paramIndex: -1,
44
- type: __assignType(function() {
44
+ // set by MionSubRequest constructor when passed as a parameter
45
+ type() {
45
46
  return ref;
46
- }, ["type", 'P"/!'])
47
+ }
47
48
  };
48
49
  return ref;
49
50
  }
50
- mapFrom.__type = ["source", "resolvedValue", "value", "", "mapper", "bodyHash", () => ___MapFromServerFnRef, "resolvedValue", "mapFrom", `P"2!P"."f2#"/$2%&2&8P".(f2#"/$o'"/)`];
51
51
  function isMapFromRef(ref) {
52
52
  return ref && ref.mapFromSymbol === mapFromSymbol;
53
53
  }
54
- isMapFromRef.__type = ["ref", "isMapFromRef", 'P"2!!/"'];
55
54
  export {
56
55
  isMapFromRef,
57
56
  mapFrom,
@@ -1 +1 @@
1
- {"version":3,"file":"routesFlow.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"routesFlow.js","sources":["../../../src/routesFlow.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\nimport {PURE_SERVER_FN_NAMESPACE, RpcError} from '@mionjs/core';\nimport type {MiddlewareSubRequest, RouteSubRequest, RoutesFlowBuilder, SubRequest} from './types.ts';\nimport type {MionSubRequest} from './subRequest.ts';\nimport {MapFromServerFnRef} from '@mionjs/core';\n\n/** Creates a RoutesFlowBuilder for deferred execution of multiple routes in a single HTTP request */\nexport function routesFlow<Routes extends RouteSubRequest<any>[]>(routeSubRequests: [...Routes]): RoutesFlowBuilder<Routes> {\n if (!routeSubRequests || routeSubRequests.length === 0) {\n throw new RpcError({\n type: 'routesFlow-empty-routes',\n publicMessage: 'RoutesFlow requires at least one route subrequest.',\n });\n }\n\n const firstSubRequest = routeSubRequests[0] as MionSubRequest;\n if (!firstSubRequest.client) {\n throw new RpcError({\n type: 'routesFlow-missing-client',\n publicMessage: 'Could not extract MionClient from subrequest. Ensure subrequests are created via routes proxy.',\n });\n }\n\n const client = firstSubRequest.client;\n\n // Validate all subrequests use the same client instance\n for (let i = 1; i < routeSubRequests.length; i++) {\n const subRequest = routeSubRequests[i] as MionSubRequest;\n if (subRequest.client !== client) {\n throw new RpcError({\n type: 'routesFlow-client-mismatch',\n publicMessage: `All subrequests in a routesFlow must use the same client instance. Subrequest at index ${i} has a different client.`,\n });\n }\n }\n\n return {\n async call(setup?: {middleFns?: Record<string, MiddlewareSubRequest<any>>; signal?: AbortSignal; timeout?: number}) {\n const middleFns = setup?.middleFns ?? {};\n const [results, errors, middleFnResults, middleFnErrors] = await client.execute(\n undefined,\n routeSubRequests as any,\n middleFns as any,\n setup?.signal,\n setup?.timeout\n );\n const emptyResults = routeSubRequests.map(() => undefined);\n const emptyErrors = routeSubRequests.map(() => undefined);\n return [results ?? emptyResults, errors ?? emptyErrors, middleFnResults, middleFnErrors] as any;\n },\n };\n}\n\nexport const mapFromSymbol = Symbol('MapFromServerFnRef');\n\n// ╔══════════════════════════════════════════════════════════════════════════════╗\n// ║ WARNING: This function's call signature is parsed by the mion vite plugin ║\n// ║ at build time (see devtools/src/vite-plugin/extractPureFn.ts). ║\n// ║ Do NOT rename, change the parameter order, or modify the function ║\n// ║ signature without updating the corresponding AST extraction and ║\n// ║ transformer logic in @mionjs/devtools. ║\n// ╚══════════════════════════════════════════════════════════════════════════════╝\n/**\n * Maps the output of one route SubRequest to the input of another within a routesFlow.\n * The mapper function must be pure (same rules as pureServerFn).\n * The bodyHash is injected at build time by the mion vite plugin.\n */\n\nexport function mapFrom<FromSR extends SubRequest<any>, MappedInput>(\n source: FromSR,\n mapper: (value: FromSR['resolvedValue']) => MappedInput,\n bodyHash?: string // injected by mion vite plugin\n): MapFromServerFnRef<(value: FromSR['resolvedValue']) => MappedInput> {\n // Important: bodyHash is injected at build time by mion vite plugin\n if (!bodyHash) throw new Error('mapFrom() requires mion vite plugin transform to inject bodyHash');\n const ref: MapFromServerFnRef<(value: FromSR['resolvedValue']) => MappedInput> = {\n mapFromSymbol,\n namespace: PURE_SERVER_FN_NAMESPACE,\n fnName: bodyHash,\n bodyHash,\n pureFn: mapper,\n isFactory: false,\n fromRequestId: source.id,\n toRequestId: '',\n paramIndex: -1, // set by MionSubRequest constructor when passed as a parameter\n type() {\n return ref as unknown as MappedInput;\n },\n };\n return ref;\n}\n\nexport function isMapFromRef(ref: any): ref is MapFromServerFnRef<any> {\n return ref && ref.mapFromSymbol === mapFromSymbol;\n}\n"],"names":[],"mappings":";AAaM,SAAU,WAAkD,kBAA6B;AAC3F,MAAI,CAAC,oBAAoB,iBAAiB,WAAW;AACjD,UAAM,IAAI,SAAS;AAAA,MACf,MAAM;AAAA,MACN,eAAe;AAAA,IAAA,CAClB;AAGL,QAAM,kBAAkB,iBAAiB,CAAC;AAC1C,MAAI,CAAC,gBAAgB;AACjB,UAAM,IAAI,SAAS;AAAA,MACf,MAAM;AAAA,MACN,eAAe;AAAA,IAAA,CAClB;AAGL,QAAM,SAAS,gBAAgB;AAG/B,WAAS,IAAI,GAAG,IAAI,iBAAiB,QAAQ;AAEzC,QADmB,iBAAiB,CAAC,EACtB,WAAW;AACtB,YAAM,IAAI,SAAS;AAAA,QACf,MAAM;AAAA,QACN,eAAe,0FAA0F,CAAC;AAAA,MAAA,CAC7G;AAIT,SAAO;AAAA,IACH,MAAM,KAAK,OAAuG;AAC9G,YAAM,YAAY,OAAO,aAAa,CAAA,GAChC,CAAC,SAAS,QAAQ,iBAAiB,cAAc,IAAI,MAAM,OAAO,QACpE,QACA,kBACA,WACA,OAAO,QACP,OAAO,OAAO,GAEZ,eAAe,iBAAiB,IAAI,MAAA;AAAA,OAAe,GACnD,cAAc,iBAAiB,IAAI,MAAA;AAAA,OAAe;AACxD,aAAO,CAAC,WAAW,cAAc,UAAU,aAAa,iBAAiB,cAAc;AAAA,IAC3F;AAAA,EAAA;AAER;AAEO,MAAM,uCAAuB,oBAAoB;AAelD,SAAU,QACZ,QACA,QACA;AAGA,MAAI,CAAC;AAAU,UAAM,IAAI,MAAM,kEAAkE;AACjG,QAAM,MAA2E;AAAA,IAC7E;AAAA,IACA,WAAW;AAAA,IACX,QAAQ;AAAA,IACR;AAAA,IACA,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,eAAe,OAAO;AAAA,IACtB,aAAa;AAAA,IACb,YAAY;AAAA;AAAA,IACZ,OAAI;AACA,aAAO;AAAA,IACX;AAAA,EAAA;AAEJ,SAAO;AACX;AAEM,SAAU,aAAa,KAAQ;AACjC,SAAO,OAAO,IAAI,kBAAkB;AACxC;"}
@@ -1,8 +1,8 @@
1
1
  import { RpcError, RunTypeError, MapFromServerFnRef } from '@mionjs/core';
2
- import { CallWithMiddleFnsResult, HSubRequest, RequestErrors, Result, RSubRequest, SubRequest, WorkflowResult } from './types.ts';
2
+ import { CallSetup, MiddlewareSubRequest, RequestErrors, RouteSubRequest, SubRequest } from './types.ts';
3
3
  import { MionClient } from './client.ts';
4
- import { TypedEvent } from './typedEvent.ts';
5
- export declare class MionSubRequest<S = any, E extends RpcError<string, any> = any> implements RSubRequest<any>, HSubRequest<any> {
4
+ import { TypedEvent } from './lib/typedEvent.ts';
5
+ export declare class MionSubRequest<S = any, E extends RpcError<string, any> = any> implements RouteSubRequest<any>, MiddlewareSubRequest<any> {
6
6
  readonly client: MionClient;
7
7
  pointer: string[];
8
8
  id: string;
@@ -15,9 +15,8 @@ export declare class MionSubRequest<S = any, E extends RpcError<string, any> = a
15
15
  constructor(parentProps: string[], handlerId: string, argArray: any[], client: MionClient);
16
16
  prefill(): TypedEvent<S, E>;
17
17
  removePrefill(): Promise<void>;
18
- call(): Promise<Result<S, E>>;
19
- callWithMiddleFns<H extends Record<string, HSubRequest<any>>>(middleFns: H): Promise<CallWithMiddleFnsResult<S, E, H>>;
20
- callWithWorkflow<OtherRoutes extends RSubRequest<any>[], H extends Record<string, HSubRequest<any>>>(otherRoutes: [...OtherRoutes], middleFns?: H): Promise<WorkflowResult<[RSubRequest<any>, ...OtherRoutes], H>>;
18
+ call(setup?: CallSetup<any, any>): Promise<any>;
19
+ private executeWithOtherRoutes;
21
20
  typeErrors(): Promise<RunTypeError[]>;
22
21
  }
23
22
  export declare function findSubRequestError(subRequest: SubRequest<any>, errors: RequestErrors): RpcError<string>;
@@ -1,9 +1,6 @@
1
1
  import { RpcError } from "@mionjs/core";
2
- import { TypedEvent } from "./typedEvent.js";
2
+ import { TypedEvent } from "./lib/typedEvent.js";
3
3
  import { isMapFromRef } from "./routesFlow.js";
4
- function __assignType(fn, args) {
5
- return fn.__type = args, fn;
6
- }
7
4
  class MionSubRequest {
8
5
  client;
9
6
  pointer;
@@ -15,45 +12,34 @@ class MionSubRequest {
15
12
  serializedParams;
16
13
  mappings = [];
17
14
  constructor(parentProps, handlerId, argArray, client) {
18
- this.client = client, this.pointer = [...parentProps], this.id = handlerId, this.params = argArray.map(__assignType((arg, index) => isMapFromRef(arg) ? (arg.toRequestId = this.id, arg.paramIndex = index, this.mappings.push(arg), null) : arg, ["arg", "index", "", 'P"2!"2""/#']));
15
+ this.client = client, this.pointer = [...parentProps], this.id = handlerId, this.params = argArray.map((arg, index) => isMapFromRef(arg) ? (arg.toRequestId = this.id, arg.paramIndex = index, this.mappings.push(arg), null) : arg);
19
16
  }
20
17
  /** Prefills MiddleFn's parameters and returns TypedEvent for event handler registration */
21
18
  prefill() {
22
- const typedEvent = (TypedEvent.Ω = [["!"], ["!"]], new TypedEvent(this.id, this.client.handlersRegistry));
23
- return this.client.prefill(this).catch(__assignType((errors) => {
19
+ const typedEvent = new TypedEvent(this.id, this.client.handlersRegistry);
20
+ return this.client.prefill(this).catch((errors) => {
24
21
  console.error("Prefill error:", findSubRequestError(this, errors));
25
- }, ["RequestErrors", "errors", "", 'P"w!2""/#'])), typedEvent;
22
+ }), typedEvent;
26
23
  }
27
24
  /** Removes prefilled value and clears any registered error handlers for this middleFn */
28
25
  removePrefill() {
29
26
  return this.client.handlersRegistry.clearHandlers(this.id), this.client.removePrefill(this);
30
27
  }
31
- /** Calls a remote route and returns a Result 4-tuple with full typing preserved */
32
- call() {
33
- return this.client.executeCall(this);
34
- }
35
- /** Calls a remote route with middleFns and returns a fully-typed 4-tuple result */
36
- callWithMiddleFns(middleFns) {
37
- if (Object.keys(middleFns).length === 0)
38
- throw new Error("callWithMiddleFns requires at least one middleFn. Use call() instead for requests without middleFns.");
39
- return this.client.executeCallWithMiddleFns(this, middleFns);
28
+ /** Calls a remote route with optional setup (middleFns, otherRoutes, signal, timeout) */
29
+ call(setup) {
30
+ const signal = setup?.signal, timeout = setup?.timeout;
31
+ return !setup || !setup.otherRoutes && !setup.middleFns ? this.client.execute(this, void 0, void 0, signal, timeout) : setup.otherRoutes && setup.otherRoutes.length > 0 ? this.executeWithOtherRoutes(setup.otherRoutes, setup.middleFns, signal, timeout) : this.client.execute(this, void 0, setup.middleFns, signal, timeout);
40
32
  }
41
- /** Calls this route as part of a routesFlow with other routes in a single HTTP request */
42
- async callWithWorkflow(otherRoutes, middleFns) {
43
- const allRoutes = [this, ...otherRoutes], [results, errors, middleFnResults, middleFnErrors] = await this.client.executeCallWithWorkflow(allRoutes, middleFns ?? {}), emptyResults = allRoutes.map(() => {
33
+ async executeWithOtherRoutes(otherRoutes, middleFns, signal, timeout) {
34
+ const allRoutes = [this, ...otherRoutes], [results, errors, mfR, mfE] = await this.client.execute(void 0, allRoutes, middleFns ?? {}, signal, timeout), emptyResults = allRoutes.map(() => {
44
35
  }), emptyErrors = allRoutes.map(() => {
45
36
  });
46
- return [results ?? emptyResults, errors ?? emptyErrors, middleFnResults, middleFnErrors];
37
+ return [results ?? emptyResults, errors ?? emptyErrors, mfR, mfE];
47
38
  }
48
39
  /** Validates parameters and returns type errors */
49
40
  typeErrors() {
50
- return this.client.typeErrors(this).catch(__assignType((errors) => Promise.reject(findSubRequestError(this, errors)), ["RequestErrors", "errors", "", 'P"w!2""/#']));
41
+ return this.client.typeErrors(this).catch((errors) => Promise.reject(findSubRequestError(this, errors)));
51
42
  }
52
- static __type = ["S", "E", "pointer", "id", "isResolved", function() {
53
- return !1;
54
- }, "params", "resolvedValue", "error", "serializedParams", "MapFromServerFnRef", "mappings", function() {
55
- return [];
56
- }, "parentProps", "handlerId", "argArray", "MionClient", "client", "constructor", () => TypedEvent, "prefill", "removePrefill", "Result", "call", "middleFns", "CallWithMiddleFnsResult", "callWithMiddleFns", "otherRoutes", "WorkflowResult", "callWithWorkflow", "RunTypeError", "typeErrors", "RSubRequest", "HSubRequest", "MionSubRequest", '"c!"c"&F3#&3$)3%>&"F3\'e!!3(8e!"3)8"F3*8"w+F3,>-P&F2.&2/"F20"w1229"03PPe#!e#"7405P$`06P"w7`08P"29"w:`0;PP"@G2<"298"w=`0>P"w?F`0@5"wA"wBx#wC'];
57
43
  }
58
44
  function findSubRequestError(subRequest, errors) {
59
45
  const specificError = errors.get(subRequest.id);
@@ -65,7 +51,6 @@ function findSubRequestError(subRequest, errors) {
65
51
  publicMessage: "An unknown error occurred"
66
52
  });
67
53
  }
68
- findSubRequestError.__type = ["SubRequest", "subRequest", "RequestErrors", "errors", () => RpcError, "findSubRequestError", 'P"w!2""w#2$P&7%/&'];
69
54
  export {
70
55
  MionSubRequest,
71
56
  findSubRequestError