@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.
- package/README.md +400 -27
- package/SKILL.md +106 -0
- package/command/index.d.ts.map +1 -0
- package/command/index.es.js +98 -0
- package/command/index.es.js.map +1 -0
- package/command/index.js +102 -4
- package/command/index.js.map +1 -1
- package/command/package.json +4 -1
- package/command/src/command-chain.d.ts +8 -1
- package/command/src/command-chain.d.ts.map +1 -0
- package/command/src/command-chain.js +9 -0
- package/command/src/command-chain.js.map +1 -1
- package/command/src/command-handler.d.ts.map +1 -0
- package/command/src/command.d.ts +2 -2
- package/command/src/command.d.ts.map +1 -0
- package/command/src/command.js +5 -6
- package/command/src/command.js.map +1 -1
- package/core/core.d.ts.map +1 -0
- package/core/core.js +23 -25
- package/core/core.js.map +1 -1
- package/core/index.d.ts.map +1 -0
- package/deferred-data-access.umd.js +2 -0
- package/deferred-data-access.umd.js.map +1 -0
- package/index.d.ts.map +1 -0
- package/{dist/deferred-data-access.js → index.es.js} +199 -138
- package/index.es.js.map +1 -0
- package/index.js +627 -2
- package/index.js.map +1 -1
- package/interface/index.d.ts.map +1 -0
- package/interface/index.es.js +380 -0
- package/interface/index.es.js.map +1 -0
- package/interface/index.js +396 -7
- package/interface/index.js.map +1 -1
- package/interface/package.json +4 -1
- package/interface/src/handshake.d.ts.map +1 -0
- package/interface/src/handshake.js +6 -4
- package/interface/src/handshake.js.map +1 -1
- package/interface/src/helpers.d.ts.map +1 -0
- package/interface/src/intialize.d.ts +5 -2
- package/interface/src/intialize.d.ts.map +1 -0
- package/interface/src/intialize.js +37 -57
- package/interface/src/intialize.js.map +1 -1
- package/interface/src/request.d.ts +3 -2
- package/interface/src/request.d.ts.map +1 -0
- package/interface/src/request.js +39 -29
- package/interface/src/request.js.map +1 -1
- package/interface/src/types.d.ts.map +1 -0
- package/interface/src/utils.d.ts +2 -2
- package/interface/src/utils.d.ts.map +1 -0
- package/interface/src/utils.js +44 -29
- package/interface/src/utils.js.map +1 -1
- package/package.json +7 -6
- package/proxy/index.d.ts.map +1 -0
- package/proxy/index.es.js +144 -0
- package/proxy/index.es.js.map +1 -0
- package/proxy/index.js +155 -5
- package/proxy/index.js.map +1 -1
- package/proxy/package.json +4 -1
- package/proxy/src/command.d.ts.map +1 -0
- package/proxy/src/proxy.d.ts +2 -2
- package/proxy/src/proxy.d.ts.map +1 -0
- package/proxy/src/proxy.js +13 -3
- package/proxy/src/proxy.js.map +1 -1
- package/proxy/src/traps.d.ts +1 -1
- package/proxy/src/traps.d.ts.map +1 -0
- package/proxy/src/traps.js +4 -14
- package/proxy/src/traps.js.map +1 -1
- package/proxy/src/types.d.ts.map +1 -0
- package/proxy/src/utils.d.ts +6 -0
- package/proxy/src/utils.d.ts.map +1 -0
- package/proxy/src/utils.js +11 -5
- package/proxy/src/utils.js.map +1 -1
- package/record/index.d.ts.map +1 -0
- package/record/index.es.js +26 -0
- package/record/index.es.js.map +1 -0
- package/record/index.js +31 -2
- package/record/index.js.map +1 -1
- package/record/package.json +4 -1
- package/record/record.d.ts +2 -2
- package/record/record.d.ts.map +1 -0
- package/record/record.js +9 -3
- package/record/record.js.map +1 -1
- package/resource/index.d.ts +1 -0
- package/resource/index.d.ts.map +1 -0
- package/resource/index.es.js +191 -0
- package/resource/index.es.js.map +1 -0
- package/resource/index.js +206 -6
- package/resource/index.js.map +1 -1
- package/resource/package.json +4 -1
- package/resource/src/default-resource-pool.d.ts +1 -0
- package/resource/src/default-resource-pool.d.ts.map +1 -0
- package/resource/src/default-resource-pool.js +8 -5
- package/resource/src/default-resource-pool.js.map +1 -1
- package/resource/src/finalization-registry.d.ts +13 -0
- package/resource/src/finalization-registry.d.ts.map +1 -0
- package/resource/src/finalization-registry.js +18 -0
- package/resource/src/finalization-registry.js.map +1 -0
- package/resource/src/resource-pool-registry.d.ts +1 -0
- package/resource/src/resource-pool-registry.d.ts.map +1 -0
- package/resource/src/resource-pool-registry.js +10 -8
- package/resource/src/resource-pool-registry.js.map +1 -1
- package/resource/src/resource-pool.d.ts +8 -1
- package/resource/src/resource-pool.d.ts.map +1 -0
- package/resource/src/resource-pool.js +29 -17
- package/resource/src/resource-pool.js.map +1 -1
- package/resource/src/resource.d.ts +1 -1
- package/resource/src/resource.d.ts.map +1 -0
- package/resource/src/resource.js +3 -2
- package/resource/src/resource.js.map +1 -1
- package/resource/src/utils.d.ts +1 -1
- package/resource/src/utils.d.ts.map +1 -0
- package/resource/src/utils.js +9 -1
- package/resource/src/utils.js.map +1 -1
- package/utils/index.d.ts.map +1 -0
- package/utils/index.es.js +48 -0
- package/utils/index.es.js.map +1 -0
- package/utils/index.js +54 -3
- package/utils/index.js.map +1 -1
- package/utils/package.json +4 -1
- package/utils/src/types.d.ts +3 -3
- package/utils/src/types.d.ts.map +1 -0
- package/utils/src/utils.d.ts +18 -2
- package/utils/src/utils.d.ts.map +1 -0
- package/utils/src/utils.js +28 -4
- package/utils/src/utils.js.map +1 -1
- package/dist/deferred-data-access.js.map +0 -1
- package/dist/deferred-data-access.umd.js +0 -2
- package/dist/deferred-data-access.umd.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intialize.js","sourceRoot":"","sources":["../../../../packages/deferred-data-access/interface/src/intialize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAC1D,OAAO,EACL,gBAAgB,GAEjB,MAAM,2CAA2C,CAAC;AAMnD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"intialize.js","sourceRoot":"","sources":["../../../../packages/deferred-data-access/interface/src/intialize.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ResourcePool } from '@actualwave/deferred-data-access/resource';
|
|
1
2
|
import { RequestMessage } from './types';
|
|
2
|
-
export declare const
|
|
3
|
-
export declare const applyRemoteRequest: ({ command, command: { type, value }, context, }: RequestMessage) =>
|
|
3
|
+
export declare const getPool: () => ResourcePool;
|
|
4
|
+
export declare const applyRemoteRequest: ({ command, command: { type, value }, context, }: RequestMessage) => unknown;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../../../packages/deferred-data-access/interface/src/request.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,YAAY,EACb,MAAM,2CAA2C,CAAC;AAEnD,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAIzC,eAAO,MAAM,OAAO,oBAMnB,CAAC;AAoDF,eAAO,MAAM,kBAAkB,GAAI,iDAIhC,cAAc,YAgChB,CAAC"}
|
package/interface/src/request.js
CHANGED
|
@@ -1,49 +1,59 @@
|
|
|
1
1
|
import { ProxyCommand } from '@actualwave/deferred-data-access/proxy';
|
|
2
2
|
import { getRegistry, isResourceObject, } from '@actualwave/deferred-data-access/resource';
|
|
3
|
-
|
|
4
|
-
export const
|
|
3
|
+
let pool;
|
|
4
|
+
export const getPool = () => {
|
|
5
|
+
if (!pool) {
|
|
6
|
+
pool = getRegistry().createPool();
|
|
7
|
+
}
|
|
8
|
+
return pool;
|
|
9
|
+
};
|
|
5
10
|
const extractResourceFrom = (value) => {
|
|
6
11
|
if (!isResourceObject(value)) {
|
|
7
12
|
return value;
|
|
8
13
|
}
|
|
9
14
|
const { poolId, id } = value;
|
|
10
|
-
const
|
|
11
|
-
if (!
|
|
15
|
+
const resourcePool = getRegistry().get(poolId);
|
|
16
|
+
if (!resourcePool) {
|
|
12
17
|
throw new Error(`Resource Pool "${poolId}" does not exist.`);
|
|
13
18
|
}
|
|
14
|
-
const target =
|
|
15
|
-
if (
|
|
19
|
+
const target = resourcePool.getById(id);
|
|
20
|
+
if (target === undefined) {
|
|
16
21
|
throw new Error(`Resource "${id}" does not exist, pool "${poolId}".`);
|
|
17
22
|
}
|
|
18
23
|
return target;
|
|
19
24
|
};
|
|
25
|
+
const commandDispatch = {
|
|
26
|
+
[ProxyCommand.GET]: (target, name) => target[name],
|
|
27
|
+
[ProxyCommand.SET]: (target, name, value) => {
|
|
28
|
+
target[name] = extractResourceFrom(value);
|
|
29
|
+
return target[name];
|
|
30
|
+
},
|
|
31
|
+
[ProxyCommand.DELETE_PROPERTY]: (target, name) => delete target[name],
|
|
32
|
+
[ProxyCommand.APPLY]: (target, _name, value) => {
|
|
33
|
+
const [exeContext, args] = value;
|
|
34
|
+
return target.apply(extractResourceFrom(exeContext), args.map(extractResourceFrom));
|
|
35
|
+
},
|
|
36
|
+
[ProxyCommand.METHOD_CALL]: (target, name, value) => target[name](...value.map(extractResourceFrom)),
|
|
37
|
+
};
|
|
20
38
|
export const applyRemoteRequest = ({ command, command: { type, value }, context, }) => {
|
|
21
39
|
const target = extractResourceFrom(context);
|
|
22
40
|
const name = command.name;
|
|
23
41
|
if (type !== ProxyCommand.APPLY && !target) {
|
|
24
|
-
throw new Error(
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
}
|
|
40
|
-
break;
|
|
41
|
-
case ProxyCommand.METHOD_CALL:
|
|
42
|
-
result = target[name](...value.map(extractResourceFrom));
|
|
43
|
-
break;
|
|
44
|
-
}
|
|
45
|
-
if (result && typeof result === 'function') {
|
|
46
|
-
const resource = pool.set(result);
|
|
42
|
+
throw new Error(
|
|
43
|
+
// Fix typo: "excute" → "execute"
|
|
44
|
+
`Cannot execute command ${type}/${String(name)} on non-existent target (${target}).`);
|
|
45
|
+
}
|
|
46
|
+
const dispatch = commandDispatch[type];
|
|
47
|
+
if (!dispatch) {
|
|
48
|
+
throw new Error(`Unknown command type "${type}" cannot be applied remotely.`);
|
|
49
|
+
}
|
|
50
|
+
const result = dispatch(target, name, value);
|
|
51
|
+
// For SET and DELETE, return the result directly without wrapping
|
|
52
|
+
if (type === ProxyCommand.SET || type === ProxyCommand.DELETE_PROPERTY) {
|
|
53
|
+
return result;
|
|
54
|
+
}
|
|
55
|
+
if (result !== null && result !== undefined && typeof result === 'function') {
|
|
56
|
+
const resource = getPool().set(result);
|
|
47
57
|
return resource.toObject();
|
|
48
58
|
}
|
|
49
59
|
return result;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../../../packages/deferred-data-access/interface/src/request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AACtE,OAAO,EACL,WAAW,EACX,gBAAgB,
|
|
1
|
+
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../../../packages/deferred-data-access/interface/src/request.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../packages/deferred-data-access/interface/src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,MAAM,wCAAwC,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAErD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,KAAK,IAAI,CAAC;IACxD,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,KAAK,IAAI,CAAC;IAC1D,WAAW,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACrC,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,kBAAkB,GAAG;IACvD,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,SAAS,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,qBAAqB,GAAG;IACxD,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,CAAC,qBAAqB,GAAG,mBAAmB,CAAC,GAAG;IAC1E,IAAI,EAAE,aAAa,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,cAAc,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,kBAAkB,GAAG;IAChD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,kBAAkB,GACzC,cAAc,GAAG;IACf,IAAI,EAAE,aAAa,CAAC;CACrB,CAAC;AAEJ,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG;IACzC,OAAO,EAAE,QAAQ,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG;IAC1C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7B,CAAC"}
|
package/interface/src/utils.d.ts
CHANGED
|
@@ -14,8 +14,8 @@ export declare const createRequestMessage: (source: string, target: string) => (
|
|
|
14
14
|
export declare const createResponseMessage: (source: string) => ({ id, source: target }: RequestMessage, value: unknown, error?: {
|
|
15
15
|
message: string;
|
|
16
16
|
}) => ResponseMessage;
|
|
17
|
-
export declare const createIsHandshakeMessage: (id?: string) => (data:
|
|
18
|
-
export declare const createIsMessage: (target: string) => (data:
|
|
17
|
+
export declare const createIsHandshakeMessage: (id?: string) => (data: unknown) => boolean;
|
|
18
|
+
export declare const createIsMessage: (target: string) => (data: unknown) => boolean;
|
|
19
19
|
interface ResolveOrTimeoutConfig<T> {
|
|
20
20
|
handler: Promise<T> | ((resolve: (data: T) => void, reject: (data: unknown) => void) => unknown);
|
|
21
21
|
timeout: number;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../packages/deferred-data-access/interface/src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,YAAY,EACb,MAAM,wCAAwC,CAAC;AAMhD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAI1D,oBAAY,aAAa;IACvB,IAAI,SAAS;IACb,KAAK,UAAU;CAChB;AAED,oBAAY,WAAW;IACrB,OAAO,YAAY;IACnB,QAAQ,aAAa;CACtB;AAED,eAAO,MAAM,UAAU,cAA2B,CAAC;AAEnD,eAAO,MAAM,iBAAiB,cAA0B,CAAC;AA2CzD,eAAO,MAAM,oBAAoB,GAC9B,QAAQ,MAAM,EAAE,QAAQ,MAAM,MAE7B,cAAc,YAAY,EAC1B,UAAU,OAAO,CAAC,OAAO,CAAC,EAC1B,WAAwB,KACvB,OAAO,CAAC,cAAc,CA0BxB,CAAC;AAEJ,eAAO,MAAM,qBAAqB,GAC/B,QAAQ,MAAM,MAGb,wBAAwB,cAAc,EACtC,OAAO,OAAO,EACd,QAAQ;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,KAC1B,eAOD,CAAC;AAEL,eAAO,MAAM,wBAAwB,GAClC,WAAO,MACP,MAAM,OAAO,KAAG,OAKhB,CAAC;AAEJ,eAAO,MAAM,eAAe,GACzB,QAAQ,MAAM,MACd,MAAM,OAAO,KAAG,OAIhB,CAAC;AAEJ,UAAU,sBAAsB,CAAC,CAAC;IAChC,OAAO,EACH,OAAO,CAAC,CAAC,CAAC,GACV,CAAC,CACC,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,EAC1B,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,KAC5B,OAAO,CAAC,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,eAAO,MAAM,gBAAgB,GAAI,CAAC,EAAE,gDAKjC,sBAAsB,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,CAAC,CAiCvC,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,OAAO,GAAG,QACsC,CAAC"}
|
package/interface/src/utils.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { createUIDGenerator, } from '@actualwave/deferred-data-access/utils';
|
|
2
|
-
import { ProxyCommand, unwrapProxy, } from '@actualwave/deferred-data-access/proxy';
|
|
3
|
-
import {
|
|
4
|
-
import { pool } from './request';
|
|
2
|
+
import { ProxyCommand, unwrapProxy, isWrappedWithProxy, } from '@actualwave/deferred-data-access/proxy';
|
|
3
|
+
import { getPool } from './request';
|
|
5
4
|
export var InterfaceType;
|
|
6
5
|
(function (InterfaceType) {
|
|
7
6
|
InterfaceType["HOST"] = "host";
|
|
@@ -15,12 +14,12 @@ export var MessageType;
|
|
|
15
14
|
export const generateId = createUIDGenerator('wi');
|
|
16
15
|
export const generateMessageId = createUIDGenerator('m');
|
|
17
16
|
const lookupForResource = async (value) => {
|
|
18
|
-
if (
|
|
17
|
+
if (value === null || value === undefined) {
|
|
19
18
|
return value;
|
|
20
19
|
}
|
|
21
|
-
if (value
|
|
20
|
+
if (Array.isArray(value)) {
|
|
22
21
|
const list = [];
|
|
23
|
-
for (
|
|
22
|
+
for (const item of value) {
|
|
24
23
|
list.push(await lookupForResource(item));
|
|
25
24
|
}
|
|
26
25
|
return list;
|
|
@@ -30,7 +29,7 @@ const lookupForResource = async (value) => {
|
|
|
30
29
|
return lookupForResource(target);
|
|
31
30
|
}
|
|
32
31
|
if (typeof value === 'function') {
|
|
33
|
-
const resource =
|
|
32
|
+
const resource = getPool().set(value);
|
|
34
33
|
return resource.toObject();
|
|
35
34
|
}
|
|
36
35
|
return value;
|
|
@@ -83,29 +82,45 @@ export const createResponseMessage = (source) =>
|
|
|
83
82
|
value,
|
|
84
83
|
error,
|
|
85
84
|
});
|
|
86
|
-
export const createIsHandshakeMessage = (id = '') =>
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
typeof
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
(
|
|
95
|
-
typeof data
|
|
96
|
-
|
|
97
|
-
target
|
|
85
|
+
export const createIsHandshakeMessage = (id = '') => (data) => {
|
|
86
|
+
if (data == null || typeof data !== 'object')
|
|
87
|
+
return false;
|
|
88
|
+
const dataId = data.id;
|
|
89
|
+
if (typeof dataId !== 'string')
|
|
90
|
+
return false;
|
|
91
|
+
return id ? id === dataId : /^wi/.test(dataId);
|
|
92
|
+
};
|
|
93
|
+
export const createIsMessage = (target) => (data) => {
|
|
94
|
+
if (data == null || typeof data !== 'object')
|
|
95
|
+
return false;
|
|
96
|
+
const { id, target: dataTarget } = data;
|
|
97
|
+
return typeof id === 'string' && target === dataTarget;
|
|
98
|
+
};
|
|
98
99
|
export const resolveOrTimeout = ({ handler, timeout, timeoutError = `Async operation didn't complete in ${timeout}ms.`, onTimeout, }) => {
|
|
99
100
|
const promise = typeof handler === 'function' ? new Promise(handler) : handler;
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
101
|
+
if (!timeout) {
|
|
102
|
+
return promise;
|
|
103
|
+
}
|
|
104
|
+
let timeoutHandle;
|
|
105
|
+
const timeoutPromise = new Promise((_, rej) => {
|
|
106
|
+
timeoutHandle = setTimeout(() => {
|
|
107
|
+
rej(timeoutError);
|
|
108
|
+
// Call onTimeout AFTER rejecting so the race is already settled.
|
|
109
|
+
// This prevents the double-rejection issue in initialize's onTimeout handler.
|
|
110
|
+
onTimeout && onTimeout(timeoutError);
|
|
111
|
+
}, timeout);
|
|
112
|
+
});
|
|
113
|
+
// Clear the timeout if the main promise wins the race
|
|
114
|
+
return Promise.race([
|
|
115
|
+
promise.then((v) => {
|
|
116
|
+
clearTimeout(timeoutHandle);
|
|
117
|
+
return v;
|
|
118
|
+
}, (e) => {
|
|
119
|
+
clearTimeout(timeoutHandle);
|
|
120
|
+
throw e;
|
|
121
|
+
}),
|
|
122
|
+
timeoutPromise,
|
|
123
|
+
]);
|
|
109
124
|
};
|
|
110
|
-
export const getMessageEventData = (event) => event
|
|
125
|
+
export const getMessageEventData = (event) => event != null && typeof event === 'object' && 'data' in event ? event.data : event;
|
|
111
126
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../packages/deferred-data-access/interface/src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,GAEnB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,YAAY,EACZ,WAAW,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../packages/deferred-data-access/interface/src/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@actualwave/deferred-data-access",
|
|
3
|
-
"version": "2.
|
|
4
|
-
"main": "
|
|
5
|
-
"module": "index.js",
|
|
3
|
+
"version": "2.1.1",
|
|
4
|
+
"main": "index.js",
|
|
5
|
+
"module": "index.es.js",
|
|
6
6
|
"types": "index.d.ts",
|
|
7
7
|
"scripts": {
|
|
8
8
|
"build": "tsc --project tsconfig.es.json && rollup -c rollup.config.js",
|
|
9
|
-
"
|
|
9
|
+
"test": "jest",
|
|
10
|
+
"test:coverage": "jest --coverage"
|
|
10
11
|
},
|
|
12
|
+
"type": "module",
|
|
11
13
|
"publishConfig": {
|
|
12
14
|
"directory": "../../dist/deferred-data-access"
|
|
13
15
|
},
|
|
14
16
|
"dependencies": {
|
|
15
|
-
"@actualwave/
|
|
16
|
-
"@actualwave/weak-storage": "^0.1.0"
|
|
17
|
+
"@actualwave/weak-storage": "0.2.0"
|
|
17
18
|
}
|
|
18
19
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../packages/deferred-data-access/proxy/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { CommandChain } from '@actualwave/deferred-data-access/command';
|
|
2
|
+
|
|
3
|
+
var ProxyCommand;
|
|
4
|
+
(function (ProxyCommand) {
|
|
5
|
+
ProxyCommand["GET"] = "P:get";
|
|
6
|
+
ProxyCommand["SET"] = "P:set";
|
|
7
|
+
ProxyCommand["APPLY"] = "P:apply";
|
|
8
|
+
ProxyCommand["DELETE_PROPERTY"] = "P:del";
|
|
9
|
+
// If proxy works in lazy mode and APPLY command has previous GET command, this will be generated.
|
|
10
|
+
ProxyCommand["METHOD_CALL"] = "P:call";
|
|
11
|
+
})(ProxyCommand || (ProxyCommand = {}));
|
|
12
|
+
const generateProxyCommand = (head, type, name, value, context, lazy) => {
|
|
13
|
+
if (type === ProxyCommand.APPLY && lazy && head?.type === ProxyCommand.GET) {
|
|
14
|
+
return new CommandChain(head.prev, ProxyCommand.METHOD_CALL, head.name, value, head.context);
|
|
15
|
+
}
|
|
16
|
+
return new CommandChain(head, type, name, value, context);
|
|
17
|
+
};
|
|
18
|
+
const getMethodName = ({ prev }) => prev?.name;
|
|
19
|
+
const getMethodCallContext = ({ prev }) => prev?.context;
|
|
20
|
+
|
|
21
|
+
const EXCLUSIONS = {
|
|
22
|
+
/*
|
|
23
|
+
INFO arguments and caller were included because they are required function properties
|
|
24
|
+
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/arguments
|
|
25
|
+
*/
|
|
26
|
+
arguments: true,
|
|
27
|
+
caller: true,
|
|
28
|
+
prototype: true,
|
|
29
|
+
};
|
|
30
|
+
const API_PROP = Symbol('P:api');
|
|
31
|
+
|
|
32
|
+
const wrapWithProxy = (
|
|
33
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
34
|
+
target, traps, api = {}) => {
|
|
35
|
+
// Always use a function as the wrapper so the Proxy can intercept `apply`.
|
|
36
|
+
// For non-function targets the wrapper body is intentionally empty — it is
|
|
37
|
+
// never actually called; the apply trap intercepts all invocations first.
|
|
38
|
+
const wrapper = Object.assign(typeof target === 'function'
|
|
39
|
+
? function $RequestFn(...args) {
|
|
40
|
+
return target.apply(this, args);
|
|
41
|
+
}
|
|
42
|
+
: function $Request() {
|
|
43
|
+
/* intentionally empty — apply trap handles all calls */
|
|
44
|
+
}, {
|
|
45
|
+
target,
|
|
46
|
+
[API_PROP]: { getTarget: () => target, ...api },
|
|
47
|
+
});
|
|
48
|
+
return new Proxy(wrapper, traps);
|
|
49
|
+
};
|
|
50
|
+
const isWrappedWithProxy = (obj) => obj != null && typeof obj === 'object' || typeof obj === 'function'
|
|
51
|
+
? !!(obj && obj[API_PROP])
|
|
52
|
+
: false;
|
|
53
|
+
const unwrapProxy = (obj) => {
|
|
54
|
+
if (obj != null && obj[API_PROP]) {
|
|
55
|
+
return obj[API_PROP].getTarget();
|
|
56
|
+
}
|
|
57
|
+
return obj;
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const isNameExcluded = (name) => name === API_PROP || Object.hasOwn(EXCLUSIONS, name);
|
|
61
|
+
const isNameSymbol = (name) => typeof name === 'symbol';
|
|
62
|
+
/**
|
|
63
|
+
* Walks a CommandChain and resolves it against a live target.
|
|
64
|
+
* Only GET and APPLY commands are supported — all other command types
|
|
65
|
+
* (SET, DELETE_PROPERTY, METHOD_CALL) are write/side-effect operations
|
|
66
|
+
* that cannot be replayed safely and will throw.
|
|
67
|
+
*/
|
|
68
|
+
const followCommandChain = async (head,
|
|
69
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
70
|
+
context) => {
|
|
71
|
+
let target = context;
|
|
72
|
+
if (context === undefined) {
|
|
73
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
74
|
+
target = head.prev
|
|
75
|
+
? await followCommandChain(head.prev)
|
|
76
|
+
: await head.context;
|
|
77
|
+
}
|
|
78
|
+
const { type, name, value } = head;
|
|
79
|
+
switch (type) {
|
|
80
|
+
case ProxyCommand.GET:
|
|
81
|
+
return target[name];
|
|
82
|
+
case ProxyCommand.APPLY:
|
|
83
|
+
return target.apply(getMethodCallContext(head), value);
|
|
84
|
+
default:
|
|
85
|
+
throw new Error(`Command "${type}" cannot be followed. Only ProxyCommand.GET and ProxyCommand.APPLY are supported by followCommandChain.`);
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
const createGetTrap = (handler) => (wrapper, name) => {
|
|
90
|
+
const { target } = wrapper;
|
|
91
|
+
if (isNameExcluded(name)) {
|
|
92
|
+
return wrapper[name];
|
|
93
|
+
}
|
|
94
|
+
// We expect that user of the lib will wrap with Proxy explicitly whatever they want
|
|
95
|
+
return handler(ProxyCommand.GET, name, undefined, target);
|
|
96
|
+
};
|
|
97
|
+
const createApplyTrap = (handler) => ({ target }, thisValue, args) => {
|
|
98
|
+
// thisValue is being ignored for now
|
|
99
|
+
// target is a function that should be applied
|
|
100
|
+
return handler(ProxyCommand.APPLY, undefined, args, target);
|
|
101
|
+
};
|
|
102
|
+
const createSetTrap = (handler) => ({ target }, name, value) => {
|
|
103
|
+
if (isNameExcluded(name)) {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
handler(ProxyCommand.SET, name, value, target);
|
|
107
|
+
return true;
|
|
108
|
+
};
|
|
109
|
+
const createDeletePropertyTrap = (handler) => (wrapper, name) => {
|
|
110
|
+
if (isNameExcluded(name)) {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
handler(ProxyCommand.DELETE_PROPERTY, name, undefined, wrapper.target);
|
|
114
|
+
return true;
|
|
115
|
+
};
|
|
116
|
+
const proxyHasTrap = (wrapper, name) => {
|
|
117
|
+
if (isNameExcluded(name)) {
|
|
118
|
+
return wrapper[name];
|
|
119
|
+
}
|
|
120
|
+
// Because of this, Promise does not call ProxyWrapper.then() and just returns it.
|
|
121
|
+
// If changed to true, it will subscribe to ProxyWrapper.then() and wait for it to resolve.
|
|
122
|
+
return false;
|
|
123
|
+
};
|
|
124
|
+
const proxyOwnKeysTrap = () => Object.getOwnPropertyNames(EXCLUSIONS);
|
|
125
|
+
const proxyGetOwnPropertyDescriptorTrap = (wrapper, name) => {
|
|
126
|
+
if (isNameExcluded(name)) {
|
|
127
|
+
return Object.getOwnPropertyDescriptor(wrapper, name);
|
|
128
|
+
}
|
|
129
|
+
return Object.getOwnPropertyDescriptor(wrapper.target, name);
|
|
130
|
+
};
|
|
131
|
+
const createProxyTrapsObject = (handler) => ({
|
|
132
|
+
get: createGetTrap(handler),
|
|
133
|
+
apply: createApplyTrap(handler),
|
|
134
|
+
set: createSetTrap(handler),
|
|
135
|
+
deleteProperty: createDeletePropertyTrap(handler),
|
|
136
|
+
has: proxyHasTrap,
|
|
137
|
+
ownKeys: proxyOwnKeysTrap,
|
|
138
|
+
// NOTE: `enumerate` trap was removed from the ES Proxy spec and is a no-op
|
|
139
|
+
// in all modern runtimes — removed to avoid confusion.
|
|
140
|
+
getOwnPropertyDescriptor: proxyGetOwnPropertyDescriptorTrap,
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
export { ProxyCommand, createProxyTrapsObject, followCommandChain, generateProxyCommand, getMethodCallContext, getMethodName, isNameExcluded, isNameSymbol, isWrappedWithProxy, unwrapProxy, wrapWithProxy };
|
|
144
|
+
//# sourceMappingURL=index.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../../../../../../packages/deferred-data-access/proxy/src/command.ts","../../../../../../packages/deferred-data-access/proxy/src/types.ts","../../../../../../packages/deferred-data-access/proxy/src/proxy.ts","../../../../../../packages/deferred-data-access/proxy/src/utils.ts","../../../../../../packages/deferred-data-access/proxy/src/traps.ts"],"sourcesContent":[null,null,null,null,null],"names":[],"mappings":"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"}
|
package/proxy/index.js
CHANGED
|
@@ -1,5 +1,155 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var command = require('@actualwave/deferred-data-access/command');
|
|
4
|
+
|
|
5
|
+
exports.ProxyCommand = void 0;
|
|
6
|
+
(function (ProxyCommand) {
|
|
7
|
+
ProxyCommand["GET"] = "P:get";
|
|
8
|
+
ProxyCommand["SET"] = "P:set";
|
|
9
|
+
ProxyCommand["APPLY"] = "P:apply";
|
|
10
|
+
ProxyCommand["DELETE_PROPERTY"] = "P:del";
|
|
11
|
+
// If proxy works in lazy mode and APPLY command has previous GET command, this will be generated.
|
|
12
|
+
ProxyCommand["METHOD_CALL"] = "P:call";
|
|
13
|
+
})(exports.ProxyCommand || (exports.ProxyCommand = {}));
|
|
14
|
+
const generateProxyCommand = (head, type, name, value, context, lazy) => {
|
|
15
|
+
if (type === exports.ProxyCommand.APPLY && lazy && head?.type === exports.ProxyCommand.GET) {
|
|
16
|
+
return new command.CommandChain(head.prev, exports.ProxyCommand.METHOD_CALL, head.name, value, head.context);
|
|
17
|
+
}
|
|
18
|
+
return new command.CommandChain(head, type, name, value, context);
|
|
19
|
+
};
|
|
20
|
+
const getMethodName = ({ prev }) => prev?.name;
|
|
21
|
+
const getMethodCallContext = ({ prev }) => prev?.context;
|
|
22
|
+
|
|
23
|
+
const EXCLUSIONS = {
|
|
24
|
+
/*
|
|
25
|
+
INFO arguments and caller were included because they are required function properties
|
|
26
|
+
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/arguments
|
|
27
|
+
*/
|
|
28
|
+
arguments: true,
|
|
29
|
+
caller: true,
|
|
30
|
+
prototype: true,
|
|
31
|
+
};
|
|
32
|
+
const API_PROP = Symbol('P:api');
|
|
33
|
+
|
|
34
|
+
const wrapWithProxy = (
|
|
35
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
36
|
+
target, traps, api = {}) => {
|
|
37
|
+
// Always use a function as the wrapper so the Proxy can intercept `apply`.
|
|
38
|
+
// For non-function targets the wrapper body is intentionally empty — it is
|
|
39
|
+
// never actually called; the apply trap intercepts all invocations first.
|
|
40
|
+
const wrapper = Object.assign(typeof target === 'function'
|
|
41
|
+
? function $RequestFn(...args) {
|
|
42
|
+
return target.apply(this, args);
|
|
43
|
+
}
|
|
44
|
+
: function $Request() {
|
|
45
|
+
/* intentionally empty — apply trap handles all calls */
|
|
46
|
+
}, {
|
|
47
|
+
target,
|
|
48
|
+
[API_PROP]: { getTarget: () => target, ...api },
|
|
49
|
+
});
|
|
50
|
+
return new Proxy(wrapper, traps);
|
|
51
|
+
};
|
|
52
|
+
const isWrappedWithProxy = (obj) => obj != null && typeof obj === 'object' || typeof obj === 'function'
|
|
53
|
+
? !!(obj && obj[API_PROP])
|
|
54
|
+
: false;
|
|
55
|
+
const unwrapProxy = (obj) => {
|
|
56
|
+
if (obj != null && obj[API_PROP]) {
|
|
57
|
+
return obj[API_PROP].getTarget();
|
|
58
|
+
}
|
|
59
|
+
return obj;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const isNameExcluded = (name) => name === API_PROP || Object.hasOwn(EXCLUSIONS, name);
|
|
63
|
+
const isNameSymbol = (name) => typeof name === 'symbol';
|
|
64
|
+
/**
|
|
65
|
+
* Walks a CommandChain and resolves it against a live target.
|
|
66
|
+
* Only GET and APPLY commands are supported — all other command types
|
|
67
|
+
* (SET, DELETE_PROPERTY, METHOD_CALL) are write/side-effect operations
|
|
68
|
+
* that cannot be replayed safely and will throw.
|
|
69
|
+
*/
|
|
70
|
+
const followCommandChain = async (head,
|
|
71
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
72
|
+
context) => {
|
|
73
|
+
let target = context;
|
|
74
|
+
if (context === undefined) {
|
|
75
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
76
|
+
target = head.prev
|
|
77
|
+
? await followCommandChain(head.prev)
|
|
78
|
+
: await head.context;
|
|
79
|
+
}
|
|
80
|
+
const { type, name, value } = head;
|
|
81
|
+
switch (type) {
|
|
82
|
+
case exports.ProxyCommand.GET:
|
|
83
|
+
return target[name];
|
|
84
|
+
case exports.ProxyCommand.APPLY:
|
|
85
|
+
return target.apply(getMethodCallContext(head), value);
|
|
86
|
+
default:
|
|
87
|
+
throw new Error(`Command "${type}" cannot be followed. Only ProxyCommand.GET and ProxyCommand.APPLY are supported by followCommandChain.`);
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
const createGetTrap = (handler) => (wrapper, name) => {
|
|
92
|
+
const { target } = wrapper;
|
|
93
|
+
if (isNameExcluded(name)) {
|
|
94
|
+
return wrapper[name];
|
|
95
|
+
}
|
|
96
|
+
// We expect that user of the lib will wrap with Proxy explicitly whatever they want
|
|
97
|
+
return handler(exports.ProxyCommand.GET, name, undefined, target);
|
|
98
|
+
};
|
|
99
|
+
const createApplyTrap = (handler) => ({ target }, thisValue, args) => {
|
|
100
|
+
// thisValue is being ignored for now
|
|
101
|
+
// target is a function that should be applied
|
|
102
|
+
return handler(exports.ProxyCommand.APPLY, undefined, args, target);
|
|
103
|
+
};
|
|
104
|
+
const createSetTrap = (handler) => ({ target }, name, value) => {
|
|
105
|
+
if (isNameExcluded(name)) {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
handler(exports.ProxyCommand.SET, name, value, target);
|
|
109
|
+
return true;
|
|
110
|
+
};
|
|
111
|
+
const createDeletePropertyTrap = (handler) => (wrapper, name) => {
|
|
112
|
+
if (isNameExcluded(name)) {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
handler(exports.ProxyCommand.DELETE_PROPERTY, name, undefined, wrapper.target);
|
|
116
|
+
return true;
|
|
117
|
+
};
|
|
118
|
+
const proxyHasTrap = (wrapper, name) => {
|
|
119
|
+
if (isNameExcluded(name)) {
|
|
120
|
+
return wrapper[name];
|
|
121
|
+
}
|
|
122
|
+
// Because of this, Promise does not call ProxyWrapper.then() and just returns it.
|
|
123
|
+
// If changed to true, it will subscribe to ProxyWrapper.then() and wait for it to resolve.
|
|
124
|
+
return false;
|
|
125
|
+
};
|
|
126
|
+
const proxyOwnKeysTrap = () => Object.getOwnPropertyNames(EXCLUSIONS);
|
|
127
|
+
const proxyGetOwnPropertyDescriptorTrap = (wrapper, name) => {
|
|
128
|
+
if (isNameExcluded(name)) {
|
|
129
|
+
return Object.getOwnPropertyDescriptor(wrapper, name);
|
|
130
|
+
}
|
|
131
|
+
return Object.getOwnPropertyDescriptor(wrapper.target, name);
|
|
132
|
+
};
|
|
133
|
+
const createProxyTrapsObject = (handler) => ({
|
|
134
|
+
get: createGetTrap(handler),
|
|
135
|
+
apply: createApplyTrap(handler),
|
|
136
|
+
set: createSetTrap(handler),
|
|
137
|
+
deleteProperty: createDeletePropertyTrap(handler),
|
|
138
|
+
has: proxyHasTrap,
|
|
139
|
+
ownKeys: proxyOwnKeysTrap,
|
|
140
|
+
// NOTE: `enumerate` trap was removed from the ES Proxy spec and is a no-op
|
|
141
|
+
// in all modern runtimes — removed to avoid confusion.
|
|
142
|
+
getOwnPropertyDescriptor: proxyGetOwnPropertyDescriptorTrap,
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
exports.createProxyTrapsObject = createProxyTrapsObject;
|
|
146
|
+
exports.followCommandChain = followCommandChain;
|
|
147
|
+
exports.generateProxyCommand = generateProxyCommand;
|
|
148
|
+
exports.getMethodCallContext = getMethodCallContext;
|
|
149
|
+
exports.getMethodName = getMethodName;
|
|
150
|
+
exports.isNameExcluded = isNameExcluded;
|
|
151
|
+
exports.isNameSymbol = isNameSymbol;
|
|
152
|
+
exports.isWrappedWithProxy = isWrappedWithProxy;
|
|
153
|
+
exports.unwrapProxy = unwrapProxy;
|
|
154
|
+
exports.wrapWithProxy = wrapWithProxy;
|
|
155
|
+
//# sourceMappingURL=index.js.map
|