@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.
Files changed (94) hide show
  1. package/dist/__helpers__/jest.messagechannel.d.cts +2 -0
  2. package/dist/__helpers__/jest.messagechannel.d.cts.map +1 -0
  3. package/dist/__mocks__/mock-finalization-registry.d.ts +11 -0
  4. package/dist/__mocks__/mock-finalization-registry.d.ts.map +1 -0
  5. package/dist/__mocks__/mock-weak-ref.d.ts +7 -0
  6. package/dist/__mocks__/mock-weak-ref.d.ts.map +1 -0
  7. package/dist/constants.d.ts +8 -0
  8. package/dist/constants.d.ts.map +1 -0
  9. package/dist/cross-realm-object.d.ts +44 -0
  10. package/dist/cross-realm-object.d.ts.map +1 -0
  11. package/dist/debuglog.d.ts +11 -0
  12. package/dist/debuglog.d.ts.map +1 -1
  13. package/dist/index.d.ts +4 -1
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +906 -7
  16. package/dist/index.js.map +1 -1
  17. package/dist/message-wrapper.d.ts +9 -0
  18. package/dist/message-wrapper.d.ts.map +1 -0
  19. package/dist/object-simulator.d.ts +28 -0
  20. package/dist/object-simulator.d.ts.map +1 -0
  21. package/dist/object-simulator.test.d.ts +2 -0
  22. package/dist/object-simulator.test.d.ts.map +1 -0
  23. package/dist/object-walker.d.ts +30 -0
  24. package/dist/object-walker.d.ts.map +1 -0
  25. package/dist/promises/index.d.ts +3 -0
  26. package/dist/promises/index.d.ts.map +1 -0
  27. package/dist/promises/promise-wrappers.test.d.ts +2 -0
  28. package/dist/promises/promise-wrappers.test.d.ts.map +1 -0
  29. package/dist/promises/timed.d.ts +15 -0
  30. package/dist/promises/timed.d.ts.map +1 -0
  31. package/dist/promises/wait.d.ts +7 -0
  32. package/dist/promises/wait.d.ts.map +1 -0
  33. package/dist/remote-subject.d.ts +70 -0
  34. package/dist/remote-subject.d.ts.map +1 -0
  35. package/dist/rpc/call-receiver.d.ts +4 -0
  36. package/dist/rpc/call-receiver.d.ts.map +1 -0
  37. package/dist/rpc/call-receiver.test.d.ts +2 -0
  38. package/dist/rpc/call-receiver.test.d.ts.map +1 -0
  39. package/dist/rpc/call-sender.d.ts +4 -0
  40. package/dist/rpc/call-sender.d.ts.map +1 -0
  41. package/dist/rpc/call-sender.test.d.ts +2 -0
  42. package/dist/rpc/call-sender.test.d.ts.map +1 -0
  43. package/dist/rpc/index.d.ts +3 -0
  44. package/dist/rpc/index.d.ts.map +1 -0
  45. package/dist/tickets.d.ts +34 -0
  46. package/dist/tickets.d.ts.map +1 -0
  47. package/dist/tunnel/index.d.ts +2 -0
  48. package/dist/tunnel/index.d.ts.map +1 -0
  49. package/dist/tunnel/tunnel-messenger.d.ts +25 -0
  50. package/dist/tunnel/tunnel-messenger.d.ts.map +1 -0
  51. package/dist/tunnel/tunnel-messenger.test.d.ts +2 -0
  52. package/dist/tunnel/tunnel-messenger.test.d.ts.map +1 -0
  53. package/dist/tunnel/tunnel.d.ts +62 -0
  54. package/dist/tunnel/tunnel.d.ts.map +1 -0
  55. package/dist/tunnel/tunnel.test.d.ts +2 -0
  56. package/dist/tunnel/tunnel.test.d.ts.map +1 -0
  57. package/dist/types.d.ts +1 -4
  58. package/dist/types.d.ts.map +1 -1
  59. package/dist/value-assertions.d.ts +13 -0
  60. package/dist/value-assertions.d.ts.map +1 -0
  61. package/package.json +1 -1
  62. package/src/__helpers__/jest.messagechannel.cjs +3 -0
  63. package/src/__mocks__/mock-finalization-registry.ts +13 -0
  64. package/src/__mocks__/mock-weak-ref.ts +10 -0
  65. package/src/constants.ts +10 -0
  66. package/src/cross-realm-object.ts +117 -0
  67. package/src/debuglog.ts +1 -1
  68. package/src/index.ts +4 -1
  69. package/src/message-wrapper.ts +35 -0
  70. package/src/object-simulator.test.ts +328 -0
  71. package/src/object-simulator.ts +145 -0
  72. package/src/object-walker.ts +132 -0
  73. package/src/promises/index.ts +2 -0
  74. package/src/promises/promise-wrappers.test.ts +63 -0
  75. package/src/promises/timed.ts +41 -0
  76. package/src/promises/wait.ts +10 -0
  77. package/src/remote-subject.ts +185 -0
  78. package/src/rpc/call-receiver.test.ts +90 -0
  79. package/src/rpc/call-receiver.ts +29 -0
  80. package/src/rpc/call-sender.test.ts +73 -0
  81. package/src/rpc/call-sender.ts +72 -0
  82. package/src/rpc/index.ts +2 -0
  83. package/src/tickets.ts +71 -0
  84. package/src/tunnel/index.ts +1 -0
  85. package/src/tunnel/tunnel-messenger.test.ts +183 -0
  86. package/src/tunnel/tunnel-messenger.ts +99 -0
  87. package/src/tunnel/tunnel.test.ts +211 -0
  88. package/src/tunnel/tunnel.ts +322 -0
  89. package/src/types.ts +3 -5
  90. package/src/value-assertions.ts +58 -0
  91. package/tsconfig.json +2 -6
  92. package/dist/timeout-promise.d.ts +0 -12
  93. package/dist/timeout-promise.d.ts.map +0 -1
  94. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tunnel-messenger.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tunnel.test.d.ts.map
@@ -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;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adobe/uix-core",
3
- "version": "0.6.5",
3
+ "version": "0.7.1-nightly.20230114",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -0,0 +1,3 @@
1
+ const { MessageChannel, MessagePort } = require("node:worker_threads");
2
+ window.MessageChannel = MessageChannel;
3
+ window.MessagePort = MessagePort;
@@ -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
+ }
@@ -0,0 +1,10 @@
1
+ export class FakeWeakRef<T> {
2
+ ref: T;
3
+ constructor(ref: T) {
4
+ this.ref = ref;
5
+ }
6
+ deref(): T {
7
+ return this.ref;
8
+ }
9
+ readonly [Symbol.toStringTag]: "WeakRef";
10
+ }
@@ -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
@@ -1,4 +1,4 @@
1
- /*
1
+ /**
2
2
  Copyright 2022 Adobe. All rights reserved.
3
3
  This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
4
  you may not use this file except in compliance with the License. You may obtain a copy
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
+ }