@actualwave/deferred-data-access 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +39 -0
- package/command/index.d.ts +3 -0
- package/command/index.js +4 -0
- package/command/index.js.map +1 -0
- package/command/package.json +4 -0
- package/command/src/command-chain.d.ts +12 -0
- package/command/src/command-chain.js +46 -0
- package/command/src/command-chain.js.map +1 -0
- package/command/src/command-handler.d.ts +7 -0
- package/command/src/command-handler.js +12 -0
- package/command/src/command-handler.js.map +1 -0
- package/command/src/command.d.ts +11 -0
- package/command/src/command.js +31 -0
- package/command/src/command.js.map +1 -0
- package/core/core.d.ts +3 -0
- package/core/core.js +100 -0
- package/core/core.js.map +1 -0
- package/core/index.d.ts +1 -0
- package/core/index.js +2 -0
- package/core/index.js.map +1 -0
- package/dist/deferred-data-access.js +528 -0
- package/dist/deferred-data-access.js.map +1 -0
- package/dist/deferred-data-access.umd.js +2 -0
- package/dist/deferred-data-access.umd.js.map +1 -0
- package/index.d.ts +1 -0
- package/index.js +2 -0
- package/index.js.map +1 -0
- package/interface/index.d.ts +6 -0
- package/interface/index.js +7 -0
- package/interface/index.js.map +1 -0
- package/interface/package.json +4 -0
- package/interface/src/handshake.d.ts +2 -0
- package/interface/src/handshake.js +51 -0
- package/interface/src/handshake.js.map +1 -0
- package/interface/src/helpers.d.ts +8 -0
- package/interface/src/helpers.js +44 -0
- package/interface/src/helpers.js.map +1 -0
- package/interface/src/intialize.d.ts +14 -0
- package/interface/src/intialize.js +120 -0
- package/interface/src/intialize.js.map +1 -0
- package/interface/src/request.d.ts +3 -0
- package/interface/src/request.js +51 -0
- package/interface/src/request.js.map +1 -0
- package/interface/src/types.d.ts +53 -0
- package/interface/src/types.js +2 -0
- package/interface/src/types.js.map +1 -0
- package/interface/src/utils.d.ts +27 -0
- package/interface/src/utils.js +111 -0
- package/interface/src/utils.js.map +1 -0
- package/package.json +18 -0
- package/proxy/index.d.ts +5 -0
- package/proxy/index.js +5 -0
- package/proxy/index.js.map +1 -0
- package/proxy/package.json +4 -0
- package/proxy/src/command.d.ts +12 -0
- package/proxy/src/command.js +19 -0
- package/proxy/src/command.js.map +1 -0
- package/proxy/src/proxy.d.ts +6 -0
- package/proxy/src/proxy.js +19 -0
- package/proxy/src/proxy.js.map +1 -0
- package/proxy/src/traps.d.ts +4 -0
- package/proxy/src/traps.js +67 -0
- package/proxy/src/traps.js.map +1 -0
- package/proxy/src/types.d.ts +19 -0
- package/proxy/src/types.js +11 -0
- package/proxy/src/types.js.map +1 -0
- package/proxy/src/utils.d.ts +5 -0
- package/proxy/src/utils.js +25 -0
- package/proxy/src/utils.js.map +1 -0
- package/record/index.d.ts +1 -0
- package/record/index.js +2 -0
- package/record/index.js.map +1 -0
- package/record/package.json +4 -0
- package/record/record.d.ts +5 -0
- package/record/record.js +17 -0
- package/record/record.js.map +1 -0
- package/resource/index.d.ts +5 -0
- package/resource/index.js +6 -0
- package/resource/index.js.map +1 -0
- package/resource/package.json +4 -0
- package/resource/src/default-resource-pool.d.ts +2 -0
- package/resource/src/default-resource-pool.js +9 -0
- package/resource/src/default-resource-pool.js.map +1 -0
- package/resource/src/resource-pool-registry.d.ts +27 -0
- package/resource/src/resource-pool-registry.js +55 -0
- package/resource/src/resource-pool-registry.js.map +1 -0
- package/resource/src/resource-pool.d.ts +16 -0
- package/resource/src/resource-pool.js +58 -0
- package/resource/src/resource-pool.js.map +1 -0
- package/resource/src/resource.d.ts +16 -0
- package/resource/src/resource.js +21 -0
- package/resource/src/resource.js.map +1 -0
- package/resource/src/utils.d.ts +3 -0
- package/resource/src/utils.js +9 -0
- package/resource/src/utils.js.map +1 -0
- package/utils/index.d.ts +2 -0
- package/utils/index.js +3 -0
- package/utils/index.js.map +1 -0
- package/utils/package.json +4 -0
- package/utils/src/types.d.ts +24 -0
- package/utils/src/types.js +2 -0
- package/utils/src/types.js.map +1 -0
- package/utils/src/utils.d.ts +13 -0
- package/utils/src/utils.js +22 -0
- package/utils/src/utils.js.map +1 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { createIsHandshakeMessage, getMessageEventData, InterfaceType, resolveOrTimeout, } from './utils';
|
|
2
|
+
// leader
|
|
3
|
+
const handshakeHost = ({ id, root, isMessage, subscribe, unsubscribe, sendMessage, preprocessResponse = (data) => data, }) => (resolve) => {
|
|
4
|
+
const handshakeHandler = (event) => {
|
|
5
|
+
const data = getMessageEventData(preprocessResponse(event));
|
|
6
|
+
if (!isMessage(data)) {
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
unsubscribe(handshakeHandler);
|
|
10
|
+
sendMessage({ id, root });
|
|
11
|
+
resolve(data);
|
|
12
|
+
};
|
|
13
|
+
subscribe(handshakeHandler);
|
|
14
|
+
};
|
|
15
|
+
// follower
|
|
16
|
+
const handshakeGuest = ({ id, root, isMessage, subscribe, unsubscribe, sendMessage, handshakeInterval, preprocessResponse = (data) => data, }) => (resolve) => {
|
|
17
|
+
let intervalId;
|
|
18
|
+
const handshakeHandler = (event) => {
|
|
19
|
+
const data = getMessageEventData(preprocessResponse(event));
|
|
20
|
+
if (!isMessage(data)) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
unsubscribe(handshakeHandler);
|
|
24
|
+
clearInterval(intervalId);
|
|
25
|
+
resolve(data);
|
|
26
|
+
};
|
|
27
|
+
subscribe(handshakeHandler);
|
|
28
|
+
const intervalFn = () => sendMessage({ id, root });
|
|
29
|
+
if (handshakeInterval) {
|
|
30
|
+
// FIXME TS2322: Type 'Timer' is not assignable to type 'number'.
|
|
31
|
+
intervalId = setInterval(intervalFn, handshakeInterval);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
intervalFn();
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
export const handshake = ({ type, remoteId, handshakeTimeout, ...params }) => {
|
|
38
|
+
const data = {
|
|
39
|
+
...params,
|
|
40
|
+
isMessage: createIsHandshakeMessage(remoteId),
|
|
41
|
+
};
|
|
42
|
+
const handler = type === InterfaceType.HOST
|
|
43
|
+
? handshakeHost(data)
|
|
44
|
+
: handshakeGuest(data);
|
|
45
|
+
return resolveOrTimeout({
|
|
46
|
+
handler,
|
|
47
|
+
timeout: handshakeTimeout,
|
|
48
|
+
timeoutError: `Handshake sequence could not complete in ${handshakeTimeout}ms.`,
|
|
49
|
+
});
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=handshake.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
type DataCallback = (data: unknown) => void;
|
|
2
|
+
export declare const findEventEmitter: (worker: unknown) => unknown;
|
|
3
|
+
export declare const findMessagePort: (worker: unknown) => unknown;
|
|
4
|
+
export declare const createSubscriberFns: (instance: any, eventType?: string) => {
|
|
5
|
+
subscribe: (fn: DataCallback) => void;
|
|
6
|
+
unsubscribe: (fn: DataCallback) => void;
|
|
7
|
+
};
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
const EVENT_TYPE = 'message';
|
|
2
|
+
export const findEventEmitter = (worker) => {
|
|
3
|
+
if (worker) {
|
|
4
|
+
return worker;
|
|
5
|
+
}
|
|
6
|
+
if (typeof self === 'object') {
|
|
7
|
+
return self;
|
|
8
|
+
}
|
|
9
|
+
throw new Error('EventEmitter is not defined, please provide EventEmitter interface via "worker" or "eventEmitter" property.');
|
|
10
|
+
};
|
|
11
|
+
export const findMessagePort = (worker) => {
|
|
12
|
+
if (worker) {
|
|
13
|
+
return worker;
|
|
14
|
+
}
|
|
15
|
+
if (typeof self === 'object') {
|
|
16
|
+
return self;
|
|
17
|
+
}
|
|
18
|
+
throw new Error('MessagePort is not defined, please provide MessagePort interface via "worker" or "messagePort" property.');
|
|
19
|
+
};
|
|
20
|
+
export const createSubscriberFns = (instance, eventType = EVENT_TYPE) => {
|
|
21
|
+
if (instance.addEventListener) {
|
|
22
|
+
return {
|
|
23
|
+
subscribe: (listener) => instance.addEventListener(eventType, listener),
|
|
24
|
+
unsubscribe: (listener) => instance.removeEventListener(eventType, listener),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
if (instance.addListener) {
|
|
28
|
+
return {
|
|
29
|
+
subscribe: (listener) => instance.addListener(eventType, listener),
|
|
30
|
+
unsubscribe: (listener) => instance.removeListener(eventType, listener),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
if (instance.on) {
|
|
34
|
+
return {
|
|
35
|
+
subscribe: (listener) => instance.on(eventType, listener),
|
|
36
|
+
unsubscribe: (listener) => instance.off(eventType, listener),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
throw new Error('Target does not implement EventEmitter insterface, ' +
|
|
40
|
+
'it must expose "addEventListener"/"removeEventListener", ' +
|
|
41
|
+
'"addListener"/"removeListener" or ' +
|
|
42
|
+
'"on"/"off" method pair.');
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../packages/deferred-data-access/interface/src/helpers.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,GAAG,SAAS,CAAC;AAI7B,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAe,EAAW,EAAE;IAC3D,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,KAAK,CACb,6GAA6G,CAC9G,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAe,EAAW,EAAE;IAC1D,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,KAAK,CACb,0GAA0G,CAC3G,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,QAAa,EACb,SAAS,GAAG,UAAU,EAItB,EAAE;IACF,IAAI,QAAQ,CAAC,gBAAgB,EAAE,CAAC;QAC9B,OAAO;YACL,SAAS,EAAE,CAAC,QAAsB,EAAE,EAAE,CACpC,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,QAAQ,CAAC;YAChD,WAAW,EAAE,CAAC,QAAsB,EAAE,EAAE,CACtC,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,QAAQ,CAAC;SACpD,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;QACzB,OAAO;YACL,SAAS,EAAE,CAAC,QAAsB,EAAE,EAAE,CACpC,QAAQ,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC;YAC3C,WAAW,EAAE,CAAC,QAAsB,EAAE,EAAE,CACtC,QAAQ,CAAC,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC;SAC/C,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;QAChB,OAAO;YACL,SAAS,EAAE,CAAC,QAAsB,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC;YACvE,WAAW,EAAE,CAAC,QAAsB,EAAE,EAAE,CACtC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC;SACpC,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,KAAK,CACb,qDAAqD;QACnD,2DAA2D;QAC3D,oCAAoC;QACpC,yBAAyB,CAC5B,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { InitConfig } from './types';
|
|
2
|
+
export declare const initialize: ({ id: initId, root: apiRoot, ...params }: InitConfig) => Promise<{
|
|
3
|
+
stop: () => void;
|
|
4
|
+
pool: import("@actualwave/deferred-data-access/resource").ResourcePool;
|
|
5
|
+
wrap?: undefined;
|
|
6
|
+
pendingRequests?: undefined;
|
|
7
|
+
root?: undefined;
|
|
8
|
+
} | {
|
|
9
|
+
stop: () => void;
|
|
10
|
+
pool: import("@actualwave/deferred-data-access/resource").ResourcePool;
|
|
11
|
+
wrap: (context?: unknown, command?: import("@actualwave/deferred-data-access/command").Command) => unknown;
|
|
12
|
+
pendingRequests: Map<any, any>;
|
|
13
|
+
root: unknown;
|
|
14
|
+
}>;
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { handle } from '@actualwave/deferred-data-access';
|
|
2
|
+
import { isResourceObject, } from '@actualwave/deferred-data-access/resource';
|
|
3
|
+
import { handshake } from './handshake';
|
|
4
|
+
import { pool, applyRemoteRequest } from './request';
|
|
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
|
+
export const initialize = async ({ id: initId, root: apiRoot, ...params }) => {
|
|
22
|
+
const id = initId || generateId();
|
|
23
|
+
const root = apiRoot
|
|
24
|
+
? pool.set(apiRoot).toObject()
|
|
25
|
+
: undefined;
|
|
26
|
+
const { subscribe, unsubscribe, sendMessage, preprocessResponse = (data) => data, } = params;
|
|
27
|
+
const { id: remoteId, root: remoteRoot } = await handshake({
|
|
28
|
+
id,
|
|
29
|
+
root,
|
|
30
|
+
...params,
|
|
31
|
+
});
|
|
32
|
+
const pendingRequests = new Map(); // {[key: string]: { resolve: (value) => void, reject: (error) => void }}
|
|
33
|
+
const isMessage = createIsMessage(id);
|
|
34
|
+
const createRequest = createRequestMessage(id, remoteId);
|
|
35
|
+
const createResponse = createResponseMessage(id);
|
|
36
|
+
const messageHandler = async (event) => {
|
|
37
|
+
const data = getMessageEventData(preprocessResponse(event));
|
|
38
|
+
if (!isMessage(data)) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
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
|
+
}
|
|
52
|
+
}
|
|
53
|
+
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
|
+
}
|
|
65
|
+
}
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
subscribe(messageHandler);
|
|
70
|
+
const stop = () => unsubscribe(messageHandler);
|
|
71
|
+
if (!remoteRoot) {
|
|
72
|
+
return { stop, pool };
|
|
73
|
+
}
|
|
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) => {
|
|
77
|
+
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();
|
|
83
|
+
const timeoutError = `Could not receive command ${command.type}/${String(command.name)} response in ${responseTimeout}ms.`;
|
|
84
|
+
const resultPromise = resolveOrTimeout({
|
|
85
|
+
handler: async (resolve, reject) => {
|
|
86
|
+
try {
|
|
87
|
+
const request = await createRequest(command, context, id);
|
|
88
|
+
sendMessage(request);
|
|
89
|
+
pendingRequests.set(id, { resolve, reject });
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
reject(error);
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
timeout: responseTimeout || 0,
|
|
96
|
+
timeoutError,
|
|
97
|
+
onTimeout: () => {
|
|
98
|
+
const rq = pendingRequests.get(id);
|
|
99
|
+
if (!rq) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
rq.reject(new Error(timeoutError));
|
|
103
|
+
pendingRequests.delete(id);
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
const result = await resultPromise;
|
|
107
|
+
if (isResourceObject(result)) {
|
|
108
|
+
return wrap(resultPromise, command);
|
|
109
|
+
}
|
|
110
|
+
return resultPromise;
|
|
111
|
+
}, false);
|
|
112
|
+
return {
|
|
113
|
+
stop,
|
|
114
|
+
pool,
|
|
115
|
+
wrap,
|
|
116
|
+
pendingRequests,
|
|
117
|
+
root: remoteRoot ? wrap(remoteRoot) : null,
|
|
118
|
+
};
|
|
119
|
+
};
|
|
120
|
+
//# sourceMappingURL=intialize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intialize.js","sourceRoot":"","sources":["../../../../packages/deferred-data-access/interface/src/intialize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { ProxyCommand } from '@actualwave/deferred-data-access/proxy';
|
|
2
|
+
import { getRegistry, isResourceObject, } from '@actualwave/deferred-data-access/resource';
|
|
3
|
+
const registry = getRegistry();
|
|
4
|
+
export const pool = registry.createPool();
|
|
5
|
+
const extractResourceFrom = (value) => {
|
|
6
|
+
if (!isResourceObject(value)) {
|
|
7
|
+
return value;
|
|
8
|
+
}
|
|
9
|
+
const { poolId, id } = value;
|
|
10
|
+
const pool = getRegistry().get(poolId);
|
|
11
|
+
if (!pool) {
|
|
12
|
+
throw new Error(`Resource Pool "${poolId}" does not exist.`);
|
|
13
|
+
}
|
|
14
|
+
const target = pool.getById(id);
|
|
15
|
+
if (!target) {
|
|
16
|
+
throw new Error(`Resource "${id}" does not exist, pool "${poolId}".`);
|
|
17
|
+
}
|
|
18
|
+
return target;
|
|
19
|
+
};
|
|
20
|
+
export const applyRemoteRequest = ({ command, command: { type, value }, context, }) => {
|
|
21
|
+
const target = extractResourceFrom(context);
|
|
22
|
+
const name = command.name;
|
|
23
|
+
if (type !== ProxyCommand.APPLY && !target) {
|
|
24
|
+
throw new Error(`Cannot excute command ${type}/${String(name)} on non existent target(${target}).`);
|
|
25
|
+
}
|
|
26
|
+
let result;
|
|
27
|
+
switch (type) {
|
|
28
|
+
case ProxyCommand.GET:
|
|
29
|
+
result = target[name];
|
|
30
|
+
break;
|
|
31
|
+
case ProxyCommand.SET:
|
|
32
|
+
return (target[name] = extractResourceFrom(value));
|
|
33
|
+
case ProxyCommand.DELETE_PROPERTY:
|
|
34
|
+
return delete target[name];
|
|
35
|
+
case ProxyCommand.APPLY:
|
|
36
|
+
{
|
|
37
|
+
const [exeContext, args] = value;
|
|
38
|
+
result = target.apply(extractResourceFrom(exeContext), args.map(extractResourceFrom));
|
|
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);
|
|
47
|
+
return resource.toObject();
|
|
48
|
+
}
|
|
49
|
+
return result;
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=request.js.map
|
|
@@ -0,0 +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,GAGjB,MAAM,2CAA2C,CAAC;AAInD,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;AAC/B,MAAM,CAAC,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC;AAE1C,MAAM,mBAAmB,GAAG,CAAC,KAAc,EAAO,EAAE;IAClD,IAAI,CAAC,gBAAgB,CAAC,KAAY,CAAC,EAAE,CAAC;QACpC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,KAAuB,CAAC;IAE/C,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAEvC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,kBAAkB,MAAM,mBAAmB,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAEhC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,aAAa,EAAE,2BAA2B,MAAM,IAAI,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,EACjC,OAAO,EACP,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EACxB,OAAO,GACQ,EAAE,EAAE;IACnB,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAoB,CAAC;IAE1C,IAAI,IAAI,KAAK,YAAY,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,yBAAyB,IAAI,IAAI,MAAM,CACrC,IAAI,CACL,2BAA2B,MAAM,IAAI,CACvC,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC;IAEX,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,YAAY,CAAC,GAAG;YACnB,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YACtB,MAAM;QACR,KAAK,YAAY,CAAC,GAAG;YACnB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;QACrD,KAAK,YAAY,CAAC,eAAe;YAC/B,OAAO,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7B,KAAK,YAAY,CAAC,KAAK;YACrB,CAAC;gBACC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,KAA6B,CAAC;gBACzD,MAAM,GAAG,MAAM,CAAC,KAAK,CACnB,mBAAmB,CAAC,UAAU,CAAC,EAC/B,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAC9B,CAAC;YACJ,CAAC;YACD,MAAM;QACR,KAAK,YAAY,CAAC,WAAW;YAC3B,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,GAAI,KAAmB,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;YACxE,MAAM;IACV,CAAC;IAED,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAa,CAAC;QAC9C,OAAO,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { ResourceObject } from '@actualwave/deferred-data-access/resource';
|
|
2
|
+
import { ICommand } from '@actualwave/deferred-data-access/utils';
|
|
3
|
+
import { InterfaceType, MessageType } from './utils';
|
|
4
|
+
export type InterfaceCallbacks = {
|
|
5
|
+
subscribe: (listener: (event: unknown) => void) => void;
|
|
6
|
+
unsubscribe: (listener: (event: unknown) => void) => void;
|
|
7
|
+
sendMessage: (data: unknown) => void;
|
|
8
|
+
preprocessResponse?: (data: unknown) => unknown;
|
|
9
|
+
};
|
|
10
|
+
export type HandshakeReceiverData = InterfaceCallbacks & {
|
|
11
|
+
id: string;
|
|
12
|
+
root?: ResourceObject;
|
|
13
|
+
isMessage: (msg: unknown) => boolean;
|
|
14
|
+
};
|
|
15
|
+
export type HandshakeSenderData = HandshakeReceiverData & {
|
|
16
|
+
handshakeInterval: number;
|
|
17
|
+
};
|
|
18
|
+
export type HandshakeData = (HandshakeReceiverData | HandshakeSenderData) & {
|
|
19
|
+
type: InterfaceType;
|
|
20
|
+
remoteId: string;
|
|
21
|
+
handshakeTimeout: number;
|
|
22
|
+
};
|
|
23
|
+
export type HandshakeResponse = {
|
|
24
|
+
id: string;
|
|
25
|
+
root?: ResourceObject;
|
|
26
|
+
};
|
|
27
|
+
export type BaseInitConfig = InterfaceCallbacks & {
|
|
28
|
+
id?: string;
|
|
29
|
+
root?: unknown;
|
|
30
|
+
remoteId?: string;
|
|
31
|
+
responseTimeout?: number;
|
|
32
|
+
handshakeTimeout?: number;
|
|
33
|
+
handshakeInterval?: number;
|
|
34
|
+
};
|
|
35
|
+
export type InitConfig = InterfaceCallbacks & BaseInitConfig & {
|
|
36
|
+
type: InterfaceType;
|
|
37
|
+
};
|
|
38
|
+
export type MessageBase = {
|
|
39
|
+
id: string;
|
|
40
|
+
type: MessageType;
|
|
41
|
+
source: string;
|
|
42
|
+
target: string;
|
|
43
|
+
};
|
|
44
|
+
export type RequestMessage = MessageBase & {
|
|
45
|
+
command: ICommand;
|
|
46
|
+
context: unknown;
|
|
47
|
+
};
|
|
48
|
+
export type ResponseMessage = MessageBase & {
|
|
49
|
+
value?: unknown;
|
|
50
|
+
error?: {
|
|
51
|
+
message: string;
|
|
52
|
+
};
|
|
53
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../packages/deferred-data-access/interface/src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { ICommandList } from '@actualwave/deferred-data-access/utils';
|
|
2
|
+
import { RequestMessage, ResponseMessage } from './types';
|
|
3
|
+
export declare enum InterfaceType {
|
|
4
|
+
HOST = "host",
|
|
5
|
+
GUEST = "guest"
|
|
6
|
+
}
|
|
7
|
+
export declare enum MessageType {
|
|
8
|
+
REQUEST = "request",
|
|
9
|
+
RESPONSE = "response"
|
|
10
|
+
}
|
|
11
|
+
export declare const generateId: () => string;
|
|
12
|
+
export declare const generateMessageId: () => string;
|
|
13
|
+
export declare const createRequestMessage: (source: string, target: string) => (commandChain: ICommandList, context?: Promise<unknown>, id?: string) => Promise<RequestMessage>;
|
|
14
|
+
export declare const createResponseMessage: (source: string) => ({ id, source: target }: RequestMessage, value: unknown, error?: {
|
|
15
|
+
message: string;
|
|
16
|
+
}) => ResponseMessage;
|
|
17
|
+
export declare const createIsHandshakeMessage: (id?: string) => (data: any) => boolean;
|
|
18
|
+
export declare const createIsMessage: (target: string) => (data: any) => boolean;
|
|
19
|
+
interface ResolveOrTimeoutConfig<T> {
|
|
20
|
+
handler: Promise<T> | ((resolve: (data: T) => void, reject: (data: unknown) => void) => unknown);
|
|
21
|
+
timeout: number;
|
|
22
|
+
timeoutError: string;
|
|
23
|
+
onTimeout?: (msg: string) => void;
|
|
24
|
+
}
|
|
25
|
+
export declare const resolveOrTimeout: <T>({ handler, timeout, timeoutError, onTimeout, }: ResolveOrTimeoutConfig<T>) => Promise<T>;
|
|
26
|
+
export declare const getMessageEventData: (event: any) => any;
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { createUIDGenerator, } from '@actualwave/deferred-data-access/utils';
|
|
2
|
+
import { ProxyCommand, unwrapProxy, } from '@actualwave/deferred-data-access/proxy';
|
|
3
|
+
import { isWrappedWithProxy } from '@actualwave/deferred-data-access/proxy';
|
|
4
|
+
import { pool } from './request';
|
|
5
|
+
export var InterfaceType;
|
|
6
|
+
(function (InterfaceType) {
|
|
7
|
+
InterfaceType["HOST"] = "host";
|
|
8
|
+
InterfaceType["GUEST"] = "guest";
|
|
9
|
+
})(InterfaceType || (InterfaceType = {}));
|
|
10
|
+
export var MessageType;
|
|
11
|
+
(function (MessageType) {
|
|
12
|
+
MessageType["REQUEST"] = "request";
|
|
13
|
+
MessageType["RESPONSE"] = "response";
|
|
14
|
+
})(MessageType || (MessageType = {}));
|
|
15
|
+
export const generateId = createUIDGenerator('wi');
|
|
16
|
+
export const generateMessageId = createUIDGenerator('m');
|
|
17
|
+
const lookupForResource = async (value) => {
|
|
18
|
+
if (!value) {
|
|
19
|
+
return value;
|
|
20
|
+
}
|
|
21
|
+
if (value instanceof Array) {
|
|
22
|
+
const list = [];
|
|
23
|
+
for (let item of value) {
|
|
24
|
+
list.push(await lookupForResource(item));
|
|
25
|
+
}
|
|
26
|
+
return list;
|
|
27
|
+
}
|
|
28
|
+
if (isWrappedWithProxy(value)) {
|
|
29
|
+
const target = await unwrapProxy(value);
|
|
30
|
+
return lookupForResource(target);
|
|
31
|
+
}
|
|
32
|
+
if (typeof value === 'function') {
|
|
33
|
+
const resource = pool.set(value);
|
|
34
|
+
return resource.toObject();
|
|
35
|
+
}
|
|
36
|
+
return value;
|
|
37
|
+
};
|
|
38
|
+
/*
|
|
39
|
+
Message signature
|
|
40
|
+
|
|
41
|
+
{
|
|
42
|
+
id, // every sent message has id, request and its response have same id
|
|
43
|
+
type, // message type -- "request" or "response"
|
|
44
|
+
source, // sender worker interface id
|
|
45
|
+
target, // receiver worker interface id
|
|
46
|
+
command, // request proxy command
|
|
47
|
+
context, // request command context
|
|
48
|
+
value, // response value
|
|
49
|
+
error, // response error
|
|
50
|
+
}
|
|
51
|
+
*/
|
|
52
|
+
export const createRequestMessage = (source, target) => async (commandChain, context, id = generateMessageId()) => {
|
|
53
|
+
const command = commandChain.toObject();
|
|
54
|
+
const contextTarget = await context;
|
|
55
|
+
// apply function to owner object
|
|
56
|
+
if (command.type === ProxyCommand.APPLY) {
|
|
57
|
+
let exeContext;
|
|
58
|
+
if (commandChain.prev) {
|
|
59
|
+
exeContext = await commandChain.prev.context;
|
|
60
|
+
}
|
|
61
|
+
// prepare arguments for Function.apply()
|
|
62
|
+
command.value = [exeContext, await lookupForResource(command.value)];
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
command.value = await lookupForResource(command.value);
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
id,
|
|
69
|
+
type: MessageType.REQUEST,
|
|
70
|
+
source,
|
|
71
|
+
target,
|
|
72
|
+
command,
|
|
73
|
+
context: contextTarget,
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
export const createResponseMessage = (source) =>
|
|
77
|
+
// with "undefined" value, "error" key will not be packed into JSON, less bytes sent
|
|
78
|
+
({ id, source: target }, value, error) => ({
|
|
79
|
+
id,
|
|
80
|
+
type: MessageType.RESPONSE,
|
|
81
|
+
source,
|
|
82
|
+
target,
|
|
83
|
+
value,
|
|
84
|
+
error,
|
|
85
|
+
});
|
|
86
|
+
export const createIsHandshakeMessage = (id = '') =>
|
|
87
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
88
|
+
(data) => data &&
|
|
89
|
+
typeof data === 'object' &&
|
|
90
|
+
typeof data.id === 'string' &&
|
|
91
|
+
((!id && data.id.match(/^wi/)) || (id && id === data.id));
|
|
92
|
+
export const createIsMessage = (target) =>
|
|
93
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
94
|
+
(data) => data &&
|
|
95
|
+
typeof data === 'object' &&
|
|
96
|
+
typeof data.id === 'string' &&
|
|
97
|
+
target === data.target;
|
|
98
|
+
export const resolveOrTimeout = ({ handler, timeout, timeoutError = `Async operation didn't complete in ${timeout}ms.`, onTimeout, }) => {
|
|
99
|
+
const promise = typeof handler === 'function' ? new Promise(handler) : handler;
|
|
100
|
+
return timeout
|
|
101
|
+
? Promise.race([
|
|
102
|
+
promise,
|
|
103
|
+
new Promise((_, rej) => setTimeout(() => {
|
|
104
|
+
rej(timeoutError);
|
|
105
|
+
onTimeout && onTimeout(timeoutError);
|
|
106
|
+
}, timeout)),
|
|
107
|
+
])
|
|
108
|
+
: promise;
|
|
109
|
+
};
|
|
110
|
+
export const getMessageEventData = (event) => event instanceof Event ? event.data : event;
|
|
111
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@actualwave/deferred-data-access",
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"main": "dist/deferred-data-access.js",
|
|
5
|
+
"module": "index.js",
|
|
6
|
+
"types": "index.d.ts",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsc --project tsconfig.es.json && rollup -c rollup.config.js",
|
|
9
|
+
"postinstall": "npm run build"
|
|
10
|
+
},
|
|
11
|
+
"publishConfig": {
|
|
12
|
+
"directory": "../../dist/deferred-data-access"
|
|
13
|
+
},
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"@actualwave/has-own": "^0.0.3",
|
|
16
|
+
"@actualwave/weak-storage": "^0.1.0"
|
|
17
|
+
}
|
|
18
|
+
}
|
package/proxy/index.d.ts
ADDED
package/proxy/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { CommandChain } from '@actualwave/deferred-data-access/command';
|
|
2
|
+
import { PropertyName, CommandContext, ICommandChain } from '@actualwave/deferred-data-access/utils';
|
|
3
|
+
export declare enum ProxyCommand {
|
|
4
|
+
GET = "P:get",
|
|
5
|
+
SET = "P:set",
|
|
6
|
+
APPLY = "P:apply",
|
|
7
|
+
DELETE_PROPERTY = "P:del",
|
|
8
|
+
METHOD_CALL = "P:call"
|
|
9
|
+
}
|
|
10
|
+
export declare const generateProxyCommand: (head: ICommandChain | undefined, type: ProxyCommand, name: PropertyName | undefined, value: unknown, context: CommandContext, lazy: boolean) => CommandChain;
|
|
11
|
+
export declare const getMethodName: ({ prev }: CommandChain) => PropertyName | undefined;
|
|
12
|
+
export declare const getMethodCallContext: ({ prev }: CommandChain) => CommandContext | undefined;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { CommandChain } from '@actualwave/deferred-data-access/command';
|
|
2
|
+
export var ProxyCommand;
|
|
3
|
+
(function (ProxyCommand) {
|
|
4
|
+
ProxyCommand["GET"] = "P:get";
|
|
5
|
+
ProxyCommand["SET"] = "P:set";
|
|
6
|
+
ProxyCommand["APPLY"] = "P:apply";
|
|
7
|
+
ProxyCommand["DELETE_PROPERTY"] = "P:del";
|
|
8
|
+
// If proxy works in lazy mode and APPLY command has previous GET command, this will be generated.
|
|
9
|
+
ProxyCommand["METHOD_CALL"] = "P:call";
|
|
10
|
+
})(ProxyCommand || (ProxyCommand = {}));
|
|
11
|
+
export const generateProxyCommand = (head, type, name, value, context, lazy) => {
|
|
12
|
+
if (type === ProxyCommand.APPLY && lazy && head?.type === ProxyCommand.GET) {
|
|
13
|
+
return new CommandChain(head.prev, ProxyCommand.METHOD_CALL, head.name, value, head.context);
|
|
14
|
+
}
|
|
15
|
+
return new CommandChain(head, type, name, value, context);
|
|
16
|
+
};
|
|
17
|
+
export const getMethodName = ({ prev }) => prev?.name;
|
|
18
|
+
export const getMethodCallContext = ({ prev }) => prev?.context;
|
|
19
|
+
//# sourceMappingURL=command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../../../packages/deferred-data-access/proxy/src/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0CAA0C,CAAC;AAOxE,MAAM,CAAN,IAAY,YAOX;AAPD,WAAY,YAAY;IACtB,6BAAa,CAAA;IACb,6BAAa,CAAA;IACb,iCAAiB,CAAA;IACjB,yCAAyB,CAAA;IACzB,kGAAkG;IAClG,sCAAsB,CAAA;AACxB,CAAC,EAPW,YAAY,KAAZ,YAAY,QAOvB;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,IAA+B,EAC/B,IAAkB,EAClB,IAA8B,EAC9B,KAAc,EACd,OAAuB,EACvB,IAAa,EACC,EAAE;IAChB,IAAI,IAAI,KAAK,YAAY,CAAC,KAAK,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,KAAK,YAAY,CAAC,GAAG,EAAE,CAAC;QAC3E,OAAO,IAAI,YAAY,CACrB,IAAI,CAAC,IAAI,EACT,YAAY,CAAC,WAAW,EACxB,IAAI,CAAC,IAAI,EACT,KAAK,EACL,IAAI,CAAC,OAAO,CACb,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AAC5D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAAE,IAAI,EAAgB,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;AACpE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,EAAE,IAAI,EAAgB,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ProxyWrapper, APIObject } from './types';
|
|
2
|
+
export declare const wrapWithProxy: (target: any, traps: {
|
|
3
|
+
[key: string]: () => void;
|
|
4
|
+
}, api?: APIObject) => ProxyWrapper;
|
|
5
|
+
export declare const isWrappedWithProxy: (obj: any) => boolean;
|
|
6
|
+
export declare const unwrapProxy: <T = unknown>(obj: any) => T;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { API_PROP } from './types';
|
|
2
|
+
export const wrapWithProxy = (
|
|
3
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
4
|
+
target, traps, api = {}) => {
|
|
5
|
+
const wrapper = Object.assign(typeof target === 'function'
|
|
6
|
+
? function $RequestFn(...args) {
|
|
7
|
+
return target.apply(this, args);
|
|
8
|
+
}
|
|
9
|
+
: function $Request() {
|
|
10
|
+
// because
|
|
11
|
+
}, {
|
|
12
|
+
target,
|
|
13
|
+
[API_PROP]: { getTarget: () => target, ...api },
|
|
14
|
+
});
|
|
15
|
+
return new Proxy(wrapper, traps);
|
|
16
|
+
};
|
|
17
|
+
export const isWrappedWithProxy = (obj) => !!(obj && obj[API_PROP]);
|
|
18
|
+
export const unwrapProxy = (obj) => obj && obj[API_PROP] && obj[API_PROP].getTarget() || obj;
|
|
19
|
+
//# sourceMappingURL=proxy.js.map
|