@farcaster/frame-host 0.0.7 → 0.0.9

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.
@@ -0,0 +1,155 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2019 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { Endpoint, EventSource, PostMessageWithOrigin } from "./protocol";
7
+ export type { Endpoint };
8
+ export declare const proxyMarker: unique symbol;
9
+ export declare const createEndpoint: unique symbol;
10
+ export declare const releaseProxy: unique symbol;
11
+ export declare const finalizer: unique symbol;
12
+ /**
13
+ * Interface of values that were marked to be proxied with `comlink.proxy()`.
14
+ * Can also be implemented by classes.
15
+ */
16
+ export interface ProxyMarked {
17
+ [proxyMarker]: true;
18
+ }
19
+ /**
20
+ * Takes a type and wraps it in a Promise, if it not already is one.
21
+ * This is to avoid `Promise<Promise<T>>`.
22
+ *
23
+ * This is the inverse of `Unpromisify<T>`.
24
+ */
25
+ type Promisify<T> = T extends Promise<unknown> ? T : Promise<T>;
26
+ /**
27
+ * Takes a type that may be Promise and unwraps the Promise type.
28
+ * If `P` is not a Promise, it returns `P`.
29
+ *
30
+ * This is the inverse of `Promisify<T>`.
31
+ */
32
+ type Unpromisify<P> = P extends Promise<infer T> ? T : P;
33
+ /**
34
+ * Takes the raw type of a remote property and returns the type that is visible to the local thread on the proxy.
35
+ *
36
+ * Note: This needs to be its own type alias, otherwise it will not distribute over unions.
37
+ * See https://www.typescriptlang.org/docs/handbook/advanced-types.html#distributive-conditional-types
38
+ */
39
+ type RemoteProperty<T> = T extends Function | ProxyMarked ? Remote<T> : Promisify<T>;
40
+ /**
41
+ * Takes the raw type of a property as a remote thread would see it through a proxy (e.g. when passed in as a function
42
+ * argument) and returns the type that the local thread has to supply.
43
+ *
44
+ * This is the inverse of `RemoteProperty<T>`.
45
+ *
46
+ * Note: This needs to be its own type alias, otherwise it will not distribute over unions. See
47
+ * https://www.typescriptlang.org/docs/handbook/advanced-types.html#distributive-conditional-types
48
+ */
49
+ type LocalProperty<T> = T extends Function | ProxyMarked ? Local<T> : Unpromisify<T>;
50
+ /**
51
+ * Proxies `T` if it is a `ProxyMarked`, clones it otherwise (as handled by structured cloning and transfer handlers).
52
+ */
53
+ export type ProxyOrClone<T> = T extends ProxyMarked ? Remote<T> : T;
54
+ /**
55
+ * Inverse of `ProxyOrClone<T>`.
56
+ */
57
+ export type UnproxyOrClone<T> = T extends RemoteObject<ProxyMarked> ? Local<T> : T;
58
+ /**
59
+ * Takes the raw type of a remote object in the other thread and returns the type as it is visible to the local thread
60
+ * when proxied with `Comlink.proxy()`.
61
+ *
62
+ * This does not handle call signatures, which is handled by the more general `Remote<T>` type.
63
+ *
64
+ * @template T The raw type of a remote object as seen in the other thread.
65
+ */
66
+ export type RemoteObject<T> = {
67
+ [P in keyof T]: RemoteProperty<T[P]>;
68
+ };
69
+ /**
70
+ * Takes the type of an object as a remote thread would see it through a proxy (e.g. when passed in as a function
71
+ * argument) and returns the type that the local thread has to supply.
72
+ *
73
+ * This does not handle call signatures, which is handled by the more general `Local<T>` type.
74
+ *
75
+ * This is the inverse of `RemoteObject<T>`.
76
+ *
77
+ * @template T The type of a proxied object.
78
+ */
79
+ export type LocalObject<T> = {
80
+ [P in keyof T]: LocalProperty<T[P]>;
81
+ };
82
+ /**
83
+ * Additional special comlink methods available on each proxy returned by `Comlink.wrap()`.
84
+ */
85
+ export interface ProxyMethods {
86
+ [createEndpoint]: () => Promise<MessagePort>;
87
+ [releaseProxy]: () => void;
88
+ }
89
+ /**
90
+ * Takes the raw type of a remote object, function or class in the other thread and returns the type as it is visible to
91
+ * the local thread from the proxy return value of `Comlink.wrap()` or `Comlink.proxy()`.
92
+ */
93
+ export type Remote<T> = RemoteObject<T> & (T extends (...args: infer TArguments) => infer TReturn ? (...args: {
94
+ [I in keyof TArguments]: UnproxyOrClone<TArguments[I]>;
95
+ }) => Promisify<ProxyOrClone<Unpromisify<TReturn>>> : unknown) & (T extends {
96
+ new (...args: infer TArguments): infer TInstance;
97
+ } ? {
98
+ new (...args: {
99
+ [I in keyof TArguments]: UnproxyOrClone<TArguments[I]>;
100
+ }): Promisify<Remote<TInstance>>;
101
+ } : unknown) & ProxyMethods;
102
+ /**
103
+ * Expresses that a type can be either a sync or async.
104
+ */
105
+ type MaybePromise<T> = Promise<T> | T;
106
+ /**
107
+ * Takes the raw type of a remote object, function or class as a remote thread would see it through a proxy (e.g. when
108
+ * passed in as a function argument) and returns the type the local thread has to supply.
109
+ *
110
+ * This is the inverse of `Remote<T>`. It takes a `Remote<T>` and returns its original input `T`.
111
+ */
112
+ export type Local<T> = Omit<LocalObject<T>, keyof ProxyMethods> & (T extends (...args: infer TArguments) => infer TReturn ? (...args: {
113
+ [I in keyof TArguments]: ProxyOrClone<TArguments[I]>;
114
+ }) => MaybePromise<UnproxyOrClone<Unpromisify<TReturn>>> : unknown) & (T extends {
115
+ new (...args: infer TArguments): infer TInstance;
116
+ } ? {
117
+ new (...args: {
118
+ [I in keyof TArguments]: ProxyOrClone<TArguments[I]>;
119
+ }): MaybePromise<Local<Unpromisify<TInstance>>>;
120
+ } : unknown);
121
+ /**
122
+ * Customizes the serialization of certain values as determined by `canHandle()`.
123
+ *
124
+ * @template T The input type being handled by this transfer handler.
125
+ * @template S The serialized type sent over the wire.
126
+ */
127
+ export interface TransferHandler<T, S> {
128
+ /**
129
+ * Gets called for every value to determine whether this transfer handler
130
+ * should serialize the value, which includes checking that it is of the right
131
+ * type (but can perform checks beyond that as well).
132
+ */
133
+ canHandle(value: unknown): value is T;
134
+ /**
135
+ * Gets called with the value if `canHandle()` returned `true` to produce a
136
+ * value that can be sent in a message, consisting of structured-cloneable
137
+ * values and/or transferrable objects.
138
+ */
139
+ serialize(value: T): [S, Transferable[]];
140
+ /**
141
+ * Gets called to deserialize an incoming value that was serialized in the
142
+ * other thread with this transfer handler (known through the name it was
143
+ * registered under).
144
+ */
145
+ deserialize(value: S): T;
146
+ }
147
+ /**
148
+ * Allows customizing the serialization of certain values.
149
+ */
150
+ export declare const transferHandlers: Map<string, TransferHandler<unknown, unknown>>;
151
+ export declare function expose(obj: any, ep?: Endpoint, allowedOrigins?: (string | RegExp)[]): () => void;
152
+ export declare function wrap<T>(ep: Endpoint, target?: any): Remote<T>;
153
+ export declare function transfer<T>(obj: T, transfers: Transferable[]): T;
154
+ export declare function proxy<T extends {}>(obj: T): T & ProxyMarked;
155
+ export declare function windowEndpoint(w: PostMessageWithOrigin, context?: EventSource, targetOrigin?: string): Endpoint;
@@ -0,0 +1,367 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2019 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export const proxyMarker = Symbol("Comlink.proxy");
7
+ export const createEndpoint = Symbol("Comlink.endpoint");
8
+ export const releaseProxy = Symbol("Comlink.releaseProxy");
9
+ export const finalizer = Symbol("Comlink.finalizer");
10
+ const throwMarker = Symbol("Comlink.thrown");
11
+ const isObject = (val) => (typeof val === "object" && val !== null) || typeof val === "function";
12
+ /**
13
+ * Internal transfer handle to handle objects marked to proxy.
14
+ */
15
+ const proxyTransferHandler = {
16
+ canHandle: (val) => isObject(val) && val[proxyMarker],
17
+ serialize(obj) {
18
+ const { port1, port2 } = new MessageChannel();
19
+ expose(obj, port1);
20
+ return [port2, [port2]];
21
+ },
22
+ deserialize(port) {
23
+ port.start();
24
+ return wrap(port);
25
+ },
26
+ };
27
+ /**
28
+ * Internal transfer handler to handle thrown exceptions.
29
+ */
30
+ const throwTransferHandler = {
31
+ canHandle: (value) => isObject(value) && throwMarker in value,
32
+ serialize({ value }) {
33
+ let serialized;
34
+ if (value instanceof Error) {
35
+ serialized = {
36
+ isError: true,
37
+ value: {
38
+ message: value.message,
39
+ name: value.name,
40
+ stack: value.stack,
41
+ },
42
+ };
43
+ }
44
+ else {
45
+ serialized = { isError: false, value };
46
+ }
47
+ return [serialized, []];
48
+ },
49
+ deserialize(serialized) {
50
+ if (serialized.isError) {
51
+ throw Object.assign(new Error(serialized.value.message), serialized.value);
52
+ }
53
+ throw serialized.value;
54
+ },
55
+ };
56
+ /**
57
+ * Allows customizing the serialization of certain values.
58
+ */
59
+ export const transferHandlers = new Map([
60
+ ["proxy", proxyTransferHandler],
61
+ ["throw", throwTransferHandler],
62
+ ]);
63
+ function isAllowedOrigin(allowedOrigins, origin) {
64
+ for (const allowedOrigin of allowedOrigins) {
65
+ if (origin === allowedOrigin || allowedOrigin === "*") {
66
+ return true;
67
+ }
68
+ if (allowedOrigin instanceof RegExp && allowedOrigin.test(origin)) {
69
+ return true;
70
+ }
71
+ }
72
+ return false;
73
+ }
74
+ export function expose(obj, ep = globalThis, allowedOrigins = ["*"]) {
75
+ function callback(ev) {
76
+ if (!ev || !ev.data) {
77
+ return;
78
+ }
79
+ if (!isAllowedOrigin(allowedOrigins, ev.origin)) {
80
+ console.warn(`Invalid origin '${ev.origin}' for comlink proxy`);
81
+ return;
82
+ }
83
+ const { id, type, path } = {
84
+ path: [],
85
+ ...ev.data,
86
+ };
87
+ const argumentList = (ev.data.argumentList || []).map(fromWireValue);
88
+ let returnValue;
89
+ try {
90
+ const parent = path.slice(0, -1).reduce((obj, prop) => obj[prop], obj);
91
+ const rawValue = path.reduce((obj, prop) => obj[prop], obj);
92
+ switch (type) {
93
+ case "GET" /* MessageType.GET */:
94
+ {
95
+ returnValue = rawValue;
96
+ }
97
+ break;
98
+ case "SET" /* MessageType.SET */:
99
+ {
100
+ parent[path.slice(-1)[0]] = fromWireValue(ev.data.value);
101
+ returnValue = true;
102
+ }
103
+ break;
104
+ case "APPLY" /* MessageType.APPLY */:
105
+ {
106
+ returnValue = rawValue.apply(parent, argumentList);
107
+ }
108
+ break;
109
+ case "CONSTRUCT" /* MessageType.CONSTRUCT */:
110
+ {
111
+ const value = new rawValue(...argumentList);
112
+ returnValue = proxy(value);
113
+ }
114
+ break;
115
+ case "ENDPOINT" /* MessageType.ENDPOINT */:
116
+ {
117
+ const { port1, port2 } = new MessageChannel();
118
+ expose(obj, port2);
119
+ returnValue = transfer(port1, [port1]);
120
+ }
121
+ break;
122
+ case "RELEASE" /* MessageType.RELEASE */:
123
+ {
124
+ returnValue = undefined;
125
+ }
126
+ break;
127
+ default:
128
+ return;
129
+ }
130
+ }
131
+ catch (value) {
132
+ returnValue = { value, [throwMarker]: 0 };
133
+ }
134
+ Promise.resolve(returnValue)
135
+ .catch((value) => {
136
+ return { value, [throwMarker]: 0 };
137
+ })
138
+ .then((returnValue) => {
139
+ const [wireValue, transferables] = toWireValue(returnValue);
140
+ ep.postMessage({ ...wireValue, id }, transferables);
141
+ if (type === "RELEASE" /* MessageType.RELEASE */) {
142
+ // detach and deactive after sending release response above.
143
+ ep.removeEventListener("message", callback);
144
+ closeEndPoint(ep);
145
+ if (finalizer in obj && typeof obj[finalizer] === "function") {
146
+ obj[finalizer]();
147
+ }
148
+ }
149
+ })
150
+ .catch((error) => {
151
+ // Send Serialization Error To Caller
152
+ const [wireValue, transferables] = toWireValue({
153
+ value: new TypeError("Unserializable return value"),
154
+ [throwMarker]: 0,
155
+ });
156
+ ep.postMessage({ ...wireValue, id }, transferables);
157
+ });
158
+ }
159
+ ;
160
+ ep.addEventListener("message", callback);
161
+ if (ep.start) {
162
+ ep.start();
163
+ }
164
+ return () => {
165
+ ep.removeEventListener("message", callback);
166
+ closeEndPoint(ep);
167
+ if (finalizer in obj && typeof obj[finalizer] === "function") {
168
+ obj[finalizer]();
169
+ }
170
+ };
171
+ }
172
+ function isMessagePort(endpoint) {
173
+ return endpoint.constructor.name === "MessagePort";
174
+ }
175
+ function closeEndPoint(endpoint) {
176
+ if (isMessagePort(endpoint))
177
+ endpoint.close();
178
+ }
179
+ export function wrap(ep, target) {
180
+ const pendingListeners = new Map();
181
+ ep.addEventListener("message", function handleMessage(ev) {
182
+ const { data } = ev;
183
+ if (!data || !data.id) {
184
+ return;
185
+ }
186
+ const resolver = pendingListeners.get(data.id);
187
+ if (!resolver) {
188
+ return;
189
+ }
190
+ try {
191
+ resolver(data);
192
+ }
193
+ finally {
194
+ pendingListeners.delete(data.id);
195
+ }
196
+ });
197
+ return createProxy(ep, pendingListeners, [], target);
198
+ }
199
+ function throwIfProxyReleased(isReleased) {
200
+ if (isReleased) {
201
+ throw new Error("Proxy has been released and is not useable");
202
+ }
203
+ }
204
+ function releaseEndpoint(ep) {
205
+ return requestResponseMessage(ep, new Map(), {
206
+ type: "RELEASE" /* MessageType.RELEASE */,
207
+ }).then(() => {
208
+ closeEndPoint(ep);
209
+ });
210
+ }
211
+ const proxyCounter = new WeakMap();
212
+ const proxyFinalizers = "FinalizationRegistry" in globalThis &&
213
+ new FinalizationRegistry((ep) => {
214
+ const newCount = (proxyCounter.get(ep) || 0) - 1;
215
+ proxyCounter.set(ep, newCount);
216
+ if (newCount === 0) {
217
+ releaseEndpoint(ep);
218
+ }
219
+ });
220
+ function registerProxy(proxy, ep) {
221
+ const newCount = (proxyCounter.get(ep) || 0) + 1;
222
+ proxyCounter.set(ep, newCount);
223
+ if (proxyFinalizers) {
224
+ proxyFinalizers.register(proxy, ep, proxy);
225
+ }
226
+ }
227
+ function unregisterProxy(proxy) {
228
+ if (proxyFinalizers) {
229
+ proxyFinalizers.unregister(proxy);
230
+ }
231
+ }
232
+ function createProxy(ep, pendingListeners, path = [], target = function () { }) {
233
+ let isProxyReleased = false;
234
+ const proxy = new Proxy(target, {
235
+ get(_target, prop) {
236
+ throwIfProxyReleased(isProxyReleased);
237
+ if (prop === releaseProxy) {
238
+ return () => {
239
+ unregisterProxy(proxy);
240
+ releaseEndpoint(ep);
241
+ pendingListeners.clear();
242
+ isProxyReleased = true;
243
+ };
244
+ }
245
+ if (prop === "then") {
246
+ if (path.length === 0) {
247
+ return { then: () => proxy };
248
+ }
249
+ const r = requestResponseMessage(ep, pendingListeners, {
250
+ type: "GET" /* MessageType.GET */,
251
+ path: path.map((p) => p.toString()),
252
+ }).then(fromWireValue);
253
+ return r.then.bind(r);
254
+ }
255
+ return createProxy(ep, pendingListeners, [...path, prop]);
256
+ },
257
+ set(_target, prop, rawValue) {
258
+ throwIfProxyReleased(isProxyReleased);
259
+ // FIXME: ES6 Proxy Handler `set` methods are supposed to return a
260
+ // boolean. To show good will, we return true asynchronously ¯\_(ツ)_/¯
261
+ const [value, transferables] = toWireValue(rawValue);
262
+ return requestResponseMessage(ep, pendingListeners, {
263
+ type: "SET" /* MessageType.SET */,
264
+ path: [...path, prop].map((p) => p.toString()),
265
+ value,
266
+ }, transferables).then(fromWireValue);
267
+ },
268
+ apply(_target, _thisArg, rawArgumentList) {
269
+ throwIfProxyReleased(isProxyReleased);
270
+ const last = path[path.length - 1];
271
+ if (last === createEndpoint) {
272
+ return requestResponseMessage(ep, pendingListeners, {
273
+ type: "ENDPOINT" /* MessageType.ENDPOINT */,
274
+ }).then(fromWireValue);
275
+ }
276
+ // We just pretend that `bind()` didn’t happen.
277
+ if (last === "bind") {
278
+ return createProxy(ep, pendingListeners, path.slice(0, -1));
279
+ }
280
+ const [argumentList, transferables] = processArguments(rawArgumentList);
281
+ return requestResponseMessage(ep, pendingListeners, {
282
+ type: "APPLY" /* MessageType.APPLY */,
283
+ path: path.map((p) => p.toString()),
284
+ argumentList,
285
+ }, transferables).then(fromWireValue);
286
+ },
287
+ construct(_target, rawArgumentList) {
288
+ throwIfProxyReleased(isProxyReleased);
289
+ const [argumentList, transferables] = processArguments(rawArgumentList);
290
+ return requestResponseMessage(ep, pendingListeners, {
291
+ type: "CONSTRUCT" /* MessageType.CONSTRUCT */,
292
+ path: path.map((p) => p.toString()),
293
+ argumentList,
294
+ }, transferables).then(fromWireValue);
295
+ },
296
+ });
297
+ registerProxy(proxy, ep);
298
+ return proxy;
299
+ }
300
+ function myFlat(arr) {
301
+ return Array.prototype.concat.apply([], arr);
302
+ }
303
+ function processArguments(argumentList) {
304
+ const processed = argumentList.map(toWireValue);
305
+ return [processed.map((v) => v[0]), myFlat(processed.map((v) => v[1]))];
306
+ }
307
+ const transferCache = new WeakMap();
308
+ export function transfer(obj, transfers) {
309
+ transferCache.set(obj, transfers);
310
+ return obj;
311
+ }
312
+ export function proxy(obj) {
313
+ return Object.assign(obj, { [proxyMarker]: true });
314
+ }
315
+ export function windowEndpoint(w, context = globalThis, targetOrigin = "*") {
316
+ return {
317
+ postMessage: (msg, transferables) => w.postMessage(msg, targetOrigin, transferables),
318
+ addEventListener: context.addEventListener.bind(context),
319
+ removeEventListener: context.removeEventListener.bind(context),
320
+ };
321
+ }
322
+ function toWireValue(value) {
323
+ for (const [name, handler] of transferHandlers) {
324
+ if (handler.canHandle(value)) {
325
+ const [serializedValue, transferables] = handler.serialize(value);
326
+ return [
327
+ {
328
+ type: "HANDLER" /* WireValueType.HANDLER */,
329
+ name,
330
+ value: serializedValue,
331
+ },
332
+ transferables,
333
+ ];
334
+ }
335
+ }
336
+ return [
337
+ {
338
+ type: "RAW" /* WireValueType.RAW */,
339
+ value,
340
+ },
341
+ transferCache.get(value) || [],
342
+ ];
343
+ }
344
+ function fromWireValue(value) {
345
+ switch (value.type) {
346
+ case "HANDLER" /* WireValueType.HANDLER */:
347
+ return transferHandlers.get(value.name).deserialize(value.value);
348
+ case "RAW" /* WireValueType.RAW */:
349
+ return value.value;
350
+ }
351
+ }
352
+ function requestResponseMessage(ep, pendingListeners, msg, transfers) {
353
+ return new Promise((resolve) => {
354
+ const id = generateUUID();
355
+ pendingListeners.set(id, resolve);
356
+ if (ep.start) {
357
+ ep.start();
358
+ }
359
+ ep.postMessage({ id, ...msg }, transfers);
360
+ });
361
+ }
362
+ function generateUUID() {
363
+ return new Array(4)
364
+ .fill(0)
365
+ .map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16))
366
+ .join("-");
367
+ }
@@ -0,0 +1 @@
1
+ export * from "./comlink";
@@ -0,0 +1 @@
1
+ export * from "./comlink";
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2019 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { Endpoint } from "./protocol";
7
+ export interface NodeEndpoint {
8
+ postMessage(message: any, transfer?: any[]): void;
9
+ on(type: string, listener: EventListenerOrEventListenerObject, options?: {}): void;
10
+ off(type: string, listener: EventListenerOrEventListenerObject, options?: {}): void;
11
+ start?: () => void;
12
+ }
13
+ export default function nodeEndpoint(nep: NodeEndpoint): Endpoint;
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2019 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export default function nodeEndpoint(nep) {
7
+ const listeners = new WeakMap();
8
+ return {
9
+ postMessage: nep.postMessage.bind(nep),
10
+ addEventListener: (_, eh) => {
11
+ const l = (data) => {
12
+ if ("handleEvent" in eh) {
13
+ eh.handleEvent({ data });
14
+ }
15
+ else {
16
+ eh({ data });
17
+ }
18
+ };
19
+ nep.on("message", l);
20
+ listeners.set(eh, l);
21
+ },
22
+ removeEventListener: (_, eh) => {
23
+ const l = listeners.get(eh);
24
+ if (!l) {
25
+ return;
26
+ }
27
+ nep.off("message", l);
28
+ listeners.delete(eh);
29
+ },
30
+ start: nep.start && nep.start.bind(nep),
31
+ };
32
+ }
@@ -0,0 +1,75 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2019 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export interface EventSource {
7
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: {}): void;
8
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: {}): void;
9
+ }
10
+ export interface PostMessageWithOrigin {
11
+ postMessage(message: any, targetOrigin: string, transfer?: Transferable[]): void;
12
+ }
13
+ export interface Endpoint extends EventSource {
14
+ postMessage(message: any, transfer?: Transferable[]): void;
15
+ start?: () => void;
16
+ }
17
+ export declare const enum WireValueType {
18
+ RAW = "RAW",
19
+ PROXY = "PROXY",
20
+ THROW = "THROW",
21
+ HANDLER = "HANDLER"
22
+ }
23
+ export interface RawWireValue {
24
+ id?: string;
25
+ type: WireValueType.RAW;
26
+ value: {};
27
+ }
28
+ export interface HandlerWireValue {
29
+ id?: string;
30
+ type: WireValueType.HANDLER;
31
+ name: string;
32
+ value: unknown;
33
+ }
34
+ export type WireValue = RawWireValue | HandlerWireValue;
35
+ export type MessageID = string;
36
+ export declare const enum MessageType {
37
+ GET = "GET",
38
+ SET = "SET",
39
+ APPLY = "APPLY",
40
+ CONSTRUCT = "CONSTRUCT",
41
+ ENDPOINT = "ENDPOINT",
42
+ RELEASE = "RELEASE"
43
+ }
44
+ export interface GetMessage {
45
+ id?: MessageID;
46
+ type: MessageType.GET;
47
+ path: string[];
48
+ }
49
+ export interface SetMessage {
50
+ id?: MessageID;
51
+ type: MessageType.SET;
52
+ path: string[];
53
+ value: WireValue;
54
+ }
55
+ export interface ApplyMessage {
56
+ id?: MessageID;
57
+ type: MessageType.APPLY;
58
+ path: string[];
59
+ argumentList: WireValue[];
60
+ }
61
+ export interface ConstructMessage {
62
+ id?: MessageID;
63
+ type: MessageType.CONSTRUCT;
64
+ path: string[];
65
+ argumentList: WireValue[];
66
+ }
67
+ export interface EndpointMessage {
68
+ id?: MessageID;
69
+ type: MessageType.ENDPOINT;
70
+ }
71
+ export interface ReleaseMessage {
72
+ id?: MessageID;
73
+ type: MessageType.RELEASE;
74
+ }
75
+ export type Message = GetMessage | SetMessage | ApplyMessage | ConstructMessage | EndpointMessage | ReleaseMessage;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2019 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -4,4 +4,9 @@ import { HostEndpoint } from "../types";
4
4
  /**
5
5
  * @returns function to cleanup provider listeners
6
6
  */
