@actualwave/deferred-data-access 2.0.0 → 2.1.1

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 (128) hide show
  1. package/README.md +400 -27
  2. package/SKILL.md +106 -0
  3. package/command/index.d.ts.map +1 -0
  4. package/command/index.es.js +98 -0
  5. package/command/index.es.js.map +1 -0
  6. package/command/index.js +102 -4
  7. package/command/index.js.map +1 -1
  8. package/command/package.json +4 -1
  9. package/command/src/command-chain.d.ts +8 -1
  10. package/command/src/command-chain.d.ts.map +1 -0
  11. package/command/src/command-chain.js +9 -0
  12. package/command/src/command-chain.js.map +1 -1
  13. package/command/src/command-handler.d.ts.map +1 -0
  14. package/command/src/command.d.ts +2 -2
  15. package/command/src/command.d.ts.map +1 -0
  16. package/command/src/command.js +5 -6
  17. package/command/src/command.js.map +1 -1
  18. package/core/core.d.ts.map +1 -0
  19. package/core/core.js +23 -25
  20. package/core/core.js.map +1 -1
  21. package/core/index.d.ts.map +1 -0
  22. package/deferred-data-access.umd.js +2 -0
  23. package/deferred-data-access.umd.js.map +1 -0
  24. package/index.d.ts.map +1 -0
  25. package/{dist/deferred-data-access.js → index.es.js} +199 -138
  26. package/index.es.js.map +1 -0
  27. package/index.js +627 -2
  28. package/index.js.map +1 -1
  29. package/interface/index.d.ts.map +1 -0
  30. package/interface/index.es.js +380 -0
  31. package/interface/index.es.js.map +1 -0
  32. package/interface/index.js +396 -7
  33. package/interface/index.js.map +1 -1
  34. package/interface/package.json +4 -1
  35. package/interface/src/handshake.d.ts.map +1 -0
  36. package/interface/src/handshake.js +6 -4
  37. package/interface/src/handshake.js.map +1 -1
  38. package/interface/src/helpers.d.ts.map +1 -0
  39. package/interface/src/intialize.d.ts +5 -2
  40. package/interface/src/intialize.d.ts.map +1 -0
  41. package/interface/src/intialize.js +37 -57
  42. package/interface/src/intialize.js.map +1 -1
  43. package/interface/src/request.d.ts +3 -2
  44. package/interface/src/request.d.ts.map +1 -0
  45. package/interface/src/request.js +39 -29
  46. package/interface/src/request.js.map +1 -1
  47. package/interface/src/types.d.ts.map +1 -0
  48. package/interface/src/utils.d.ts +2 -2
  49. package/interface/src/utils.d.ts.map +1 -0
  50. package/interface/src/utils.js +44 -29
  51. package/interface/src/utils.js.map +1 -1
  52. package/package.json +7 -6
  53. package/proxy/index.d.ts.map +1 -0
  54. package/proxy/index.es.js +144 -0
  55. package/proxy/index.es.js.map +1 -0
  56. package/proxy/index.js +155 -5
  57. package/proxy/index.js.map +1 -1
  58. package/proxy/package.json +4 -1
  59. package/proxy/src/command.d.ts.map +1 -0
  60. package/proxy/src/proxy.d.ts +2 -2
  61. package/proxy/src/proxy.d.ts.map +1 -0
  62. package/proxy/src/proxy.js +13 -3
  63. package/proxy/src/proxy.js.map +1 -1
  64. package/proxy/src/traps.d.ts +1 -1
  65. package/proxy/src/traps.d.ts.map +1 -0
  66. package/proxy/src/traps.js +4 -14
  67. package/proxy/src/traps.js.map +1 -1
  68. package/proxy/src/types.d.ts.map +1 -0
  69. package/proxy/src/utils.d.ts +6 -0
  70. package/proxy/src/utils.d.ts.map +1 -0
  71. package/proxy/src/utils.js +11 -5
  72. package/proxy/src/utils.js.map +1 -1
  73. package/record/index.d.ts.map +1 -0
  74. package/record/index.es.js +26 -0
  75. package/record/index.es.js.map +1 -0
  76. package/record/index.js +31 -2
  77. package/record/index.js.map +1 -1
  78. package/record/package.json +4 -1
  79. package/record/record.d.ts +2 -2
  80. package/record/record.d.ts.map +1 -0
  81. package/record/record.js +9 -3
  82. package/record/record.js.map +1 -1
  83. package/resource/index.d.ts +1 -0
  84. package/resource/index.d.ts.map +1 -0
  85. package/resource/index.es.js +191 -0
  86. package/resource/index.es.js.map +1 -0
  87. package/resource/index.js +206 -6
  88. package/resource/index.js.map +1 -1
  89. package/resource/package.json +4 -1
  90. package/resource/src/default-resource-pool.d.ts +1 -0
  91. package/resource/src/default-resource-pool.d.ts.map +1 -0
  92. package/resource/src/default-resource-pool.js +8 -5
  93. package/resource/src/default-resource-pool.js.map +1 -1
  94. package/resource/src/finalization-registry.d.ts +13 -0
  95. package/resource/src/finalization-registry.d.ts.map +1 -0
  96. package/resource/src/finalization-registry.js +18 -0
  97. package/resource/src/finalization-registry.js.map +1 -0
  98. package/resource/src/resource-pool-registry.d.ts +1 -0
  99. package/resource/src/resource-pool-registry.d.ts.map +1 -0
  100. package/resource/src/resource-pool-registry.js +10 -8
  101. package/resource/src/resource-pool-registry.js.map +1 -1
  102. package/resource/src/resource-pool.d.ts +8 -1
  103. package/resource/src/resource-pool.d.ts.map +1 -0
  104. package/resource/src/resource-pool.js +29 -17
  105. package/resource/src/resource-pool.js.map +1 -1
  106. package/resource/src/resource.d.ts +1 -1
  107. package/resource/src/resource.d.ts.map +1 -0
  108. package/resource/src/resource.js +3 -2
  109. package/resource/src/resource.js.map +1 -1
  110. package/resource/src/utils.d.ts +1 -1
  111. package/resource/src/utils.d.ts.map +1 -0
  112. package/resource/src/utils.js +9 -1
  113. package/resource/src/utils.js.map +1 -1
  114. package/utils/index.d.ts.map +1 -0
  115. package/utils/index.es.js +48 -0
  116. package/utils/index.es.js.map +1 -0
  117. package/utils/index.js +54 -3
  118. package/utils/index.js.map +1 -1
  119. package/utils/package.json +4 -1
  120. package/utils/src/types.d.ts +3 -3
  121. package/utils/src/types.d.ts.map +1 -0
  122. package/utils/src/utils.d.ts +18 -2
  123. package/utils/src/utils.d.ts.map +1 -0
  124. package/utils/src/utils.js +28 -4
  125. package/utils/src/utils.js.map +1 -1
  126. package/dist/deferred-data-access.js.map +0 -1
  127. package/dist/deferred-data-access.umd.js +0 -2
  128. package/dist/deferred-data-access.umd.js.map +0 -1
