UNPKG

@mysten/window-wallet-core

Version:
131 lines (130 loc) 5.29 kB
var __typeError = (msg) => { throw TypeError(msg); }; var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg); var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj)); var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value); var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value); var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method); var _popup, _version, _id, _hostOrigin, _hostPathname, _appName, _extraRequestOptions, _promise, _resolve, _reject, _interval, _isSendCalled, _listener, _DappPostMessageChannel_instances, cleanup_fn; import { safeParse } from "valibot"; import { Response } from "./responses.js"; import { promiseWithResolvers } from "@mysten/utils"; import { getClientMetadata } from "./utils.js"; class DappPostMessageChannel { constructor({ appName, hostOrigin, hostPathname = "dapp-request", extraRequestOptions }) { __privateAdd(this, _DappPostMessageChannel_instances); __privateAdd(this, _popup); __privateAdd(this, _version, "1"); __privateAdd(this, _id); __privateAdd(this, _hostOrigin); __privateAdd(this, _hostPathname); __privateAdd(this, _appName); __privateAdd(this, _extraRequestOptions); __privateAdd(this, _promise); __privateAdd(this, _resolve); __privateAdd(this, _reject); __privateAdd(this, _interval, null); __privateAdd(this, _isSendCalled, false); __privateAdd(this, _listener, (event) => { if (event.origin !== __privateGet(this, _hostOrigin)) { return; } const { success, output } = safeParse(Response, event.data); if (!success || output.id !== __privateGet(this, _id)) { return; } __privateMethod(this, _DappPostMessageChannel_instances, cleanup_fn).call(this); if (output.payload.type === "reject") { __privateGet(this, _reject).call(this, new Error("User rejected the request")); } else if (output.payload.type === "resolve") { __privateGet(this, _resolve).call(this, output.payload.data); } }); const popup = window.open("about:blank", "_blank"); if (!popup) { throw new Error("Failed to open new window"); } __privateSet(this, _id, crypto.randomUUID()); __privateSet(this, _popup, popup); __privateSet(this, _hostOrigin, hostOrigin); __privateSet(this, _hostPathname, hostPathname); __privateSet(this, _appName, appName); const { promise, resolve, reject } = promiseWithResolvers(); __privateSet(this, _promise, promise); __privateSet(this, _resolve, resolve); __privateSet(this, _reject, reject); __privateSet(this, _extraRequestOptions, extraRequestOptions); __privateSet(this, _interval, setInterval(() => { try { if (__privateGet(this, _popup).closed) { __privateMethod(this, _DappPostMessageChannel_instances, cleanup_fn).call(this); reject(new Error("User closed the wallet window")); } } catch { } }, 1e3)); } send({ type, ...data }) { if (__privateGet(this, _popup).closed) { throw new Error("User closed the wallet window"); } if (__privateGet(this, _isSendCalled)) { throw new Error("send() can only be called once"); } __privateSet(this, _isSendCalled, true); window.addEventListener("message", __privateGet(this, _listener)); const requestData = { version: __privateGet(this, _version), requestId: __privateGet(this, _id), appUrl: window.location.href.split("#")[0], appName: __privateGet(this, _appName), payload: { type, ...data }, metadata: getClientMetadata(), extraRequestOptions: __privateGet(this, _extraRequestOptions) }; const encodedRequestData = encodeURIComponent(btoa(JSON.stringify(requestData))); __privateGet(this, _popup).location.assign(`${__privateGet(this, _hostOrigin)}/${__privateGet(this, _hostPathname)}#${encodedRequestData}`); return __privateGet(this, _promise); } close() { __privateMethod(this, _DappPostMessageChannel_instances, cleanup_fn).call(this); __privateGet(this, _popup).close(); } } _popup = new WeakMap(); _version = new WeakMap(); _id = new WeakMap(); _hostOrigin = new WeakMap(); _hostPathname = new WeakMap(); _appName = new WeakMap(); _extraRequestOptions = new WeakMap(); _promise = new WeakMap(); _resolve = new WeakMap(); _reject = new WeakMap(); _interval = new WeakMap(); _isSendCalled = new WeakMap(); _listener = new WeakMap(); _DappPostMessageChannel_instances = new WeakSet(); cleanup_fn = function() { if (__privateGet(this, _interval)) { clearInterval(__privateGet(this, _interval)); __privateSet(this, _interval, null); } window.removeEventListener("message", __privateGet(this, _listener)); }; export { DappPostMessageChannel }; //# sourceMappingURL=dapp-post-message-channel.js.map