7
- export declare function exposeToEndpoint(endpoint: HostEndpoint, sdk: Omit<FrameHost, 'ethProviderRequestV2'>, provider?: Provider.Provider): () => void;
7
+ export declare function exposeToEndpoint({ endpoint, sdk, frameOrigin, ethProvider, }: {
8
+ endpoint: HostEndpoint;
9
+ sdk: Omit<FrameHost, 'ethProviderRequestV2'>;
10
+ frameOrigin: string;
11
+ ethProvider?: Provider.Provider;
12
+ }): () => void;
@@ -1,17 +1,18 @@
1
- import * as Comlink from "comlink";
1
+ import * as Comlink from "../comlink";
2
2
  import { forwardProviderEvents, wrapProviderRequest } from "./provider";
3
3
  /**
4
4
  * @returns function to cleanup provider listeners
5
5
  */
6
- export function exposeToEndpoint(endpoint, sdk, provider) {
6
+ export function exposeToEndpoint({ endpoint, sdk, frameOrigin, ethProvider, }) {
7
7
  const extendedSdk = sdk;
8
8
  let cleanup;
9
- if (provider) {
10
- extendedSdk.ethProviderRequestV2 = wrapProviderRequest(provider);
11
- cleanup = forwardProviderEvents(provider, endpoint);
9
+ if (ethProvider) {
10
+ extendedSdk.ethProviderRequestV2 = wrapProviderRequest(ethProvider);
11
+ cleanup = forwardProviderEvents(ethProvider, endpoint);
12
12
  }
13
- Comlink.expose(extendedSdk, endpoint);
13
+ const unexpose = Comlink.expose(extendedSdk, endpoint, [frameOrigin]);
14
14
  return () => {
15
15
  cleanup === null || cleanup === void 0 ? void 0 : cleanup();
16
+ unexpose();
16
17
  };
17
18
  }