@@ -1,7 +1,396 @@
1
- export * from './src/handshake';
2
- export * from './src/helpers';
3
- export * from './src/intialize';
4
- export * from './src/request';
5
- export * from './src/types';
6
- export * from './src/utils';
7
- //# sourceMappingURL=index.js.map
1
+ 'use strict';
2
+
3
+ var utils = require('@actualwave/deferred-data-access/utils');
4
+ var proxy = require('@actualwave/deferred-data-access/proxy');
5
+ var resource = require('@actualwave/deferred-data-access/resource');
6
+ var deferredDataAccess = require('@actualwave/deferred-data-access');
7
+
8
+ let pool;
9
+ const getPool = () => {
10
+ if (!pool) {
11
+ pool = resource.getRegistry().createPool();
12
+ }
13
+ return pool;
14
+ };
15
+ const extractResourceFrom = (value) => {
16
+ if (!resource.isResourceObject(value)) {
17
+ return value;
18
+ }
19
+ const { poolId, id } = value;
20
+ const resourcePool = resource.getRegistry().get(poolId);
21
+ if (!resourcePool) {
22
+ throw new Error(`Resource Pool "${poolId}" does not exist.`);
23
+ }
24
+ const target = resourcePool.getById(id);
25
+ if (target === undefined) {
26
+ throw new Error(`Resource "${id}" does not exist, pool "${poolId}".`);
27
+ }
28
+ return target;
29
+ };
30
+ const commandDispatch = {
31
+ [proxy.ProxyCommand.GET]: (target, name) => target[name],
32
+ [proxy.ProxyCommand.SET]: (target, name, value) => {
33
+ target[name] = extractResourceFrom(value);
34
+ return target[name];
35
+ },
36
+ [proxy.ProxyCommand.DELETE_PROPERTY]: (target, name) => delete target[name],
37
+ [proxy.ProxyCommand.APPLY]: (target, _name, value) => {
38
+ const [exeContext, args] = value;
39
+ return target.apply(extractResourceFrom(exeContext), args.map(extractResourceFrom));
40
+ },
41
+ [proxy.ProxyCommand.METHOD_CALL]: (target, name, value) => target[name](...value.map(extractResourceFrom)),
42
+ };
43
+ const applyRemoteRequest = ({ command, command: { type, value }, context, }) => {
44
+ const target = extractResourceFrom(context);
45
+ const name = command.name;
46
+ if (type !== proxy.ProxyCommand.APPLY && !target) {
47
+ throw new Error(
48
+ // Fix typo: "excute" → "execute"
49
+ `Cannot execute command ${type}/${String(name)} on non-existent target (${target}).`);
50
+ }
51
+ const dispatch = commandDispatch[type];
52
+ if (!dispatch) {
53
+ throw new Error(`Unknown command type "${type}" cannot be applied remotely.`);
54
+ }
55
+ const result = dispatch(target, name, value);
56
+ // For SET and DELETE, return the result directly without wrapping
57
+ if (type === proxy.ProxyCommand.SET || type === proxy.ProxyCommand.DELETE_PROPERTY) {
58
+ return result;
59
+ }
60
+ if (result !== null && result !== undefined && typeof result === 'function') {
61
+ const resource = getPool().set(result);
62
+ return resource.toObject();
63
+ }
64
+ return result;
65
+ };
66
+
67
+ exports.InterfaceType = void 0;
68
+ (function (InterfaceType) {
69
+ InterfaceType["HOST"] = "host";
70
+ InterfaceType["GUEST"] = "guest";
71
+ })(exports.InterfaceType || (exports.InterfaceType = {}));
72
+ exports.MessageType = void 0;
73
+ (function (MessageType) {
74
+ MessageType["REQUEST"] = "request";
75
+ MessageType["RESPONSE"] = "response";
76
+ })(exports.MessageType || (exports.MessageType = {}));
77
+ const generateId = utils.createUIDGenerator('wi');
78
+ const generateMessageId = utils.createUIDGenerator('m');
79
+ const lookupForResource = async (value) => {
80
+ if (value === null || value === undefined) {
81
+ return value;
82
+ }
83
+ if (Array.isArray(value)) {
84
+ const list = [];
85
+ for (const item of value) {
86
+ list.push(await lookupForResource(item));
87
+ }
88
+ return list;
89
+ }
90
+ if (proxy.isWrappedWithProxy(value)) {
91
+ const target = await proxy.unwrapProxy(value);
92
+ return lookupForResource(target);
93
+ }
94
+ if (typeof value === 'function') {
95
+ const resource = getPool().set(value);
96
+ return resource.toObject();
97
+ }
98
+ return value;
99
+ };
100
+ /*
101
+ Message signature
102
+
103
+ {
104
+ id, // every sent message has id, request and its response have same id
105
+ type, // message type -- "request" or "response"
106
+ source, // sender worker interface id
107
+ target, // receiver worker interface id
108
+ command, // request proxy command
109
+ context, // request command context
110
+ value, // response value
111
+ error, // response error
112
+ }
113
+ */
114
+ const createRequestMessage = (source, target) => async (commandChain, context, id = generateMessageId()) => {
115
+ const command = commandChain.toObject();
116
+ const contextTarget = await context;
117
+ // apply function to owner object
118
+ if (command.type === proxy.ProxyCommand.APPLY) {
119
+ let exeContext;
120
+ if (commandChain.prev) {
121
+ exeContext = await commandChain.prev.context;
122
+ }
123
+ // prepare arguments for Function.apply()
124
+ command.value = [exeContext, await lookupForResource(command.value)];
125
+ }
126
+ else {
127
+ command.value = await lookupForResource(command.value);
128
+ }
129
+ return {
130
+ id,
131
+ type: exports.MessageType.REQUEST,
132
+ source,
133
+ target,
134
+ command,
135
+ context: contextTarget,
136
+ };
137
+ };
138
+ const createResponseMessage = (source) =>
139
+ // with "undefined" value, "error" key will not be packed into JSON, less bytes sent
140
+ ({ id, source: target }, value, error) => ({
141
+ id,
142
+ type: exports.MessageType.RESPONSE,
143
+ source,
144
+ target,
145
+ value,
146
+ error,
147
+ });
148
+ const createIsHandshakeMessage = (id = '') => (data) => {
149
+ if (data == null || typeof data !== 'object')
150
+ return false;
151
+ const dataId = data.id;
152
+ if (typeof dataId !== 'string')
153
+ return false;
154
+ return id ? id === dataId : /^wi/.test(dataId);
155
+ };
156
+ const createIsMessage = (target) => (data) => {
157
+ if (data == null || typeof data !== 'object')
158
+ return false;
159
+ const { id, target: dataTarget } = data;
160
+ return typeof id === 'string' && target === dataTarget;
161
+ };
162
+ const resolveOrTimeout = ({ handler, timeout, timeoutError = `Async operation didn't complete in ${timeout}ms.`, onTimeout, }) => {
163
+ const promise = typeof handler === 'function' ? new Promise(handler) : handler;
164
+ if (!timeout) {
165
+ return promise;
166
+ }
167
+ let timeoutHandle;
168
+ const timeoutPromise = new Promise((_, rej) => {
169
+ timeoutHandle = setTimeout(() => {
170
+ rej(timeoutError);
171
+ // Call onTimeout AFTER rejecting so the race is already settled.
172
+ // This prevents the double-rejection issue in initialize's onTimeout handler.
173
+ onTimeout && onTimeout(timeoutError);
174
+ }, timeout);
175
+ });
176
+ // Clear the timeout if the main promise wins the race
177
+ return Promise.race([
178
+ promise.then((v) => {
179
+ clearTimeout(timeoutHandle);
180
+ return v;
181
+ }, (e) => {
182
+ clearTimeout(timeoutHandle);
183
+ throw e;
184
+ }),
185
+ timeoutPromise,
186
+ ]);
187
+ };
188
+ const getMessageEventData = (event) => event != null && typeof event === 'object' && 'data' in event ? event.data : event;
189
+
190
+ // leader (HOST): waits for guest to initiate, then replies
191
+ const handshakeHost = ({ id, root, isMessage, subscribe, unsubscribe, sendMessage, preprocessResponse = (data) => data, }) => (resolve) => {
192
+ const handshakeHandler = (event) => {
193
+ const data = getMessageEventData(preprocessResponse(event));
194
+ if (!isMessage(data)) {
195
+ return;
196
+ }
197
+ unsubscribe(handshakeHandler);
198
+ sendMessage({ id, root });
199
+ resolve(data);
200
+ };
201
+ subscribe(handshakeHandler);
202
+ };
203
+ // follower (GUEST): initiates handshake by sending its identity, waits for host reply
204
+ const handshakeGuest = ({ id, root, isMessage, subscribe, unsubscribe, sendMessage, handshakeInterval, preprocessResponse = (data) => data, }) => (resolve) => {
205
+ // Use ReturnType to avoid the TS2322 Timer/number mismatch across environments
206
+ let intervalId;
207
+ const handshakeHandler = (event) => {
208
+ const data = getMessageEventData(preprocessResponse(event));
209
+ if (!isMessage(data)) {
210
+ return;
211
+ }
212
+ unsubscribe(handshakeHandler);
213
+ if (intervalId !== undefined) {
214
+ clearInterval(intervalId);
215
+ }
216
+ resolve(data);
217
+ };
218
+ subscribe(handshakeHandler);
219
+ const intervalFn = () => sendMessage({ id, root });
220
+ if (handshakeInterval) {
221
+ intervalId = setInterval(intervalFn, handshakeInterval);
222
+ }
223
+ else {
224
+ intervalFn();
225
+ }
226
+ };
227
+ const handshake = ({ type, remoteId, handshakeTimeout, ...params }) => {
228
+ const data = {
229
+ ...params,
230
+ isMessage: createIsHandshakeMessage(remoteId),
231
+ };
232
+ const handler = type === exports.InterfaceType.HOST
233
+ ? handshakeHost(data)
234
+ : handshakeGuest(data);
235
+ return resolveOrTimeout({
236
+ handler,
237
+ timeout: handshakeTimeout,
238
+ timeoutError: `Handshake sequence could not complete in ${handshakeTimeout}ms.`,
239
+ });
240
+ };
241
+
242
+ const EVENT_TYPE = 'message';
243
+ const findEventEmitter = (worker) => {
244
+ if (worker) {
245
+ return worker;
246
+ }
247
+ if (typeof self === 'object') {
248
+ return self;
249
+ }
250
+ throw new Error('EventEmitter is not defined, please provide EventEmitter interface via "worker" or "eventEmitter" property.');
251
+ };
252
+ const findMessagePort = (worker) => {
253
+ if (worker) {
254
+ return worker;
255
+ }
256
+ if (typeof self === 'object') {
257
+ return self;
258
+ }
259
+ throw new Error('MessagePort is not defined, please provide MessagePort interface via "worker" or "messagePort" property.');
260
+ };
261
+ const createSubscriberFns = (instance, eventType = EVENT_TYPE) => {
262
+ if (instance.addEventListener) {
263
+ return {
264
+ subscribe: (listener) => instance.addEventListener(eventType, listener),
265
+ unsubscribe: (listener) => instance.removeEventListener(eventType, listener),
266
+ };
267
+ }
268
+ if (instance.addListener) {
269
+ return {
270
+ subscribe: (listener) => instance.addListener(eventType, listener),
271
+ unsubscribe: (listener) => instance.removeListener(eventType, listener),
272
+ };
273
+ }
274
+ if (instance.on) {
275
+ return {
276
+ subscribe: (listener) => instance.on(eventType, listener),
277
+ unsubscribe: (listener) => instance.off(eventType, listener),
278
+ };
279
+ }
280
+ throw new Error('Target does not implement EventEmitter insterface, ' +
281
+ 'it must expose "addEventListener"/"removeEventListener", ' +
282
+ '"addListener"/"removeListener" or ' +
283
+ '"on"/"off" method pair.');
284
+ };
285
+
286
+ const initialize = async ({ id: initId, root: apiRoot, ...params }) => {
287
+ const id = initId || generateId();
288
+ const root = apiRoot
289
+ ? getPool().set(apiRoot).toObject()
290
+ : undefined;
291
+ const { subscribe, unsubscribe, sendMessage, preprocessResponse = (data) => data, } = params;
292
+ const { id: remoteId, root: remoteRoot } = await handshake({
293
+ id,
294
+ root,
295
+ ...params,
296
+ });
297
+ // Tracks in-flight requests: messageId → { resolve, reject }
298
+ const pendingRequests = new Map();
299
+ const isMessage = createIsMessage(id);
300
+ const createRequest = createRequestMessage(id, remoteId);
301
+ const createResponse = createResponseMessage(id);
302
+ const messageHandler = async (event) => {
303
+ const data = getMessageEventData(preprocessResponse(event));
304
+ if (!isMessage(data)) {
305
+ return;
306
+ }
307
+ switch (data.type) {
308
+ case exports.MessageType.REQUEST: {
309
+ const request = data;
310
+ try {
311
+ const value = await applyRemoteRequest(request);
312
+ sendMessage(createResponse(request, value));
313
+ }
314
+ catch (error) {
315
+ sendMessage(createResponse(request, undefined, { message: error.message }));
316
+ }
317
+ break;
318
+ }
319
+ case exports.MessageType.RESPONSE: {
320
+ const { id, value, error } = data;
321
+ const pending = pendingRequests.get(id);
322
+ if (!pending) {
323
+ return;
324
+ }
325
+ pendingRequests.delete(id);
326
+ // Settle exactly once — delete before calling to prevent double-settle
327
+ if (error) {
328
+ pending.reject(error);
329
+ }
330
+ else {
331
+ pending.resolve(value);
332
+ }
333
+ break;
334
+ }
335
+ }
336
+ };
337
+ subscribe(messageHandler);
338
+ const stop = () => unsubscribe(messageHandler);
339
+ if (!remoteRoot) {
340
+ return { stop, pool: getPool() };
341
+ }
342
+ const wrap = deferredDataAccess.handle(async (command, context, wrap) => {
343
+ const { responseTimeout } = params;
344
+ const msgId = generateMessageId();
345
+ const timeoutError = `Could not receive command ${command.type}/${String(command.name)} response in ${responseTimeout}ms.`;
346
+ const resultPromise = resolveOrTimeout({
347
+ handler: async (resolve, reject) => {
348
+ try {
349
+ const request = await createRequest(command, context, msgId);
350
+ // Register before sending to eliminate the race between send and response arrival
351
+ pendingRequests.set(msgId, { resolve, reject });
352
+ sendMessage(request);
353
+ }
354
+ catch (error) {
355
+ reject(error);
356
+ }
357
+ },
358
+ timeout: responseTimeout || 0,
359
+ timeoutError,
360
+ onTimeout: () => {
361
+ // resolveOrTimeout already rejected the race promise.
362
+ // We only need to clean up the pending entry here.
363
+ pendingRequests.delete(msgId);
364
+ },
365
+ });
366
+ const result = await resultPromise;
367
+ if (resource.isResourceObject(result)) {
368
+ return wrap(resultPromise, command);
369
+ }
370
+ return resultPromise;
371
+ }, false);
372
+ return {
373
+ stop,
374
+ wrap,
375
+ pendingRequests,
376
+ pool: getPool(),
377
+ root: remoteRoot ? wrap(remoteRoot) : null,
378
+ };
379
+ };
380
+
381
+ exports.applyRemoteRequest = applyRemoteRequest;
382
+ exports.createIsHandshakeMessage = createIsHandshakeMessage;
383
+ exports.createIsMessage = createIsMessage;
384
+ exports.createRequestMessage = createRequestMessage;
385
+ exports.createResponseMessage = createResponseMessage;
386
+ exports.createSubscriberFns = createSubscriberFns;
387
+ exports.findEventEmitter = findEventEmitter;
388
+ exports.findMessagePort = findMessagePort;
389
+ exports.generateId = generateId;
390
+ exports.generateMessageId = generateMessageId;
391
+ exports.getMessageEventData = getMessageEventData;
392
+ exports.getPool = getPool;
393
+ exports.handshake = handshake;
394
+ exports.initialize = initialize;
395
+ exports.resolveOrTimeout = resolveOrTimeout;
396
+ //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../packages/deferred-data-access/interface/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../../packages/deferred-data-access/interface/src/request.ts","../../../../../../packages/deferred-data-access/interface/src/utils.ts","../../../../../../packages/deferred-data-access/interface/src/handshake.ts","../../../../../../packages/deferred-data-access/interface/src/helpers.ts","../../../../../../packages/deferred-data-access/interface/src/intialize.ts"],"sourcesContent":[null,null,null,null,null],"names":["getRegistry","isResourceObject","ProxyCommand","InterfaceType","MessageType","createUIDGenerator","isWrappedWithProxy","unwrapProxy","handle"],"mappings":"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"}
@@ -1,4 +1,7 @@
1
1
  {
2
2
  "name": "@actualwave/deferred-data-access/interface",
3
- "version": "2.0.0"
3
+ "version": "2.0.0",
4
+ "main": "index.js",
5
+ "module": "index.es.js",
6
+ "types": "index.d.ts"
4
7
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handshake.d.ts","sourceRoot":"","sources":["../../../../packages/deferred-data-access/interface/src/handshake.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EAEb,iBAAiB,EAElB,MAAM,SAAS,CAAC;AA8EjB,eAAO,MAAM,SAAS,GAAI,iDAKvB,aAAa,KAAG,OAAO,CAAC,iBAAiB,CAgB3C,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { createIsHandshakeMessage, getMessageEventData, InterfaceType, resolveOrTimeout, } from './utils';
2
- // leader
2
+ // leader (HOST): waits for guest to initiate, then replies
3
3
  const handshakeHost = ({ id, root, isMessage, subscribe, unsubscribe, sendMessage, preprocessResponse = (data) => data, }) => (resolve) => {
4
4
  const handshakeHandler = (event) => {
5
5
  const data = getMessageEventData(preprocessResponse(event));
@@ -12,8 +12,9 @@ const handshakeHost = ({ id, root, isMessage, subscribe, unsubscribe, sendMessag
12
12
  };
13
13
  subscribe(handshakeHandler);
14
14
  };
15
- // follower
15
+ // follower (GUEST): initiates handshake by sending its identity, waits for host reply
16
16
  const handshakeGuest = ({ id, root, isMessage, subscribe, unsubscribe, sendMessage, handshakeInterval, preprocessResponse = (data) => data, }) => (resolve) => {
17
+ // Use ReturnType to avoid the TS2322 Timer/number mismatch across environments
17
18
  let intervalId;
18
19
  const handshakeHandler = (event) => {
19
20
  const data = getMessageEventData(preprocessResponse(event));
@@ -21,13 +22,14 @@ const handshakeGuest = ({ id, root, isMessage, subscribe, unsubscribe, sendMessa
21
22
  return;
22
23
  }
23
24
  unsubscribe(handshakeHandler);
24
- clearInterval(intervalId);
25
+ if (intervalId !== undefined) {
26
+ clearInterval(intervalId);
27
+ }
25
28
  resolve(data);
26
29
  };
27
30
  subscribe(handshakeHandler);
28
31
  const intervalFn = () => sendMessage({ id, root });
29
32
  if (handshakeInterval) {
30
- // FIXME TS2322: Type 'Timer' is not assignable to type 'number'.
31
33
  intervalId = setInterval(intervalFn, handshakeInterval);
32
34
  }
33
35
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"handshake.js","sourceRoot":"","sources":["../../../../packages/deferred-data-access/interface/src/handshake.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,aAAa,EACb,gBAAgB,GACjB,MAAM,SAAS,CAAC;AAEjB,SAAS;AACT,MAAM,aAAa,GACjB,CAAC,EACC,EAAE,EACF,IAAI,EACJ,SAAS,EACT,SAAS,EACT,WAAW,EACX,WAAW,EACX,kBAAkB,GAAG,CAAC,IAAa,EAAE,EAAE,CAAC,IAAI,GACtB,EAAE,EAAE,CAC5B,CAAC,OAA0C,EAAE,EAAE;IAC7C,MAAM,gBAAgB,GAAG,CAAC,KAAc,EAAE,EAAE;QAC1C,MAAM,IAAI,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;QAE5D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,WAAW,CAAC,gBAAgB,CAAC,CAAC;QAC9B,WAAW,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC,CAAC;IAEF,SAAS,CAAC,gBAAgB,CAAC,CAAC;AAC9B,CAAC,CAAC;AAEJ,WAAW;AACX,MAAM,cAAc,GAClB,CAAC,EACC,EAAE,EACF,IAAI,EACJ,SAAS,EACT,SAAS,EACT,WAAW,EACX,WAAW,EACX,iBAAiB,EACjB,kBAAkB,GAAG,CAAC,IAAa,EAAE,EAAE,CAAC,IAAI,GACxB,EAAE,EAAE,CAC1B,CAAC,OAA0C,EAAE,EAAE;IAC7C,IAAI,UAAkB,CAAC;IAEvB,MAAM,gBAAgB,GAAG,CAAC,KAAc,EAAE,EAAE;QAC1C,MAAM,IAAI,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;QAE5D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,WAAW,CAAC,gBAAgB,CAAC,CAAC;QAC9B,aAAa,CAAC,UAAU,CAAC,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC,CAAC;IAEF,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAE5B,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAEnD,IAAI,iBAAiB,EAAE,CAAC;QACtB,iEAAiE;QACjE,UAAU,GAAG,WAAW,CACtB,UAAU,EACV,iBAAiB,CACG,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,UAAU,EAAE,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAEJ,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EACxB,IAAI,EACJ,QAAQ,EACR,gBAAgB,EAChB,GAAG,MAAM,EACK,EAA8B,EAAE;IAC9C,MAAM,IAAI,GAAG;QACX,GAAG,MAAM;QACT,SAAS,EAAE,wBAAwB,CAAC,QAAQ,CAAC;KAC9C,CAAC;IAEF,MAAM,OAAO,GACX,IAAI,KAAK,aAAa,CAAC,IAAI;QACzB,CAAC,CAAC,aAAa,CAAC,IAA6B,CAAC;QAC9C,CAAC,CAAC,cAAc,CAAC,IAA2B,CAAC,CAAC;IAElD,OAAO,gBAAgB,CAAoB;QACzC,OAAO;QACP,OAAO,EAAE,gBAAgB;QACzB,YAAY,EAAE,4CAA4C,gBAAgB,KAAK;KAChF,CAAC,CAAC;AACL,CAAC,CAAC"}
1
+ {"version":3,"file":"handshake.js","sourceRoot":"","sources":["../../../../packages/deferred-data-access/interface/src/handshake.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,aAAa,EACb,gBAAgB,GACjB,MAAM,SAAS,CAAC;AAEjB,2DAA2D;AAC3D,MAAM,aAAa,GACjB,CAAC,EACC,EAAE,EACF,IAAI,EACJ,SAAS,EACT,SAAS,EACT,WAAW,EACX,WAAW,EACX,kBAAkB,GAAG,CAAC,IAAa,EAAE,EAAE,CAAC,IAAI,GACtB,EAAE,EAAE,CAC5B,CAAC,OAA0C,EAAE,EAAE;IAC7C,MAAM,gBAAgB,GAAG,CAAC,KAAc,EAAE,EAAE;QAC1C,MAAM,IAAI,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;QAE5D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,WAAW,CAAC,gBAAgB,CAAC,CAAC;QAC9B,WAAW,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC,CAAC;IAEF,SAAS,CAAC,gBAAgB,CAAC,CAAC;AAC9B,CAAC,CAAC;AAEJ,sFAAsF;AACtF,MAAM,cAAc,GAClB,CAAC,EACC,EAAE,EACF,IAAI,EACJ,SAAS,EACT,SAAS,EACT,WAAW,EACX,WAAW,EACX,iBAAiB,EACjB,kBAAkB,GAAG,CAAC,IAAa,EAAE,EAAE,CAAC,IAAI,GACxB,EAAE,EAAE,CAC1B,CAAC,OAA0C,EAAE,EAAE;IAC7C,+EAA+E;IAC/E,IAAI,UAAsD,CAAC;IAE3D,MAAM,gBAAgB,GAAG,CAAC,KAAc,EAAE,EAAE;QAC1C,MAAM,IAAI,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;QAE5D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,WAAW,CAAC,gBAAgB,CAAC,CAAC;QAE9B,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,aAAa,CAAC,UAAU,CAAC,CAAC;QAC5B,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC,CAAC;IAEF,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAE5B,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAEnD,IAAI,iBAAiB,EAAE,CAAC;QACtB,UAAU,GAAG,WAAW,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;IAC1D,CAAC;SAAM,CAAC;QACN,UAAU,EAAE,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAEJ,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EACxB,IAAI,EACJ,QAAQ,EACR,gBAAgB,EAChB,GAAG,MAAM,EACK,EAA8B,EAAE;IAC9C,MAAM,IAAI,GAAG;QACX,GAAG,MAAM;QACT,SAAS,EAAE,wBAAwB,CAAC,QAAQ,CAAC;KAC9C,CAAC;IAEF,MAAM,OAAO,GACX,IAAI,KAAK,aAAa,CAAC,IAAI;QACzB,CAAC,CAAC,aAAa,CAAC,IAA6B,CAAC;QAC9C,CAAC,CAAC,cAAc,CAAC,IAA2B,CAAC,CAAC;IAElD,OAAO,gBAAgB,CAAoB;QACzC,OAAO;QACP,OAAO,EAAE,gBAAgB;QACzB,YAAY,EAAE,4CAA4C,gBAAgB,KAAK;KAChF,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../packages/deferred-data-access/interface/src/helpers.ts"],"names":[],"mappings":"AAEA,KAAK,YAAY,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;AAE5C,eAAO,MAAM,gBAAgB,GAAI,QAAQ,OAAO,KAAG,OAYlD,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,QAAQ,OAAO,KAAG,OAYjD,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,UAAU,GAAG,EACb,kBAAsB,KACrB;IACD,SAAS,EAAE,CAAC,EAAE,EAAE,YAAY,KAAK,IAAI,CAAC;IACtC,WAAW,EAAE,CAAC,EAAE,EAAE,YAAY,KAAK,IAAI,CAAC;CAkCzC,CAAC"}
@@ -7,8 +7,11 @@ export declare const initialize: ({ id: initId, root: apiRoot, ...params }: Init
7
7
  root?: undefined;
8
8
  } | {
9
9
  stop: () => void;
10
- pool: import("@actualwave/deferred-data-access/resource").ResourcePool;
11
10
  wrap: (context?: unknown, command?: import("@actualwave/deferred-data-access/command").Command) => unknown;
12
- pendingRequests: Map<any, any>;
11
+ pendingRequests: Map<string, {
12
+ resolve: (v: unknown) => void;
13
+ reject: (e: unknown) => void;
14
+ }>;
15
+ pool: import("@actualwave/deferred-data-access/resource").ResourcePool;
13
16
  root: unknown;
14
17
  }>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intialize.d.ts","sourceRoot":"","sources":["../../../../packages/deferred-data-access/interface/src/intialize.ts"],"names":[],"mappings":"AAYA,OAAO,EAKL,UAAU,EACX,MAAM,SAAS,CAAC;AAYjB,eAAO,MAAM,UAAU,GAAU,0CAI9B,UAAU;;;;;;;;;;iBAsBE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI;gBAAU,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI;;;;EA0GhE,CAAC"}
@@ -1,27 +1,12 @@
1
1
  import { handle } from '@actualwave/deferred-data-access';
2
2
  import { isResourceObject, } from '@actualwave/deferred-data-access/resource';
3
3
  import { handshake } from './handshake';
4
- import { pool, applyRemoteRequest } from './request';
4
+ import { getPool, applyRemoteRequest } from './request';
5
5
  import { createIsMessage, createRequestMessage, createResponseMessage, generateId, generateMessageId, getMessageEventData, MessageType, resolveOrTimeout, } from './utils';
6
- /*
7
- {
8
- id,
9
- type,
10
- root,
11
- remoteId, // we might expect a connection with matching ID
12
- subscribe,
13
- unsubscribe,
14
- sendMessage,
15
- handshakeTimeout,
16
- responseTimeout,
17
- handshakeInterval,
18
- preprocessResponse,
19
- }
20
- */
21
6
  export const initialize = async ({ id: initId, root: apiRoot, ...params }) => {
22
7
  const id = initId || generateId();
23
8
  const root = apiRoot
24
- ? pool.set(apiRoot).toObject()
9
+ ? getPool().set(apiRoot).toObject()
25
10
  : undefined;
26
11
  const { subscribe, unsubscribe, sendMessage, preprocessResponse = (data) => data, } = params;
27
12
  const { id: remoteId, root: remoteRoot } = await handshake({
@@ -29,7 +14,8 @@ export const initialize = async ({ id: initId, root: apiRoot, ...params }) => {
29
14
  root,
30
15
  ...params,
31
16
  });
32
- const pendingRequests = new Map(); // {[key: string]: { resolve: (value) => void, reject: (error) => void }}
17
+ // Tracks in-flight requests: messageId { resolve, reject }
18
+ const pendingRequests = new Map();
33
19
  const isMessage = createIsMessage(id);
34
20
  const createRequest = createRequestMessage(id, remoteId);
35
21
  const createResponse = createResponseMessage(id);
@@ -39,54 +25,51 @@ export const initialize = async ({ id: initId, root: apiRoot, ...params }) => {
39
25
  return;
40
26
  }
41
27
  switch (data.type) {
42
- case MessageType.REQUEST:
43
- {
44
- const request = data;
45
- try {
46
- const value = await applyRemoteRequest(request);
47
- sendMessage(createResponse(request, value));
48
- }
49
- catch (error) {
50
- sendMessage(createResponse(request, undefined, { message: error.message }));
51
- }
28
+ case MessageType.REQUEST: {
29
+ const request = data;
30
+ try {
31
+ const value = await applyRemoteRequest(request);
32
+ sendMessage(createResponse(request, value));
33
+ }
34
+ catch (error) {
35
+ sendMessage(createResponse(request, undefined, { message: error.message }));
52
36
  }
53
37
  break;
54
- case MessageType.RESPONSE:
55
- {
56
- const { id, value, error } = data;
57
- const { resolve, reject } = pendingRequests.get(id) || {};
58
- // if error present call reject, if not -- call resolve
59
- if (reject && error) {
60
- reject(error);
61
- }
62
- else if (resolve) {
63
- resolve(value);
64
- }
38
+ }
39
+ case MessageType.RESPONSE: {
40
+ const { id, value, error } = data;
41
+ const pending = pendingRequests.get(id);
42
+ if (!pending) {
43
+ return;
44
+ }
45
+ pendingRequests.delete(id);
46
+ // Settle exactly once — delete before calling to prevent double-settle
47
+ if (error) {
48
+ pending.reject(error);
49
+ }
50
+ else {
51
+ pending.resolve(value);
65
52
  }
66
53
  break;
54
+ }
67
55
  }
68
56
  };
69
57
  subscribe(messageHandler);
70
58
  const stop = () => unsubscribe(messageHandler);
71
59
  if (!remoteRoot) {
72
- return { stop, pool };
60
+ return { stop, pool: getPool() };
73
61
  }
74
- const wrap = handle(async (command, context,
75
- // wrap() is a partially applied handle(), so it makes possible to apply same command handlers to other objects
76
- wrap) => {
62
+ const wrap = handle(async (command, context, wrap) => {
77
63
  const { responseTimeout } = params;
78
- /*
79
- If target is not a resource, there are no need to send command to remote, it can be resolved immediately.
80
- Need to know if there will be such cases.
81
- */
82
- const id = generateMessageId();
64
+ const msgId = generateMessageId();
83
65
  const timeoutError = `Could not receive command ${command.type}/${String(command.name)} response in ${responseTimeout}ms.`;
84
66
  const resultPromise = resolveOrTimeout({
85
67
  handler: async (resolve, reject) => {
86
68
  try {
87
- const request = await createRequest(command, context, id);
69
+ const request = await createRequest(command, context, msgId);
70
+ // Register before sending to eliminate the race between send and response arrival
71
+ pendingRequests.set(msgId, { resolve, reject });
88
72
  sendMessage(request);
89
- pendingRequests.set(id, { resolve, reject });
90
73
  }
91
74
  catch (error) {
92
75
  reject(error);
@@ -95,12 +78,9 @@ export const initialize = async ({ id: initId, root: apiRoot, ...params }) => {
95
78
  timeout: responseTimeout || 0,
96
79
  timeoutError,
97
80
  onTimeout: () => {
98
- const rq = pendingRequests.get(id);
99
- if (!rq) {
100
- return;
101
- }
102
- rq.reject(new Error(timeoutError));
103
- pendingRequests.delete(id);
81
+ // resolveOrTimeout already rejected the race promise.
82
+ // We only need to clean up the pending entry here.
83
+ pendingRequests.delete(msgId);
104
84
  },
105
85
  });
106
86
  const result = await resultPromise;
@@ -111,9 +91,9 @@ export const initialize = async ({ id: initId, root: apiRoot, ...params }) => {
111
91
  }, false);
112
92
  return {
113
93
  stop,
114
- pool,
115
94
  wrap,
116
95
  pendingRequests,
96
+ pool: getPool(),
117
97
  root: remoteRoot ? wrap(remoteRoot) : null,
118
98
  };
119
99
  };