@adobe/uix-core 0.6.5 → 0.7.1-nightly.20230114
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/dist/__helpers__/jest.messagechannel.d.cts +2 -0
- package/dist/__helpers__/jest.messagechannel.d.cts.map +1 -0
- package/dist/__mocks__/mock-finalization-registry.d.ts +11 -0
- package/dist/__mocks__/mock-finalization-registry.d.ts.map +1 -0
- package/dist/__mocks__/mock-weak-ref.d.ts +7 -0
- package/dist/__mocks__/mock-weak-ref.d.ts.map +1 -0
- package/dist/constants.d.ts +8 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/cross-realm-object.d.ts +44 -0
- package/dist/cross-realm-object.d.ts.map +1 -0
- package/dist/debuglog.d.ts +11 -0
- package/dist/debuglog.d.ts.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +906 -7
- package/dist/index.js.map +1 -1
- package/dist/message-wrapper.d.ts +9 -0
- package/dist/message-wrapper.d.ts.map +1 -0
- package/dist/object-simulator.d.ts +28 -0
- package/dist/object-simulator.d.ts.map +1 -0
- package/dist/object-simulator.test.d.ts +2 -0
- package/dist/object-simulator.test.d.ts.map +1 -0
- package/dist/object-walker.d.ts +30 -0
- package/dist/object-walker.d.ts.map +1 -0
- package/dist/promises/index.d.ts +3 -0
- package/dist/promises/index.d.ts.map +1 -0
- package/dist/promises/promise-wrappers.test.d.ts +2 -0
- package/dist/promises/promise-wrappers.test.d.ts.map +1 -0
- package/dist/promises/timed.d.ts +15 -0
- package/dist/promises/timed.d.ts.map +1 -0
- package/dist/promises/wait.d.ts +7 -0
- package/dist/promises/wait.d.ts.map +1 -0
- package/dist/remote-subject.d.ts +70 -0
- package/dist/remote-subject.d.ts.map +1 -0
- package/dist/rpc/call-receiver.d.ts +4 -0
- package/dist/rpc/call-receiver.d.ts.map +1 -0
- package/dist/rpc/call-receiver.test.d.ts +2 -0
- package/dist/rpc/call-receiver.test.d.ts.map +1 -0
- package/dist/rpc/call-sender.d.ts +4 -0
- package/dist/rpc/call-sender.d.ts.map +1 -0
- package/dist/rpc/call-sender.test.d.ts +2 -0
- package/dist/rpc/call-sender.test.d.ts.map +1 -0
- package/dist/rpc/index.d.ts +3 -0
- package/dist/rpc/index.d.ts.map +1 -0
- package/dist/tickets.d.ts +34 -0
- package/dist/tickets.d.ts.map +1 -0
- package/dist/tunnel/index.d.ts +2 -0
- package/dist/tunnel/index.d.ts.map +1 -0
- package/dist/tunnel/tunnel-messenger.d.ts +25 -0
- package/dist/tunnel/tunnel-messenger.d.ts.map +1 -0
- package/dist/tunnel/tunnel-messenger.test.d.ts +2 -0
- package/dist/tunnel/tunnel-messenger.test.d.ts.map +1 -0
- package/dist/tunnel/tunnel.d.ts +62 -0
- package/dist/tunnel/tunnel.d.ts.map +1 -0
- package/dist/tunnel/tunnel.test.d.ts +2 -0
- package/dist/tunnel/tunnel.test.d.ts.map +1 -0
- package/dist/types.d.ts +1 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/value-assertions.d.ts +13 -0
- package/dist/value-assertions.d.ts.map +1 -0
- package/package.json +1 -1
- package/src/__helpers__/jest.messagechannel.cjs +3 -0
- package/src/__mocks__/mock-finalization-registry.ts +13 -0
- package/src/__mocks__/mock-weak-ref.ts +10 -0
- package/src/constants.ts +10 -0
- package/src/cross-realm-object.ts +117 -0
- package/src/debuglog.ts +1 -1
- package/src/index.ts +4 -1
- package/src/message-wrapper.ts +35 -0
- package/src/object-simulator.test.ts +328 -0
- package/src/object-simulator.ts +145 -0
- package/src/object-walker.ts +132 -0
- package/src/promises/index.ts +2 -0
- package/src/promises/promise-wrappers.test.ts +63 -0
- package/src/promises/timed.ts +41 -0
- package/src/promises/wait.ts +10 -0
- package/src/remote-subject.ts +185 -0
- package/src/rpc/call-receiver.test.ts +90 -0
- package/src/rpc/call-receiver.ts +29 -0
- package/src/rpc/call-sender.test.ts +73 -0
- package/src/rpc/call-sender.ts +72 -0
- package/src/rpc/index.ts +2 -0
- package/src/tickets.ts +71 -0
- package/src/tunnel/index.ts +1 -0
- package/src/tunnel/tunnel-messenger.test.ts +183 -0
- package/src/tunnel/tunnel-messenger.ts +99 -0
- package/src/tunnel/tunnel.test.ts +211 -0
- package/src/tunnel/tunnel.ts +322 -0
- package/src/types.ts +3 -5
- package/src/value-assertions.ts +58 -0
- package/tsconfig.json +2 -6
- package/dist/timeout-promise.d.ts +0 -12
- package/dist/timeout-promise.d.ts.map +0 -1
- package/src/timeout-promise.ts +0 -36
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { WrappedMessage } from "../message-wrapper";
|
|
2
|
+
import { HandshakeAcceptedTicket, HandshakeOfferedTicket } from "../tickets";
|
|
3
|
+
declare type HandshakeAccepted = WrappedMessage<HandshakeAcceptedTicket>;
|
|
4
|
+
declare type HandshakeOffered = WrappedMessage<HandshakeOfferedTicket>;
|
|
5
|
+
declare type HandshakeMessage = HandshakeAccepted | HandshakeOffered;
|
|
6
|
+
export declare class TunnelMessenger {
|
|
7
|
+
private myOrigin;
|
|
8
|
+
private remoteOrigin;
|
|
9
|
+
private logger;
|
|
10
|
+
private versionWarnings;
|
|
11
|
+
constructor(opts: {
|
|
12
|
+
myOrigin: string;
|
|
13
|
+
targetOrigin: string;
|
|
14
|
+
logger: Console;
|
|
15
|
+
});
|
|
16
|
+
resetWarnings(): void;
|
|
17
|
+
makeAccepted(id: string): HandshakeAccepted;
|
|
18
|
+
makeOffered(id: string): HandshakeOffered;
|
|
19
|
+
isHandshakeAccepting(message: unknown, id: string): message is HandshakeAccepted;
|
|
20
|
+
isHandshakeOffer(message: unknown): message is HandshakeOffered;
|
|
21
|
+
isHandshake(message: unknown): message is HandshakeMessage;
|
|
22
|
+
private logMalformed;
|
|
23
|
+
}
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=tunnel-messenger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tunnel-messenger.d.ts","sourceRoot":"","sources":["../../src/tunnel/tunnel-messenger.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAA2B,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAG7E,aAAK,iBAAiB,GAAG,cAAc,CAAC,uBAAuB,CAAC,CAAC;AACjE,aAAK,gBAAgB,GAAG,cAAc,CAAC,sBAAsB,CAAC,CAAC;AAC/D,aAAK,gBAAgB,GAAG,iBAAiB,GAAG,gBAAgB,CAAC;AAE7D,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,eAAe,CAAqB;gBAChC,IAAI,EAAE;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,OAAO,CAAC;KACjB;IAMD,aAAa;IAIb,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB;IAM3C,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB;IAMzC,oBAAoB,CAClB,OAAO,EAAE,OAAO,EAChB,EAAE,EAAE,MAAM,GACT,OAAO,IAAI,iBAAiB;IAM/B,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,gBAAgB;IAM/D,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,gBAAgB;IAyB1D,OAAO,CAAC,YAAY;CAiBrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tunnel-messenger.test.d.ts","sourceRoot":"","sources":["../../src/tunnel/tunnel-messenger.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import EventEmitter from "eventemitter3";
|
|
2
|
+
/** @alpha */
|
|
3
|
+
export interface TunnelConfig {
|
|
4
|
+
/**
|
|
5
|
+
* To ensure secure communication, target origin must be specified, so the
|
|
6
|
+
* tunnel can't connect to an unauthorized domain. Can be '*' to disable
|
|
7
|
+
* origin checks, but this is discouraged!
|
|
8
|
+
*/
|
|
9
|
+
targetOrigin: string;
|
|
10
|
+
/**
|
|
11
|
+
* A Promise for a tunnel will reject if not connected within timeout (ms).
|
|
12
|
+
* @defaultValue 4000
|
|
13
|
+
*/
|
|
14
|
+
timeout: number;
|
|
15
|
+
/**
|
|
16
|
+
* Logger instance to use for debugging tunnel connection.
|
|
17
|
+
*/
|
|
18
|
+
logger: Console;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* An EventEmitter across two documents. It emits events on the remote document
|
|
22
|
+
* and takes subscribers from the local document.
|
|
23
|
+
* @alpha
|
|
24
|
+
*/
|
|
25
|
+
export declare class Tunnel extends EventEmitter {
|
|
26
|
+
private _messagePort;
|
|
27
|
+
config: TunnelConfig;
|
|
28
|
+
constructor(config: TunnelConfig);
|
|
29
|
+
/**
|
|
30
|
+
* Create a Tunnel that connects to the page running in the provided iframe.
|
|
31
|
+
*
|
|
32
|
+
* @remarks
|
|
33
|
+
* Returns a Tunnel that listens for connection requests from the page in the
|
|
34
|
+
* provided iframe, which it will send periodically until timeout if that page
|
|
35
|
+
* has called {@link Tunnel.toParent}. If it receives one, the Tunnel will accept the
|
|
36
|
+
* connection and send an exclusive MessagePort to the xrobject on the other
|
|
37
|
+
* end. The tunnel may reconnect if the iframe reloads, in which case it will
|
|
38
|
+
* emit another "connected" event.
|
|
39
|
+
*
|
|
40
|
+
* @alpha
|
|
41
|
+
*/
|
|
42
|
+
static toIframe(target: HTMLIFrameElement, options: Partial<TunnelConfig>): Tunnel;
|
|
43
|
+
/**
|
|
44
|
+
* Create a Tunnel that connects to the page running in the parent window.
|
|
45
|
+
*
|
|
46
|
+
* @remarks
|
|
47
|
+
* Returns a Tunnel that starts sending connection requests to the parent
|
|
48
|
+
* window, sending them periodically until the window responds with an accept
|
|
49
|
+
* message or the timeout passes. The parent window will accept the request if
|
|
50
|
+
* it calls {@link Tunnel.toIframe}.
|
|
51
|
+
*
|
|
52
|
+
* @alpha
|
|
53
|
+
*/
|
|
54
|
+
static toParent(source: WindowProxy, opts: Partial<TunnelConfig>): Tunnel;
|
|
55
|
+
connect(remote: MessagePort): void;
|
|
56
|
+
destroy(): void;
|
|
57
|
+
emit(type: string | symbol, payload?: unknown): boolean;
|
|
58
|
+
emitLocal: (type: string | symbol, payload?: unknown) => any;
|
|
59
|
+
private static _normalizeConfig;
|
|
60
|
+
private _emitFromMessage;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=tunnel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tunnel.d.ts","sourceRoot":"","sources":["../../src/tunnel/tunnel.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,eAAe,CAAC;AA4BzC,aAAa;AACb,MAAM,WAAW,YAAY;IAG3B;;;;OAIG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,MAAM,EAAE,OAAO,CAAC;CAGjB;AAuBD;;;;GAIG;AACH,qBAAa,MAAO,SAAQ,YAAY;IAGtC,OAAO,CAAC,YAAY,CAAc;IAElC,MAAM,EAAE,YAAY,CAAC;gBAMT,MAAM,EAAE,YAAY;IAShC;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,QAAQ,CACb,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,GAC7B,MAAM;IA+DT;;;;;;;;;;OAUG;IACH,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,MAAM;IA6DzE,OAAO,CAAC,MAAM,EAAE,WAAW;IAW3B,OAAO,IAAI,IAAI;IAUf,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO;IAQvD,SAAS,SAAU,MAAM,GAAG,MAAM,YAAY,OAAO,SAEnD;IAMF,OAAO,CAAC,MAAM,CAAC,gBAAgB;IA+B/B,OAAO,CAAC,gBAAgB,CAEtB;CAGH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tunnel.test.d.ts","sourceRoot":"","sources":["../../src/tunnel/tunnel.test.ts"],"names":[],"mappings":""}
|
package/dist/types.d.ts
CHANGED
|
@@ -133,10 +133,7 @@ export interface HostConnection<T = unknown> {
|
|
|
133
133
|
export interface GuestConnection {
|
|
134
134
|
id: string;
|
|
135
135
|
url: URL;
|
|
136
|
-
attachUI(frame: HTMLIFrameElement, privateMethods?: RemoteHostApis):
|
|
137
|
-
promise: Promise<unknown>;
|
|
138
|
-
destroy: Function;
|
|
139
|
-
};
|
|
136
|
+
attachUI(frame: HTMLIFrameElement, privateMethods?: RemoteHostApis): Promise<unknown>;
|
|
140
137
|
load(): Promise<unknown>;
|
|
141
138
|
error?: Error;
|
|
142
139
|
hasCapabilities(capabilities: unknown): boolean;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** @internal */
|
|
2
|
+
export declare type Primitive = string | number | boolean;
|
|
3
|
+
export declare function isPlainObject<T>(value: unknown): value is T & object;
|
|
4
|
+
export declare function isPrimitive(value: unknown): value is Primitive;
|
|
5
|
+
export declare function isIterable<T>(value: unknown): value is T[];
|
|
6
|
+
export declare function isFunction(value: unknown): value is CallableFunction;
|
|
7
|
+
export declare function hasProp(value: unknown, prop: string): boolean;
|
|
8
|
+
export declare function isTunnelSource(value: unknown): value is Window | ServiceWorker;
|
|
9
|
+
export declare function isIframe(value: unknown): value is HTMLIFrameElement;
|
|
10
|
+
export declare function isObjectWithPrototype<T>(value: unknown): value is T & {
|
|
11
|
+
[key: string | symbol]: unknown;
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=value-assertions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"value-assertions.d.ts","sourceRoot":"","sources":["../src/value-assertions.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAChB,oBAAY,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAElD,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,CAAC,GAAG,MAAM,CAMpE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAM9D;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,CAAC,EAAE,CAE1D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,gBAAgB,CAEpE;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAEnD;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,MAAM,GAAG,aAAa,CAMjC;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAMnE;AAED,wBAAgB,qBAAqB,CAAC,CAAC,EACrC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,CAAC,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;CAAE,CAMlD"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
type CleanupHandler = (heldValue: any) => void;
|
|
2
|
+
const register = jest.fn();
|
|
3
|
+
const unregister = jest.fn();
|
|
4
|
+
export class FakeFinalizationRegistry {
|
|
5
|
+
static mock: FakeFinalizationRegistry;
|
|
6
|
+
register = register;
|
|
7
|
+
unregister = unregister;
|
|
8
|
+
cleanupHandler: jest.MockedFunction<CleanupHandler>;
|
|
9
|
+
constructor(handler: CleanupHandler) {
|
|
10
|
+
this.cleanupHandler = jest.fn(handler);
|
|
11
|
+
FakeFinalizationRegistry.mock = this;
|
|
12
|
+
}
|
|
13
|
+
}
|
package/src/constants.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
declare const UIX_SDK_VERSION: string;
|
|
2
|
+
declare const UIX_SDK_BUILDMODE: string;
|
|
3
|
+
|
|
4
|
+
/** @internal */
|
|
5
|
+
export const NS_ROOT = "_$pg";
|
|
6
|
+
export const VERSION = UIX_SDK_VERSION;
|
|
7
|
+
export const BUILDMODE = UIX_SDK_BUILDMODE;
|
|
8
|
+
export const SYM_CLEANUP = Symbol(`${NS_ROOT}_cleanup`);
|
|
9
|
+
export const SYM_INTERNAL = Symbol(`${NS_ROOT}_internal`);
|
|
10
|
+
export const INIT_CALLBACK = `${NS_ROOT}_init_cb`;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import type { WrappedMessage } from "./message-wrapper";
|
|
2
|
+
import { wrap } from "./message-wrapper";
|
|
3
|
+
import { ObjectSimulator } from "./object-simulator";
|
|
4
|
+
import type { Asynced } from "./object-walker";
|
|
5
|
+
import { timeoutPromise } from "./promises/timed";
|
|
6
|
+
import { receiveCalls } from "./rpc";
|
|
7
|
+
import type { InitTicket } from "./tickets";
|
|
8
|
+
import { INIT_TICKET } from "./tickets";
|
|
9
|
+
import type { TunnelConfig } from "./tunnel";
|
|
10
|
+
import { Tunnel } from "./tunnel";
|
|
11
|
+
|
|
12
|
+
const INIT_MESSAGE: WrappedMessage<InitTicket> = wrap(INIT_TICKET);
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Representation of an object on the other side of an iframe/window divide
|
|
16
|
+
* between JS runtimes.
|
|
17
|
+
*
|
|
18
|
+
* @remarks
|
|
19
|
+
* At first, xrobject simply returned the proxy to the remote object and did
|
|
20
|
+
* not expose any of the underlying event handling. However, there was no way
|
|
21
|
+
* for a consumer to handle the case where the remote iframe reloaded, which
|
|
22
|
+
* would invalidate all of the simulated objects.
|
|
23
|
+
*
|
|
24
|
+
* This new manager object exposes the {@link Tunnel} object so that consumers
|
|
25
|
+
* can subscribe to the "api" event.
|
|
26
|
+
* @alpha
|
|
27
|
+
*/
|
|
28
|
+
export interface CrossRealmObject<ExpectedApi> {
|
|
29
|
+
/**
|
|
30
|
+
* The event emitter that transmits RPC events between remotes. Can be used to
|
|
31
|
+
* listen to "api" events, which re-emit the initial remote API after an
|
|
32
|
+
* unexpected reload. Can also be used to manually destroy the xrobject.
|
|
33
|
+
* @internal
|
|
34
|
+
*/
|
|
35
|
+
tunnel: Tunnel;
|
|
36
|
+
/**
|
|
37
|
+
* Accessor for the simulated object. Putting the object behind an accessor is
|
|
38
|
+
* a way (we hope) to subtly discourage hanging on to a reference to the
|
|
39
|
+
* object, which will invalidate without the holder of the reference knowing.
|
|
40
|
+
* @internal
|
|
41
|
+
*/
|
|
42
|
+
getRemoteApi(): Asynced<ExpectedApi>;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
async function setupApiExchange<T>(
|
|
46
|
+
tunnel: Tunnel,
|
|
47
|
+
apiToSend: unknown
|
|
48
|
+
): Promise<CrossRealmObject<T>> {
|
|
49
|
+
let done = false;
|
|
50
|
+
let remoteApi!: Asynced<T>;
|
|
51
|
+
const xrObject: CrossRealmObject<T> = {
|
|
52
|
+
tunnel,
|
|
53
|
+
getRemoteApi(): Asynced<T> {
|
|
54
|
+
return remoteApi;
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
return timeoutPromise(
|
|
58
|
+
"Initial API exchange",
|
|
59
|
+
new Promise((resolve, reject) => {
|
|
60
|
+
const simulator = ObjectSimulator.create(tunnel, FinalizationRegistry);
|
|
61
|
+
|
|
62
|
+
const sendApi = simulator.makeSender(INIT_MESSAGE);
|
|
63
|
+
const apiCallback = (api: Asynced<T>) => {
|
|
64
|
+
remoteApi = api;
|
|
65
|
+
if (!done) {
|
|
66
|
+
done = true;
|
|
67
|
+
resolve(xrObject);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
tunnel.on("api", apiCallback);
|
|
71
|
+
|
|
72
|
+
const unsubscribe = receiveCalls(
|
|
73
|
+
(api: Asynced<T>) => tunnel.emitLocal("api", api),
|
|
74
|
+
INIT_TICKET,
|
|
75
|
+
new WeakRef(simulator.subject)
|
|
76
|
+
);
|
|
77
|
+
const destroy = (e: Error) => {
|
|
78
|
+
unsubscribe();
|
|
79
|
+
if (!done) {
|
|
80
|
+
done = true;
|
|
81
|
+
reject(e);
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
tunnel.on("destroyed", destroy);
|
|
85
|
+
tunnel.on("connected", () =>
|
|
86
|
+
(sendApi as Function)(apiToSend).catch(destroy)
|
|
87
|
+
);
|
|
88
|
+
}),
|
|
89
|
+
tunnel.config.timeout,
|
|
90
|
+
() => tunnel.destroy()
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Create a CrossRealmObject in an iframe, simulating objects from the parent window.
|
|
96
|
+
* @alpha
|
|
97
|
+
*/
|
|
98
|
+
export async function connectParentWindow<Expected>(
|
|
99
|
+
tunnelOptions: Partial<TunnelConfig>,
|
|
100
|
+
apiToSend: unknown
|
|
101
|
+
): Promise<CrossRealmObject<Expected>> {
|
|
102
|
+
const tunnel = Tunnel.toParent(window.parent, tunnelOptions);
|
|
103
|
+
return setupApiExchange<Expected>(tunnel, apiToSend);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Create a CrossRealmObject simulating objects from the provided iframe runtime.
|
|
108
|
+
* @alpha
|
|
109
|
+
*/
|
|
110
|
+
export async function connectIframe<Expected>(
|
|
111
|
+
frame: HTMLIFrameElement,
|
|
112
|
+
tunnelOptions: Partial<TunnelConfig>,
|
|
113
|
+
apiToSend: unknown
|
|
114
|
+
): Promise<CrossRealmObject<Expected>> {
|
|
115
|
+
const tunnel = Tunnel.toIframe(frame, tunnelOptions);
|
|
116
|
+
return setupApiExchange<Expected>(tunnel, apiToSend);
|
|
117
|
+
}
|
package/src/debuglog.ts
CHANGED
package/src/index.ts
CHANGED
|
@@ -19,5 +19,8 @@ export * from "./debug-emitter";
|
|
|
19
19
|
export * from "./debuglog";
|
|
20
20
|
export * from "./emitter";
|
|
21
21
|
export * from "./namespace-proxy";
|
|
22
|
-
export * from "./timeout-promise";
|
|
23
22
|
export * from "./types";
|
|
23
|
+
export * from "./cross-realm-object";
|
|
24
|
+
export * from "./promises";
|
|
25
|
+
export * from "./tunnel";
|
|
26
|
+
export type { Asynced } from "./object-walker";
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { NS_ROOT } from "./constants";
|
|
2
|
+
import { isPlainObject } from "./value-assertions";
|
|
3
|
+
|
|
4
|
+
/** @internal */
|
|
5
|
+
export type WrappedMessage<Message extends object> = { [NS_ROOT]: Message };
|
|
6
|
+
|
|
7
|
+
export function wrap<Message extends object = object>(
|
|
8
|
+
message: Message
|
|
9
|
+
): WrappedMessage<Message> {
|
|
10
|
+
return { [NS_ROOT]: message };
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function unwrap<Message extends object>(
|
|
14
|
+
wrappedMessage: WrappedMessage<Message>
|
|
15
|
+
): Message {
|
|
16
|
+
return wrappedMessage[NS_ROOT];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function isWrapped<Message extends object = object>(
|
|
20
|
+
item: unknown
|
|
21
|
+
): item is WrappedMessage<Message> {
|
|
22
|
+
if (!isPlainObject(item)) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
const keys = Object.keys(item);
|
|
26
|
+
const hasRoot = keys.includes(NS_ROOT);
|
|
27
|
+
if (hasRoot && keys.length != 1) {
|
|
28
|
+
console.error(
|
|
29
|
+
`malformed tunnel message, should have one prop "${NS_ROOT}" at root`,
|
|
30
|
+
item
|
|
31
|
+
);
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
return hasRoot;
|
|
35
|
+
}
|