From a5b462f696fe9eb084fbce7059fe8067b2d27209 Mon Sep 17 00:00:00 2001 From: CoolElectronics Date: Sat, 2 Mar 2024 15:28:10 -0500 Subject: [PATCH] remoteclient --- dist/RemoteClient.d.ts | 13 ++++ dist/bare.cjs | 169 +++++++++++++++++++++++++++++++++++++++-- dist/bare.cjs.map | 2 +- dist/index.d.ts | 1 + dist/index.js | 164 ++++++++++++++++++++++++++++++++++++++- dist/index.js.map | 2 +- src/RemoteClient.ts | 96 ++++++++++++++++++++++- src/Switcher.ts | 5 +- src/index.ts | 1 + 9 files changed, 436 insertions(+), 17 deletions(-) diff --git a/dist/RemoteClient.d.ts b/dist/RemoteClient.d.ts index e69de29..835f8e0 100644 --- a/dist/RemoteClient.d.ts +++ b/dist/RemoteClient.d.ts @@ -0,0 +1,13 @@ +/// +import { BareHeaders, BareTransport, TransferrableResponse } from './BareTypes'; +export declare function registerRemoteListener(channel: ServiceWorker): void; +export default class RemoteTransport implements BareTransport { + canstart: boolean; + ready: boolean; + promises: Map void>; + constructor(); + init(): Promise; + meta(): Promise; + request(remote: URL, method: string, body: BodyInit | null, headers: BareHeaders, signal: AbortSignal | undefined): Promise; + connect(url: URL, origin: string, protocols: string[], requestHeaders: BareHeaders, onopen: (protocol: string) => void, onmessage: (data: Blob | ArrayBuffer | string) => void, onclose: (code: number, reason: string) => void, onerror: (error: string) => void): (data: Blob | ArrayBuffer | string) => void; +} diff --git a/dist/bare.cjs b/dist/bare.cjs index 292e955..a6f970a 100644 --- a/dist/bare.cjs +++ b/dist/bare.cjs @@ -1,8 +1,8 @@ (function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : - typeof define === 'function' && define.amd ? define(['exports'], factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.BareMux = {})); -})(this, (function (exports) { 'use strict'; + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('uuid')) : + typeof define === 'function' && define.amd ? define(['exports', 'uuid'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.BareMux = {}, global.uuid)); +})(this, (function (exports, uuid) { 'use strict'; const maxRedirects = 20; @@ -22,7 +22,162 @@ OPEN: WebSocket.OPEN, }; - self.BCC_VERSION = "3.0.2"; + /// + function registerRemoteListener(channel) { + navigator.serviceWorker.addEventListener("message", async ({ data }) => { + if (data.type === "request") { + const { remote, method, body, headers } = data; + let response = await findSwitcher().active?.request(new URL(remote), method, body, headers, undefined); + let transferred = []; + if (response.body instanceof ArrayBuffer || response.body instanceof Blob || response.body instanceof ReadableStream) { + transferred.push(response.body); + } + response.id = data.id; + response.type = "response"; + channel.postMessage(response, transferred); + } + }); + } + let remote; + if ("ServiceWorkerGlobalScope" in self) { + addEventListener("message", async ({ data }) => { + if (data.type === "response") { + let resolve = remote.promises.get(data.id); + if (resolve) { + resolve(data); + remote.promises.delete(data.id); + } + } + }); + } + class RemoteTransport { + canstart = true; + ready = false; + promises = new Map(); + constructor() { + if (!("ServiceWorkerGlobalScope" in self)) { + throw new TypeError("Attempt to construct RemoteClient from outside a service worker"); + } + } + async init() { + remote = this; + this.ready = true; + } + async meta() { } + async request(remote, method, body, headers, signal) { + let id = uuid.v4(); + const clients = await self.clients.matchAll(); + if (clients.length < 1) + throw new Error("no available clients"); + for (const client of clients) { + client.postMessage({ + type: "request", + id, + remote: remote.toString(), + method, + body, + headers + }); + } + return await new Promise((resolve, reject) => { + this.promises.set(id, resolve); + }); + } + connect(url, origin, protocols, requestHeaders, onopen, onmessage, onclose, onerror) { + throw "why are you calling connect from remoteclient"; + } + } + // + // declare const self: ServiceWorkerGlobalScope; + // export default class RemoteClient extends Client { + // static singleton: RemoteClient; + // private callbacks: Record) => void> = {}; + // + // private uid = uuid(); + // constructor() { + // if (RemoteClient.singleton) return RemoteClient.singleton; + // super(); + // // this should be fine + // // if (!("ServiceWorkerGlobalScope" in self)) { + // // throw new TypeError("Attempt to construct RemoteClient from outside a service worker") + // // } + // + // addEventListener("message", (event) => { + // if (event.data.__remote_target === this.uid) { + // const callback = this.callbacks[event.data.__remote_id]; + // callback(event.data.__remote_value); + // } + // }); + // + // RemoteClient.singleton = this; + // } + // + // async send(message: Record, id?: string) { + // const clients = await self.clients.matchAll(); + // if (clients.length < 1) + // throw new Error("no available clients"); + // + // for (const client of clients) { + // client.postMessage({ + // __remote_target: this.uid, + // __remote_id: id, + // __remote_value: message + // }) + // } + // + // } + // + // async sendWithResponse(message: Record): Promise { + // const id = uuid(); + // return new Promise((resolve) => { + // this.callbacks[id] = resolve; + // this.send(message, id); + // }); + // } + // + // connect( + // ...args: any + // ) { + // throw "why are you calling connect from remoteclient" + // } + // async request( + // method: BareMethod, + // requestHeaders: BareHeaders, + // body: BodyInit | null, + // remote: URL, + // cache: BareCache | undefined, + // duplex: string | undefined, + // signal: AbortSignal | undefined + // ): Promise { + // + // const response = await this.sendWithResponse({ + // type: "request", + // options: { + // method, + // requestHeaders, + // body, + // remote: remote.toString(), + // }, + // }); + // // const readResponse = await this.readBareResponse(response); + // + // const result: Response & Partial = new Response( + // statusEmpty.includes(response.status!) ? undefined : response.body, + // { + // status: response.status, + // statusText: response.statusText ?? undefined, + // headers: new Headers(response.headers as HeadersInit), + // } + // ); + // + // result.rawHeaders = response.rawHeaders; + // result.rawResponse = response; + // + // return result as BareResponse; + // } + // } + + self.BCC_VERSION = "3.0.4"; console.warn("BCC_VERSION: " + self.BCC_VERSION); class Switcher { active = null; @@ -32,7 +187,7 @@ console.log(type, data, "ServiceWorker" in globalThis); switch (type) { case "setremote": - // this.active = new RemoteClient + this.active = new RemoteTransport; break; case "set": const { name, config } = data; @@ -181,7 +336,6 @@ if (socket.binaryType === "arraybuffer") { payload = await payload.arrayBuffer(); Object.setPrototypeOf(payload, arrayBufferImpl); - console.log(payload); } socket.dispatchEvent(new MessageEvent("message", { data: payload })); } @@ -339,6 +493,7 @@ exports.default = BareClient; exports.findSwitcher = findSwitcher; exports.maxRedirects = maxRedirects; + exports.registerRemoteListener = registerRemoteListener; Object.defineProperty(exports, '__esModule', { value: true }); diff --git a/dist/bare.cjs.map b/dist/bare.cjs.map index 1d9193b..26b7614 100644 --- a/dist/bare.cjs.map +++ b/dist/bare.cjs.map @@ -1 +1 @@ -{"version":3,"file":"bare.cjs","sources":["../src/BareTypes.ts","../src/snapshot.ts","../src/Switcher.ts","../src/webSocket.ts","../src/BareClient.ts"],"sourcesContent":["export type BareHeaders = Record;\n\nexport type BareMeta =\n {\n // ???\n };\n\nexport type TransferrableResponse =\n {\n body: ReadableStream | ArrayBuffer | Blob | string,\n headers: BareHeaders,\n status: number,\n statusText: string\n }\n\nexport interface BareTransport {\n init: () => Promise;\n ready: boolean;\n connect: (\n url: URL,\n origin: string,\n protocols: string[],\n requestHeaders: BareHeaders,\n onopen: (protocol: string) => void,\n onmessage: (data: Blob | ArrayBuffer | string) => void,\n onclose: (code: number, reason: string) => void,\n onerror: (error: string) => void,\n ) => (data: Blob | ArrayBuffer | string) => void;\n\n request: (\n remote: URL,\n method: string,\n body: BodyInit | null,\n headers: BareHeaders,\n signal: AbortSignal | undefined\n ) => Promise;\n\n meta: () => BareMeta\n}\nexport interface BareWebSocketMeta {\n protocol: string;\n setCookies: string[];\n}\n\nexport type BareHTTPProtocol = 'blob:' | 'http:' | 'https:' | string;\nexport type BareWSProtocol = 'ws:' | 'wss:' | string;\n\nexport const maxRedirects = 20;\n\n\n","// The user likely has overwritten all networking functions after importing bare-client\n// It is our responsibility to make sure components of Bare-Client are using native networking functions\n\nexport const fetch = globalThis.fetch;\nexport const WebSocket = globalThis.WebSocket;\nexport const Request = globalThis.Request;\nexport const Response = globalThis.Response;\nexport const XMLHttpRequest = globalThis.XMLHttpRequest;\n\nexport const WebSocketFields = {\n prototype: {\n send: WebSocket.prototype.send,\n },\n CLOSED: WebSocket.CLOSED,\n CLOSING: WebSocket.CLOSING,\n CONNECTING: WebSocket.CONNECTING,\n OPEN: WebSocket.OPEN,\n};\n","import { BareTransport } from \"./BareTypes\";\n\nself.BCC_VERSION = \"3.0.2\";\nconsole.warn(\"BCC_VERSION: \" + self.BCC_VERSION);\n\ndeclare global {\n interface ServiceWorkerGlobalScope {\n gSwitcher: Switcher;\n BCC_VERSION: string;\n BCC_DEBUG: boolean;\n }\n interface WorkerGlobalScope {\n gSwitcher: Switcher;\n BCC_VERSION: string;\n BCC_DEBUG: boolean;\n }\n interface Window {\n gSwitcher: Switcher;\n BCC_VERSION: string;\n BCC_DEBUG: boolean;\n }\n}\n\nclass Switcher {\n active: BareTransport | null = null;\n\n channel = new BroadcastChannel(\"bare-mux\");\n\n constructor() {\n this.channel.addEventListener(\"message\", ({ data: { type, data } }) => {\n console.log(type, data, \"ServiceWorker\" in globalThis);\n switch (type) {\n case \"setremote\":\n // this.active = new RemoteClient\n break;\n case \"set\":\n const { name, config } = data;\n this.active = new ((0, eval)(name))(...config);\n break;\n }\n });\n }\n}\n\nexport function findSwitcher(): Switcher {\n if (globalThis.gSwitcher) return globalThis.gSwitcher;\n if (\"ServiceWorkerGlobalScope\" in globalThis) {\n globalThis.gSwitcher = new Switcher;\n return globalThis.gSwitcher;\n }\n\n let _parent: any = window;\n for (let i = 0; i < 20; i++) {\n try {\n if (_parent == _parent.parent) {\n globalThis.gSwitcher = new Switcher;\n return globalThis.gSwitcher;\n }\n _parent = _parent.parent;\n\n if (_parent && _parent[\"gSwitcher\"]) {\n console.warn(\"found implementation on parent\");\n globalThis.gSwitcher = _parent[\"gSwitcher\"];\n return _parent[\"gSwitcher\"];\n }\n } catch (e) {\n globalThis.gSwitcher = new Switcher;\n return globalThis.gSwitcher;\n }\n }\n\n throw \"unreachable\";\n}\nfindSwitcher();\n\nexport function SetTransport(name: string, ...config: any[]) {\n let switcher = findSwitcher();\n switcher.active = new ((0, eval)(name))(...config);\n switcher.channel.postMessage({ type: \"set\", data: { name, config } });\n}\n\nexport function SetSingletonTransport(client: BareTransport) {\n let switcher = findSwitcher();\n switcher.active = client;\n switcher.channel.postMessage({ type: \"setremote\" });\n}\n","/*\n * WebSocket helpers\n */\n\nconst validChars =\n \"!#$%&'*+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz|~\";\n\nexport function validProtocol(protocol: string): boolean {\n for (let i = 0; i < protocol.length; i++) {\n const char = protocol[i];\n\n if (!validChars.includes(char)) {\n return false;\n }\n }\n\n return true;\n}\n","import { BareHeaders, maxRedirects } from './BareTypes';\nimport { findSwitcher } from './Switcher';\nimport { WebSocketFields } from './snapshot.js';\nimport { validProtocol } from './webSocket';\n\n\n// get the unhooked value\nconst getRealReadyState = Object.getOwnPropertyDescriptor(\n WebSocket.prototype,\n 'readyState'\n)!.get!;\n\nconst wsProtocols = ['ws:', 'wss:'];\nconst statusEmpty = [101, 204, 205, 304];\n\nconst statusRedirect = [301, 302, 303, 307, 308];\n\nexport type WebSocketImpl = {\n new(...args: ConstructorParameters): WebSocket;\n};\n\nexport namespace BareWebSocket {\n export type GetReadyStateCallback = () => number;\n export type GetSendErrorCallback = () => Error | undefined;\n export type GetProtocolCallback = () => string;\n export type HeadersType = BareHeaders | Headers | undefined;\n export type HeadersProvider =\n | BareHeaders\n | (() => BareHeaders | Promise);\n\n export interface Options {\n /**\n * A provider of request headers to pass to the remote.\n * Usually one of `User-Agent`, `Origin`, and `Cookie`\n * Can be just the headers object or an synchronous/asynchronous function that returns the headers object\n */\n headers?: BareWebSocket.HeadersProvider;\n /**\n * A hook executed by this function with helper arguments for hooking the readyState property. If a hook isn't provided, bare-client will hook the property on the instance. Hooking it on an instance basis is good for small projects, but ideally the class should be hooked by the user of bare-client.\n */\n readyStateHook?:\n | ((\n socket: WebSocket,\n getReadyState: BareWebSocket.GetReadyStateCallback\n ) => void)\n | undefined;\n /**\n * A hook executed by this function with helper arguments for determining if the send function should throw an error. If a hook isn't provided, bare-client will hook the function on the instance.\n */\n sendErrorHook?:\n | ((\n socket: WebSocket,\n getSendError: BareWebSocket.GetSendErrorCallback\n ) => void)\n | undefined;\n /**\n * A hook executed by this function with the URL. If a hook isn't provided, bare-client will hook the URL.\n */\n urlHook?: ((socket: WebSocket, url: URL) => void) | undefined;\n /**\n * A hook executed by this function with a helper for getting the current fake protocol. If a hook isn't provided, bare-client will hook the protocol.\n */\n protocolHook?:\n | ((\n socket: WebSocket,\n getProtocol: BareWebSocket.GetProtocolCallback\n ) => void)\n | undefined;\n /**\n * A callback executed by this function with an array of cookies. This is called once the metadata from the server is received.\n */\n setCookiesCallback?: ((setCookies: string[]) => void) | undefined;\n webSocketImpl?: WebSocket;\n }\n}\n\n/**\n * A Response with additional properties.\n */\nexport interface BareResponse extends Response {\n rawResponse: Response;\n rawHeaders: BareHeaders;\n}\n/**\n * A BareResponse with additional properties.\n */\nexport interface BareResponseFetch extends BareResponse {\n finalURL: string;\n}\nexport class BareClient {\n\n /**\n * Create a BareClient. Calls to fetch and connect will wait for an implementation to be ready.\n */\n constructor() { }\n\n createWebSocket(\n remote: string | URL,\n protocols: string | string[] | undefined = [],\n webSocketImpl: WebSocketImpl,\n requestHeaders: BareHeaders,\n arrayBufferImpl: typeof ArrayBuffer,\n ): WebSocket {\n let switcher = findSwitcher();\n let client = switcher.active;\n if (!client) throw \"invalid switcher\";\n\n if (!client.ready)\n throw new TypeError(\n 'You need to wait for the client to finish fetching the manifest before creating any WebSockets. Try caching the manifest data before making this request.'\n );\n\n try {\n remote = new URL(remote);\n } catch (err) {\n throw new DOMException(\n `Faiiled to construct 'WebSocket': The URL '${remote}' is invalid.`\n );\n }\n\n if (!wsProtocols.includes(remote.protocol))\n throw new DOMException(\n `Failed to construct 'WebSocket': The URL's scheme must be either 'ws' or 'wss'. '${remote.protocol}' is not allowed.`\n );\n\n if (!Array.isArray(protocols)) protocols = [protocols];\n\n protocols = protocols.map(String);\n\n for (const proto of protocols)\n if (!validProtocol(proto))\n throw new DOMException(\n `Failed to construct 'WebSocket': The subprotocol '${proto}' is invalid.`\n );\n\n\n let wsImpl = (webSocketImpl || WebSocket) as WebSocketImpl;\n const socket = new wsImpl(\"wss:null\", protocols);\n\n let fakeProtocol = '';\n\n let fakeReadyState: number = WebSocketFields.CONNECTING;\n\n let initialErrorHappened = false;\n socket.addEventListener(\"error\", (e) => {\n if (!initialErrorHappened) {\n fakeReadyState = WebSocket.CONNECTING;\n e.stopImmediatePropagation();\n initialErrorHappened = true;\n }\n });\n let initialCloseHappened = false;\n socket.addEventListener(\"close\", (e) => {\n if (!initialCloseHappened) {\n e.stopImmediatePropagation();\n initialCloseHappened = true;\n }\n });\n // TODO socket onerror will be broken\n\n arrayBufferImpl = arrayBufferImpl || webSocketImpl.constructor.constructor(\"return ArrayBuffer\")().prototype;\n requestHeaders['Host'] = (new URL(remote)).host;\n // requestHeaders['Origin'] = origin;\n requestHeaders['Pragma'] = 'no-cache';\n requestHeaders['Cache-Control'] = 'no-cache';\n requestHeaders['Upgrade'] = 'websocket';\n // requestHeaders['User-Agent'] = navigator.userAgent;\n requestHeaders['Connection'] = 'Upgrade';\n const sendData = client.connect(\n remote,\n origin,\n protocols,\n requestHeaders,\n (protocol: string) => {\n fakeReadyState = WebSocketFields.OPEN;\n fakeProtocol = protocol;\n\n (socket as any).meta = {\n headers: {\n \"sec-websocket-protocol\": protocol,\n }\n }; // what the fuck is a meta\n socket.dispatchEvent(new Event(\"open\"));\n },\n async (payload) => {\n if (typeof payload === \"string\") {\n socket.dispatchEvent(new MessageEvent(\"message\", { data: payload }));\n } else if (\"byteLength\" in payload) {\n if (socket.binaryType === \"blob\") {\n payload = new Blob([payload]);\n } else {\n Object.setPrototypeOf(payload, arrayBufferImpl);\n }\n\n socket.dispatchEvent(new MessageEvent(\"message\", { data: payload }));\n } else if (\"arrayBuffer\" in payload) {\n if (socket.binaryType === \"arraybuffer\") {\n payload = await payload.arrayBuffer()\n Object.setPrototypeOf(payload, arrayBufferImpl);\n console.log(payload);\n }\n\n socket.dispatchEvent(new MessageEvent(\"message\", { data: payload }));\n }\n },\n (code, reason) => {\n fakeReadyState = WebSocketFields.CLOSED;\n socket.dispatchEvent(new CloseEvent(\"close\", { code, reason }));\n },\n () => {\n fakeReadyState = WebSocketFields.CLOSED;\n },\n )\n\n // const socket = this.client.connect(\n // remote,\n // protocols,\n // async () => {\n // const resolvedHeaders =\n // typeof options.headers === 'function'\n // ? await options.headers()\n // : options.headers || {};\n //\n // const requestHeaders: BareHeaders =\n // resolvedHeaders instanceof Headers\n // ? Object.fromEntries(resolvedHeaders)\n // : resolvedHeaders;\n //\n // // user is expected to specify user-agent and origin\n // // both are in spec\n //\n //\n // return requestHeaders;\n // },\n // (meta) => {\n // fakeProtocol = meta.protocol;\n // if (options.setCookiesCallback)\n // options.setCookiesCallback(meta.setCookies);\n // },\n // (readyState) => {\n // fakeReadyState = readyState;\n // },\n // options.webSocketImpl || WebSocket\n // );\n\n // protocol is always an empty before connecting\n // updated when we receive the metadata\n // this value doesn't change when it's CLOSING or CLOSED etc\n const getReadyState = () => {\n const realReadyState = getRealReadyState.call(socket);\n // readyState should only be faked when the real readyState is OPEN\n return realReadyState === WebSocketFields.OPEN\n ? fakeReadyState\n : realReadyState;\n };\n\n // we have to hook .readyState ourselves\n\n Object.defineProperty(socket, 'readyState', {\n get: getReadyState,\n configurable: true,\n enumerable: true,\n });\n\n /**\n * @returns The error that should be thrown if send() were to be called on this socket according to the fake readyState value\n */\n const getSendError = () => {\n const readyState = getReadyState();\n\n if (readyState === WebSocketFields.CONNECTING)\n return new DOMException(\n \"Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.\"\n );\n };\n\n // we have to hook .send ourselves\n // use ...args to avoid giving the number of args a quantity\n // no arguments will trip the following error: TypeError: Failed to execute 'send' on 'WebSocket': 1 argument required, but only 0 present.\n socket.send = function(...args) {\n const error = getSendError();\n\n if (error) throw error;\n sendData(args[0] as any);\n };\n\n Object.defineProperty(socket, 'url', {\n get: () => remote.toString(),\n configurable: true,\n enumerable: true,\n });\n\n const getProtocol = () => fakeProtocol;\n\n Object.defineProperty(socket, 'protocol', {\n get: getProtocol,\n configurable: true,\n enumerable: true,\n });\n\n return socket;\n }\n\n async fetch(\n url: string | URL,\n init?: RequestInit\n ): Promise {\n // Only create an instance of Request to parse certain parameters of init such as method, headers, redirect\n // But use init values whenever possible\n const req = new Request(url, init);\n\n\n // try to use init.headers because it may contain capitalized headers\n // furthermore, important headers on the Request class are blocked...\n // we should try to preserve the capitalization due to quirks with earlier servers\n const inputHeaders = init?.headers || req.headers;\n\n const headers: BareHeaders =\n inputHeaders instanceof Headers\n ? Object.fromEntries(inputHeaders)\n : (inputHeaders as BareHeaders);\n\n\n const body = init?.body || req.body;\n\n let urlO = new URL(req.url);\n\n if (urlO.protocol.startsWith('blob:')) {\n const response = await fetch(urlO);\n const result: Response & Partial = new Response(\n response.body,\n response\n );\n\n result.rawHeaders = Object.fromEntries(response.headers);\n result.rawResponse = response;\n\n return result as BareResponseFetch;\n }\n\n let switcher = findSwitcher();\n if (!switcher.active) throw \"there are no bare clients\";\n const client = switcher.active;\n if (!client.ready) await client.init();\n\n for (let i = 0; ; i++) {\n if ('host' in headers) headers.host = urlO.host;\n else headers.Host = urlO.host;\n\n\n let resp = await client.request(\n urlO,\n req.method,\n body,\n headers,\n req.signal\n );\n\n let responseobj: BareResponse & Partial = new Response(\n statusEmpty.includes(resp.status) ? undefined : resp.body, {\n headers: new Headers(resp.headers as HeadersInit),\n status: resp.status,\n statusText: resp.statusText,\n }) as BareResponse;\n responseobj.rawHeaders = resp.headers;\n responseobj.rawResponse = new Response(resp.body);\n\n\n responseobj.finalURL = urlO.toString();\n\n const redirect = init?.redirect || req.redirect;\n\n if (statusRedirect.includes(responseobj.status)) {\n switch (redirect) {\n case 'follow': {\n const location = responseobj.headers.get('location');\n if (maxRedirects > i && location !== null) {\n urlO = new URL(location, urlO);\n continue;\n } else throw new TypeError('Failed to fetch');\n }\n case 'error':\n throw new TypeError('Failed to fetch');\n case 'manual':\n return responseobj as BareResponseFetch;\n }\n } else {\n return responseobj as BareResponseFetch;\n }\n }\n }\n}\n"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"bare.cjs","sources":["../src/BareTypes.ts","../src/snapshot.ts","../src/RemoteClient.ts","../src/Switcher.ts","../src/webSocket.ts","../src/BareClient.ts"],"sourcesContent":["export type BareHeaders = Record;\n\nexport type BareMeta =\n {\n // ???\n };\n\nexport type TransferrableResponse =\n {\n body: ReadableStream | ArrayBuffer | Blob | string,\n headers: BareHeaders,\n status: number,\n statusText: string\n }\n\nexport interface BareTransport {\n init: () => Promise;\n ready: boolean;\n connect: (\n url: URL,\n origin: string,\n protocols: string[],\n requestHeaders: BareHeaders,\n onopen: (protocol: string) => void,\n onmessage: (data: Blob | ArrayBuffer | string) => void,\n onclose: (code: number, reason: string) => void,\n onerror: (error: string) => void,\n ) => (data: Blob | ArrayBuffer | string) => void;\n\n request: (\n remote: URL,\n method: string,\n body: BodyInit | null,\n headers: BareHeaders,\n signal: AbortSignal | undefined\n ) => Promise;\n\n meta: () => BareMeta\n}\nexport interface BareWebSocketMeta {\n protocol: string;\n setCookies: string[];\n}\n\nexport type BareHTTPProtocol = 'blob:' | 'http:' | 'https:' | string;\nexport type BareWSProtocol = 'ws:' | 'wss:' | string;\n\nexport const maxRedirects = 20;\n\n\n","// The user likely has overwritten all networking functions after importing bare-client\n// It is our responsibility to make sure components of Bare-Client are using native networking functions\n\nexport const fetch = globalThis.fetch;\nexport const WebSocket = globalThis.WebSocket;\nexport const Request = globalThis.Request;\nexport const Response = globalThis.Response;\nexport const XMLHttpRequest = globalThis.XMLHttpRequest;\n\nexport const WebSocketFields = {\n prototype: {\n send: WebSocket.prototype.send,\n },\n CLOSED: WebSocket.CLOSED,\n CLOSING: WebSocket.CLOSING,\n CONNECTING: WebSocket.CONNECTING,\n OPEN: WebSocket.OPEN,\n};\n","/// \nimport { v4 as uuid } from 'uuid';\nimport { BareHeaders, BareTransport, TransferrableResponse } from './BareTypes';\nimport { findSwitcher } from './Switcher';\n\nexport function registerRemoteListener(channel: ServiceWorker) {\n (navigator as any).serviceWorker.addEventListener(\"message\", async ({ data }) => {\n if (data.type === \"request\") {\n const { remote, method, body, headers } = data;\n\n let response: any = await findSwitcher().active?.request(new URL(remote), method, body, headers, undefined)!;\n let transferred: any = [];\n if (response.body instanceof ArrayBuffer || response.body instanceof Blob || response.body instanceof ReadableStream) {\n transferred.push(response.body);\n }\n response.id = data.id;\n response.type = \"response\";\n channel.postMessage(response, transferred);\n }\n });\n}\n\ndeclare var self: ServiceWorkerGlobalScope;\nlet remote: RemoteTransport;\nif (\"ServiceWorkerGlobalScope\" in self) {\n addEventListener(\"message\", async ({ data }) => {\n if (data.type === \"response\") {\n let resolve = remote.promises.get(data.id);\n if (resolve) {\n resolve(data);\n remote.promises.delete(data.id);\n }\n }\n });\n}\n\nexport default class RemoteTransport implements BareTransport {\n canstart = true;\n ready = false;\n promises = new Map void>();\n constructor() {\n if (!(\"ServiceWorkerGlobalScope\" in self)) {\n throw new TypeError(\"Attempt to construct RemoteClient from outside a service worker\")\n }\n }\n\n async init() {\n remote = this;\n this.ready = true;\n }\n\n async meta() { }\n async request(\n remote: URL,\n method: string,\n body: BodyInit | null,\n headers: BareHeaders,\n signal: AbortSignal | undefined\n ): Promise {\n let id = uuid();\n const clients = await self.clients.matchAll();\n if (clients.length < 1)\n throw new Error(\"no available clients\");\n\n for (const client of clients) {\n client.postMessage({\n type: \"request\",\n id,\n remote: remote.toString(),\n method,\n body,\n headers\n });\n }\n\n\n return await new Promise((resolve, reject) => {\n this.promises.set(id, resolve);\n });\n }\n\n connect(\n url: URL,\n origin: string,\n protocols: string[],\n requestHeaders: BareHeaders,\n onopen: (protocol: string) => void,\n onmessage: (data: Blob | ArrayBuffer | string) => void,\n onclose: (code: number, reason: string) => void,\n onerror: (error: string) => void\n ): (data: Blob | ArrayBuffer | string) => void {\n throw \"why are you calling connect from remoteclient\"\n }\n}\n//\n// declare const self: ServiceWorkerGlobalScope;\n// export default class RemoteClient extends Client {\n// static singleton: RemoteClient;\n// private callbacks: Record) => void> = {};\n//\n// private uid = uuid();\n// constructor() {\n// if (RemoteClient.singleton) return RemoteClient.singleton;\n// super();\n// // this should be fine\n// // if (!(\"ServiceWorkerGlobalScope\" in self)) {\n// // throw new TypeError(\"Attempt to construct RemoteClient from outside a service worker\")\n// // }\n//\n// addEventListener(\"message\", (event) => {\n// if (event.data.__remote_target === this.uid) {\n// const callback = this.callbacks[event.data.__remote_id];\n// callback(event.data.__remote_value);\n// }\n// });\n//\n// RemoteClient.singleton = this;\n// }\n//\n// async send(message: Record, id?: string) {\n// const clients = await self.clients.matchAll();\n// if (clients.length < 1)\n// throw new Error(\"no available clients\");\n//\n// for (const client of clients) {\n// client.postMessage({\n// __remote_target: this.uid,\n// __remote_id: id,\n// __remote_value: message\n// })\n// }\n//\n// }\n//\n// async sendWithResponse(message: Record): Promise {\n// const id = uuid();\n// return new Promise((resolve) => {\n// this.callbacks[id] = resolve;\n// this.send(message, id);\n// });\n// }\n//\n// connect(\n// ...args: any\n// ) {\n// throw \"why are you calling connect from remoteclient\"\n// }\n// async request(\n// method: BareMethod,\n// requestHeaders: BareHeaders,\n// body: BodyInit | null,\n// remote: URL,\n// cache: BareCache | undefined,\n// duplex: string | undefined,\n// signal: AbortSignal | undefined\n// ): Promise {\n//\n// const response = await this.sendWithResponse({\n// type: \"request\",\n// options: {\n// method,\n// requestHeaders,\n// body,\n// remote: remote.toString(),\n// },\n// });\n// // const readResponse = await this.readBareResponse(response);\n//\n// const result: Response & Partial = new Response(\n// statusEmpty.includes(response.status!) ? undefined : response.body,\n// {\n// status: response.status,\n// statusText: response.statusText ?? undefined,\n// headers: new Headers(response.headers as HeadersInit),\n// }\n// );\n//\n// result.rawHeaders = response.rawHeaders;\n// result.rawResponse = response;\n//\n// return result as BareResponse;\n// }\n// }\n","import { BareTransport } from \"./BareTypes\";\nimport RemoteTransport from \"./RemoteClient\";\n\nself.BCC_VERSION = \"3.0.4\";\nconsole.warn(\"BCC_VERSION: \" + self.BCC_VERSION);\n\ndeclare global {\n interface ServiceWorkerGlobalScope {\n gSwitcher: Switcher;\n BCC_VERSION: string;\n BCC_DEBUG: boolean;\n }\n interface WorkerGlobalScope {\n gSwitcher: Switcher;\n BCC_VERSION: string;\n BCC_DEBUG: boolean;\n }\n interface Window {\n gSwitcher: Switcher;\n BCC_VERSION: string;\n BCC_DEBUG: boolean;\n }\n}\n\nclass Switcher {\n active: BareTransport | null = null;\n\n channel = new BroadcastChannel(\"bare-mux\");\n\n constructor() {\n this.channel.addEventListener(\"message\", ({ data: { type, data } }) => {\n console.log(type, data, \"ServiceWorker\" in globalThis);\n switch (type) {\n case \"setremote\":\n this.active = new RemoteTransport\n break;\n case \"set\":\n const { name, config } = data;\n this.active = new ((0, eval)(name))(...config);\n break;\n }\n });\n }\n}\n\nexport function findSwitcher(): Switcher {\n if (globalThis.gSwitcher) return globalThis.gSwitcher;\n if (\"ServiceWorkerGlobalScope\" in globalThis) {\n globalThis.gSwitcher = new Switcher;\n return globalThis.gSwitcher;\n }\n\n let _parent: any = window;\n for (let i = 0; i < 20; i++) {\n try {\n if (_parent == _parent.parent) {\n globalThis.gSwitcher = new Switcher;\n return globalThis.gSwitcher;\n }\n _parent = _parent.parent;\n\n if (_parent && _parent[\"gSwitcher\"]) {\n console.warn(\"found implementation on parent\");\n globalThis.gSwitcher = _parent[\"gSwitcher\"];\n return _parent[\"gSwitcher\"];\n }\n } catch (e) {\n globalThis.gSwitcher = new Switcher;\n return globalThis.gSwitcher;\n }\n }\n\n throw \"unreachable\";\n}\nfindSwitcher();\n\nexport function SetTransport(name: string, ...config: any[]) {\n let switcher = findSwitcher();\n switcher.active = new ((0, eval)(name))(...config);\n switcher.channel.postMessage({ type: \"set\", data: { name, config } });\n}\n\nexport function SetSingletonTransport(client: BareTransport) {\n let switcher = findSwitcher();\n switcher.active = client;\n switcher.channel.postMessage({ type: \"setremote\" });\n}\n","/*\n * WebSocket helpers\n */\n\nconst validChars =\n \"!#$%&'*+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz|~\";\n\nexport function validProtocol(protocol: string): boolean {\n for (let i = 0; i < protocol.length; i++) {\n const char = protocol[i];\n\n if (!validChars.includes(char)) {\n return false;\n }\n }\n\n return true;\n}\n","import { BareHeaders, maxRedirects } from './BareTypes';\nimport { findSwitcher } from './Switcher';\nimport { WebSocketFields } from './snapshot.js';\nimport { validProtocol } from './webSocket';\n\n\n// get the unhooked value\nconst getRealReadyState = Object.getOwnPropertyDescriptor(\n WebSocket.prototype,\n 'readyState'\n)!.get!;\n\nconst wsProtocols = ['ws:', 'wss:'];\nconst statusEmpty = [101, 204, 205, 304];\n\nconst statusRedirect = [301, 302, 303, 307, 308];\n\nexport type WebSocketImpl = {\n new(...args: ConstructorParameters): WebSocket;\n};\n\nexport namespace BareWebSocket {\n export type GetReadyStateCallback = () => number;\n export type GetSendErrorCallback = () => Error | undefined;\n export type GetProtocolCallback = () => string;\n export type HeadersType = BareHeaders | Headers | undefined;\n export type HeadersProvider =\n | BareHeaders\n | (() => BareHeaders | Promise);\n\n export interface Options {\n /**\n * A provider of request headers to pass to the remote.\n * Usually one of `User-Agent`, `Origin`, and `Cookie`\n * Can be just the headers object or an synchronous/asynchronous function that returns the headers object\n */\n headers?: BareWebSocket.HeadersProvider;\n /**\n * A hook executed by this function with helper arguments for hooking the readyState property. If a hook isn't provided, bare-client will hook the property on the instance. Hooking it on an instance basis is good for small projects, but ideally the class should be hooked by the user of bare-client.\n */\n readyStateHook?:\n | ((\n socket: WebSocket,\n getReadyState: BareWebSocket.GetReadyStateCallback\n ) => void)\n | undefined;\n /**\n * A hook executed by this function with helper arguments for determining if the send function should throw an error. If a hook isn't provided, bare-client will hook the function on the instance.\n */\n sendErrorHook?:\n | ((\n socket: WebSocket,\n getSendError: BareWebSocket.GetSendErrorCallback\n ) => void)\n | undefined;\n /**\n * A hook executed by this function with the URL. If a hook isn't provided, bare-client will hook the URL.\n */\n urlHook?: ((socket: WebSocket, url: URL) => void) | undefined;\n /**\n * A hook executed by this function with a helper for getting the current fake protocol. If a hook isn't provided, bare-client will hook the protocol.\n */\n protocolHook?:\n | ((\n socket: WebSocket,\n getProtocol: BareWebSocket.GetProtocolCallback\n ) => void)\n | undefined;\n /**\n * A callback executed by this function with an array of cookies. This is called once the metadata from the server is received.\n */\n setCookiesCallback?: ((setCookies: string[]) => void) | undefined;\n webSocketImpl?: WebSocket;\n }\n}\n\n/**\n * A Response with additional properties.\n */\nexport interface BareResponse extends Response {\n rawResponse: Response;\n rawHeaders: BareHeaders;\n}\n/**\n * A BareResponse with additional properties.\n */\nexport interface BareResponseFetch extends BareResponse {\n finalURL: string;\n}\nexport class BareClient {\n\n /**\n * Create a BareClient. Calls to fetch and connect will wait for an implementation to be ready.\n */\n constructor() { }\n\n createWebSocket(\n remote: string | URL,\n protocols: string | string[] | undefined = [],\n webSocketImpl: WebSocketImpl,\n requestHeaders: BareHeaders,\n arrayBufferImpl: typeof ArrayBuffer,\n ): WebSocket {\n let switcher = findSwitcher();\n let client = switcher.active;\n if (!client) throw \"invalid switcher\";\n\n if (!client.ready)\n throw new TypeError(\n 'You need to wait for the client to finish fetching the manifest before creating any WebSockets. Try caching the manifest data before making this request.'\n );\n\n try {\n remote = new URL(remote);\n } catch (err) {\n throw new DOMException(\n `Faiiled to construct 'WebSocket': The URL '${remote}' is invalid.`\n );\n }\n\n if (!wsProtocols.includes(remote.protocol))\n throw new DOMException(\n `Failed to construct 'WebSocket': The URL's scheme must be either 'ws' or 'wss'. '${remote.protocol}' is not allowed.`\n );\n\n if (!Array.isArray(protocols)) protocols = [protocols];\n\n protocols = protocols.map(String);\n\n for (const proto of protocols)\n if (!validProtocol(proto))\n throw new DOMException(\n `Failed to construct 'WebSocket': The subprotocol '${proto}' is invalid.`\n );\n\n\n let wsImpl = (webSocketImpl || WebSocket) as WebSocketImpl;\n const socket = new wsImpl(\"wss:null\", protocols);\n\n let fakeProtocol = '';\n\n let fakeReadyState: number = WebSocketFields.CONNECTING;\n\n let initialErrorHappened = false;\n socket.addEventListener(\"error\", (e) => {\n if (!initialErrorHappened) {\n fakeReadyState = WebSocket.CONNECTING;\n e.stopImmediatePropagation();\n initialErrorHappened = true;\n }\n });\n let initialCloseHappened = false;\n socket.addEventListener(\"close\", (e) => {\n if (!initialCloseHappened) {\n e.stopImmediatePropagation();\n initialCloseHappened = true;\n }\n });\n // TODO socket onerror will be broken\n\n arrayBufferImpl = arrayBufferImpl || webSocketImpl.constructor.constructor(\"return ArrayBuffer\")().prototype;\n requestHeaders['Host'] = (new URL(remote)).host;\n // requestHeaders['Origin'] = origin;\n requestHeaders['Pragma'] = 'no-cache';\n requestHeaders['Cache-Control'] = 'no-cache';\n requestHeaders['Upgrade'] = 'websocket';\n // requestHeaders['User-Agent'] = navigator.userAgent;\n requestHeaders['Connection'] = 'Upgrade';\n const sendData = client.connect(\n remote,\n origin,\n protocols,\n requestHeaders,\n (protocol: string) => {\n fakeReadyState = WebSocketFields.OPEN;\n fakeProtocol = protocol;\n\n (socket as any).meta = {\n headers: {\n \"sec-websocket-protocol\": protocol,\n }\n }; // what the fuck is a meta\n socket.dispatchEvent(new Event(\"open\"));\n },\n async (payload) => {\n if (typeof payload === \"string\") {\n socket.dispatchEvent(new MessageEvent(\"message\", { data: payload }));\n } else if (\"byteLength\" in payload) {\n if (socket.binaryType === \"blob\") {\n payload = new Blob([payload]);\n } else {\n Object.setPrototypeOf(payload, arrayBufferImpl);\n }\n\n socket.dispatchEvent(new MessageEvent(\"message\", { data: payload }));\n } else if (\"arrayBuffer\" in payload) {\n if (socket.binaryType === \"arraybuffer\") {\n payload = await payload.arrayBuffer()\n Object.setPrototypeOf(payload, arrayBufferImpl);\n }\n\n socket.dispatchEvent(new MessageEvent(\"message\", { data: payload }));\n }\n },\n (code, reason) => {\n fakeReadyState = WebSocketFields.CLOSED;\n socket.dispatchEvent(new CloseEvent(\"close\", { code, reason }));\n },\n () => {\n fakeReadyState = WebSocketFields.CLOSED;\n },\n )\n\n // const socket = this.client.connect(\n // remote,\n // protocols,\n // async () => {\n // const resolvedHeaders =\n // typeof options.headers === 'function'\n // ? await options.headers()\n // : options.headers || {};\n //\n // const requestHeaders: BareHeaders =\n // resolvedHeaders instanceof Headers\n // ? Object.fromEntries(resolvedHeaders)\n // : resolvedHeaders;\n //\n // // user is expected to specify user-agent and origin\n // // both are in spec\n //\n //\n // return requestHeaders;\n // },\n // (meta) => {\n // fakeProtocol = meta.protocol;\n // if (options.setCookiesCallback)\n // options.setCookiesCallback(meta.setCookies);\n // },\n // (readyState) => {\n // fakeReadyState = readyState;\n // },\n // options.webSocketImpl || WebSocket\n // );\n\n // protocol is always an empty before connecting\n // updated when we receive the metadata\n // this value doesn't change when it's CLOSING or CLOSED etc\n const getReadyState = () => {\n const realReadyState = getRealReadyState.call(socket);\n // readyState should only be faked when the real readyState is OPEN\n return realReadyState === WebSocketFields.OPEN\n ? fakeReadyState\n : realReadyState;\n };\n\n // we have to hook .readyState ourselves\n\n Object.defineProperty(socket, 'readyState', {\n get: getReadyState,\n configurable: true,\n enumerable: true,\n });\n\n /**\n * @returns The error that should be thrown if send() were to be called on this socket according to the fake readyState value\n */\n const getSendError = () => {\n const readyState = getReadyState();\n\n if (readyState === WebSocketFields.CONNECTING)\n return new DOMException(\n \"Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.\"\n );\n };\n\n // we have to hook .send ourselves\n // use ...args to avoid giving the number of args a quantity\n // no arguments will trip the following error: TypeError: Failed to execute 'send' on 'WebSocket': 1 argument required, but only 0 present.\n socket.send = function(...args) {\n const error = getSendError();\n\n if (error) throw error;\n sendData(args[0] as any);\n };\n\n Object.defineProperty(socket, 'url', {\n get: () => remote.toString(),\n configurable: true,\n enumerable: true,\n });\n\n const getProtocol = () => fakeProtocol;\n\n Object.defineProperty(socket, 'protocol', {\n get: getProtocol,\n configurable: true,\n enumerable: true,\n });\n\n return socket;\n }\n\n async fetch(\n url: string | URL,\n init?: RequestInit\n ): Promise {\n // Only create an instance of Request to parse certain parameters of init such as method, headers, redirect\n // But use init values whenever possible\n const req = new Request(url, init);\n\n\n // try to use init.headers because it may contain capitalized headers\n // furthermore, important headers on the Request class are blocked...\n // we should try to preserve the capitalization due to quirks with earlier servers\n const inputHeaders = init?.headers || req.headers;\n\n const headers: BareHeaders =\n inputHeaders instanceof Headers\n ? Object.fromEntries(inputHeaders)\n : (inputHeaders as BareHeaders);\n\n\n const body = init?.body || req.body;\n\n let urlO = new URL(req.url);\n\n if (urlO.protocol.startsWith('blob:')) {\n const response = await fetch(urlO);\n const result: Response & Partial = new Response(\n response.body,\n response\n );\n\n result.rawHeaders = Object.fromEntries(response.headers);\n result.rawResponse = response;\n\n return result as BareResponseFetch;\n }\n\n let switcher = findSwitcher();\n if (!switcher.active) throw \"there are no bare clients\";\n const client = switcher.active;\n if (!client.ready) await client.init();\n\n for (let i = 0; ; i++) {\n if ('host' in headers) headers.host = urlO.host;\n else headers.Host = urlO.host;\n\n\n let resp = await client.request(\n urlO,\n req.method,\n body,\n headers,\n req.signal\n );\n\n let responseobj: BareResponse & Partial = new Response(\n statusEmpty.includes(resp.status) ? undefined : resp.body, {\n headers: new Headers(resp.headers as HeadersInit),\n status: resp.status,\n statusText: resp.statusText,\n }) as BareResponse;\n responseobj.rawHeaders = resp.headers;\n responseobj.rawResponse = new Response(resp.body);\n\n\n responseobj.finalURL = urlO.toString();\n\n const redirect = init?.redirect || req.redirect;\n\n if (statusRedirect.includes(responseobj.status)) {\n switch (redirect) {\n case 'follow': {\n const location = responseobj.headers.get('location');\n if (maxRedirects > i && location !== null) {\n urlO = new URL(location, urlO);\n continue;\n } else throw new TypeError('Failed to fetch');\n }\n case 'error':\n throw new TypeError('Failed to fetch');\n case 'manual':\n return responseobj as BareResponseFetch;\n }\n } else {\n return responseobj as BareResponseFetch;\n }\n }\n }\n}\n"],"names":["uuid"],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts index 9725366..4e27ca4 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -1,5 +1,6 @@ export * from './BareTypes'; export * from './BareClient'; export * from './Switcher'; +export * from './RemoteClient'; export { BareClient as default } from './BareClient'; export { WebSocketFields } from "./snapshot"; diff --git a/dist/index.js b/dist/index.js index 3b73de8..0f83138 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,3 +1,5 @@ +import { v4 } from 'uuid'; + const maxRedirects = 20; // The user likely has overwritten all networking functions after importing bare-client @@ -16,7 +18,162 @@ const WebSocketFields = { OPEN: WebSocket.OPEN, }; -self.BCC_VERSION = "3.0.2"; +/// +function registerRemoteListener(channel) { + navigator.serviceWorker.addEventListener("message", async ({ data }) => { + if (data.type === "request") { + const { remote, method, body, headers } = data; + let response = await findSwitcher().active?.request(new URL(remote), method, body, headers, undefined); + let transferred = []; + if (response.body instanceof ArrayBuffer || response.body instanceof Blob || response.body instanceof ReadableStream) { + transferred.push(response.body); + } + response.id = data.id; + response.type = "response"; + channel.postMessage(response, transferred); + } + }); +} +let remote; +if ("ServiceWorkerGlobalScope" in self) { + addEventListener("message", async ({ data }) => { + if (data.type === "response") { + let resolve = remote.promises.get(data.id); + if (resolve) { + resolve(data); + remote.promises.delete(data.id); + } + } + }); +} +class RemoteTransport { + canstart = true; + ready = false; + promises = new Map(); + constructor() { + if (!("ServiceWorkerGlobalScope" in self)) { + throw new TypeError("Attempt to construct RemoteClient from outside a service worker"); + } + } + async init() { + remote = this; + this.ready = true; + } + async meta() { } + async request(remote, method, body, headers, signal) { + let id = v4(); + const clients = await self.clients.matchAll(); + if (clients.length < 1) + throw new Error("no available clients"); + for (const client of clients) { + client.postMessage({ + type: "request", + id, + remote: remote.toString(), + method, + body, + headers + }); + } + return await new Promise((resolve, reject) => { + this.promises.set(id, resolve); + }); + } + connect(url, origin, protocols, requestHeaders, onopen, onmessage, onclose, onerror) { + throw "why are you calling connect from remoteclient"; + } +} +// +// declare const self: ServiceWorkerGlobalScope; +// export default class RemoteClient extends Client { +// static singleton: RemoteClient; +// private callbacks: Record) => void> = {}; +// +// private uid = uuid(); +// constructor() { +// if (RemoteClient.singleton) return RemoteClient.singleton; +// super(); +// // this should be fine +// // if (!("ServiceWorkerGlobalScope" in self)) { +// // throw new TypeError("Attempt to construct RemoteClient from outside a service worker") +// // } +// +// addEventListener("message", (event) => { +// if (event.data.__remote_target === this.uid) { +// const callback = this.callbacks[event.data.__remote_id]; +// callback(event.data.__remote_value); +// } +// }); +// +// RemoteClient.singleton = this; +// } +// +// async send(message: Record, id?: string) { +// const clients = await self.clients.matchAll(); +// if (clients.length < 1) +// throw new Error("no available clients"); +// +// for (const client of clients) { +// client.postMessage({ +// __remote_target: this.uid, +// __remote_id: id, +// __remote_value: message +// }) +// } +// +// } +// +// async sendWithResponse(message: Record): Promise { +// const id = uuid(); +// return new Promise((resolve) => { +// this.callbacks[id] = resolve; +// this.send(message, id); +// }); +// } +// +// connect( +// ...args: any +// ) { +// throw "why are you calling connect from remoteclient" +// } +// async request( +// method: BareMethod, +// requestHeaders: BareHeaders, +// body: BodyInit | null, +// remote: URL, +// cache: BareCache | undefined, +// duplex: string | undefined, +// signal: AbortSignal | undefined +// ): Promise { +// +// const response = await this.sendWithResponse({ +// type: "request", +// options: { +// method, +// requestHeaders, +// body, +// remote: remote.toString(), +// }, +// }); +// // const readResponse = await this.readBareResponse(response); +// +// const result: Response & Partial = new Response( +// statusEmpty.includes(response.status!) ? undefined : response.body, +// { +// status: response.status, +// statusText: response.statusText ?? undefined, +// headers: new Headers(response.headers as HeadersInit), +// } +// ); +// +// result.rawHeaders = response.rawHeaders; +// result.rawResponse = response; +// +// return result as BareResponse; +// } +// } + +self.BCC_VERSION = "3.0.4"; console.warn("BCC_VERSION: " + self.BCC_VERSION); class Switcher { active = null; @@ -26,7 +183,7 @@ class Switcher { console.log(type, data, "ServiceWorker" in globalThis); switch (type) { case "setremote": - // this.active = new RemoteClient + this.active = new RemoteTransport; break; case "set": const { name, config } = data; @@ -175,7 +332,6 @@ class BareClient { if (socket.binaryType === "arraybuffer") { payload = await payload.arrayBuffer(); Object.setPrototypeOf(payload, arrayBufferImpl); - console.log(payload); } socket.dispatchEvent(new MessageEvent("message", { data: payload })); } @@ -326,5 +482,5 @@ class BareClient { } } -export { BareClient, SetSingletonTransport, SetTransport, WebSocketFields, BareClient as default, findSwitcher, maxRedirects }; +export { BareClient, SetSingletonTransport, SetTransport, WebSocketFields, BareClient as default, findSwitcher, maxRedirects, registerRemoteListener }; //# sourceMappingURL=index.js.map diff --git a/dist/index.js.map b/dist/index.js.map index fa43573..3932ced 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sources":["../src/BareTypes.ts","../src/snapshot.ts","../src/Switcher.ts","../src/webSocket.ts","../src/BareClient.ts"],"sourcesContent":["export type BareHeaders = Record;\n\nexport type BareMeta =\n {\n // ???\n };\n\nexport type TransferrableResponse =\n {\n body: ReadableStream | ArrayBuffer | Blob | string,\n headers: BareHeaders,\n status: number,\n statusText: string\n }\n\nexport interface BareTransport {\n init: () => Promise;\n ready: boolean;\n connect: (\n url: URL,\n origin: string,\n protocols: string[],\n requestHeaders: BareHeaders,\n onopen: (protocol: string) => void,\n onmessage: (data: Blob | ArrayBuffer | string) => void,\n onclose: (code: number, reason: string) => void,\n onerror: (error: string) => void,\n ) => (data: Blob | ArrayBuffer | string) => void;\n\n request: (\n remote: URL,\n method: string,\n body: BodyInit | null,\n headers: BareHeaders,\n signal: AbortSignal | undefined\n ) => Promise;\n\n meta: () => BareMeta\n}\nexport interface BareWebSocketMeta {\n protocol: string;\n setCookies: string[];\n}\n\nexport type BareHTTPProtocol = 'blob:' | 'http:' | 'https:' | string;\nexport type BareWSProtocol = 'ws:' | 'wss:' | string;\n\nexport const maxRedirects = 20;\n\n\n","// The user likely has overwritten all networking functions after importing bare-client\n// It is our responsibility to make sure components of Bare-Client are using native networking functions\n\nexport const fetch = globalThis.fetch;\nexport const WebSocket = globalThis.WebSocket;\nexport const Request = globalThis.Request;\nexport const Response = globalThis.Response;\nexport const XMLHttpRequest = globalThis.XMLHttpRequest;\n\nexport const WebSocketFields = {\n prototype: {\n send: WebSocket.prototype.send,\n },\n CLOSED: WebSocket.CLOSED,\n CLOSING: WebSocket.CLOSING,\n CONNECTING: WebSocket.CONNECTING,\n OPEN: WebSocket.OPEN,\n};\n","import { BareTransport } from \"./BareTypes\";\n\nself.BCC_VERSION = \"3.0.2\";\nconsole.warn(\"BCC_VERSION: \" + self.BCC_VERSION);\n\ndeclare global {\n interface ServiceWorkerGlobalScope {\n gSwitcher: Switcher;\n BCC_VERSION: string;\n BCC_DEBUG: boolean;\n }\n interface WorkerGlobalScope {\n gSwitcher: Switcher;\n BCC_VERSION: string;\n BCC_DEBUG: boolean;\n }\n interface Window {\n gSwitcher: Switcher;\n BCC_VERSION: string;\n BCC_DEBUG: boolean;\n }\n}\n\nclass Switcher {\n active: BareTransport | null = null;\n\n channel = new BroadcastChannel(\"bare-mux\");\n\n constructor() {\n this.channel.addEventListener(\"message\", ({ data: { type, data } }) => {\n console.log(type, data, \"ServiceWorker\" in globalThis);\n switch (type) {\n case \"setremote\":\n // this.active = new RemoteClient\n break;\n case \"set\":\n const { name, config } = data;\n this.active = new ((0, eval)(name))(...config);\n break;\n }\n });\n }\n}\n\nexport function findSwitcher(): Switcher {\n if (globalThis.gSwitcher) return globalThis.gSwitcher;\n if (\"ServiceWorkerGlobalScope\" in globalThis) {\n globalThis.gSwitcher = new Switcher;\n return globalThis.gSwitcher;\n }\n\n let _parent: any = window;\n for (let i = 0; i < 20; i++) {\n try {\n if (_parent == _parent.parent) {\n globalThis.gSwitcher = new Switcher;\n return globalThis.gSwitcher;\n }\n _parent = _parent.parent;\n\n if (_parent && _parent[\"gSwitcher\"]) {\n console.warn(\"found implementation on parent\");\n globalThis.gSwitcher = _parent[\"gSwitcher\"];\n return _parent[\"gSwitcher\"];\n }\n } catch (e) {\n globalThis.gSwitcher = new Switcher;\n return globalThis.gSwitcher;\n }\n }\n\n throw \"unreachable\";\n}\nfindSwitcher();\n\nexport function SetTransport(name: string, ...config: any[]) {\n let switcher = findSwitcher();\n switcher.active = new ((0, eval)(name))(...config);\n switcher.channel.postMessage({ type: \"set\", data: { name, config } });\n}\n\nexport function SetSingletonTransport(client: BareTransport) {\n let switcher = findSwitcher();\n switcher.active = client;\n switcher.channel.postMessage({ type: \"setremote\" });\n}\n","/*\n * WebSocket helpers\n */\n\nconst validChars =\n \"!#$%&'*+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz|~\";\n\nexport function validProtocol(protocol: string): boolean {\n for (let i = 0; i < protocol.length; i++) {\n const char = protocol[i];\n\n if (!validChars.includes(char)) {\n return false;\n }\n }\n\n return true;\n}\n","import { BareHeaders, maxRedirects } from './BareTypes';\nimport { findSwitcher } from './Switcher';\nimport { WebSocketFields } from './snapshot.js';\nimport { validProtocol } from './webSocket';\n\n\n// get the unhooked value\nconst getRealReadyState = Object.getOwnPropertyDescriptor(\n WebSocket.prototype,\n 'readyState'\n)!.get!;\n\nconst wsProtocols = ['ws:', 'wss:'];\nconst statusEmpty = [101, 204, 205, 304];\n\nconst statusRedirect = [301, 302, 303, 307, 308];\n\nexport type WebSocketImpl = {\n new(...args: ConstructorParameters): WebSocket;\n};\n\nexport namespace BareWebSocket {\n export type GetReadyStateCallback = () => number;\n export type GetSendErrorCallback = () => Error | undefined;\n export type GetProtocolCallback = () => string;\n export type HeadersType = BareHeaders | Headers | undefined;\n export type HeadersProvider =\n | BareHeaders\n | (() => BareHeaders | Promise);\n\n export interface Options {\n /**\n * A provider of request headers to pass to the remote.\n * Usually one of `User-Agent`, `Origin`, and `Cookie`\n * Can be just the headers object or an synchronous/asynchronous function that returns the headers object\n */\n headers?: BareWebSocket.HeadersProvider;\n /**\n * A hook executed by this function with helper arguments for hooking the readyState property. If a hook isn't provided, bare-client will hook the property on the instance. Hooking it on an instance basis is good for small projects, but ideally the class should be hooked by the user of bare-client.\n */\n readyStateHook?:\n | ((\n socket: WebSocket,\n getReadyState: BareWebSocket.GetReadyStateCallback\n ) => void)\n | undefined;\n /**\n * A hook executed by this function with helper arguments for determining if the send function should throw an error. If a hook isn't provided, bare-client will hook the function on the instance.\n */\n sendErrorHook?:\n | ((\n socket: WebSocket,\n getSendError: BareWebSocket.GetSendErrorCallback\n ) => void)\n | undefined;\n /**\n * A hook executed by this function with the URL. If a hook isn't provided, bare-client will hook the URL.\n */\n urlHook?: ((socket: WebSocket, url: URL) => void) | undefined;\n /**\n * A hook executed by this function with a helper for getting the current fake protocol. If a hook isn't provided, bare-client will hook the protocol.\n */\n protocolHook?:\n | ((\n socket: WebSocket,\n getProtocol: BareWebSocket.GetProtocolCallback\n ) => void)\n | undefined;\n /**\n * A callback executed by this function with an array of cookies. This is called once the metadata from the server is received.\n */\n setCookiesCallback?: ((setCookies: string[]) => void) | undefined;\n webSocketImpl?: WebSocket;\n }\n}\n\n/**\n * A Response with additional properties.\n */\nexport interface BareResponse extends Response {\n rawResponse: Response;\n rawHeaders: BareHeaders;\n}\n/**\n * A BareResponse with additional properties.\n */\nexport interface BareResponseFetch extends BareResponse {\n finalURL: string;\n}\nexport class BareClient {\n\n /**\n * Create a BareClient. Calls to fetch and connect will wait for an implementation to be ready.\n */\n constructor() { }\n\n createWebSocket(\n remote: string | URL,\n protocols: string | string[] | undefined = [],\n webSocketImpl: WebSocketImpl,\n requestHeaders: BareHeaders,\n arrayBufferImpl: typeof ArrayBuffer,\n ): WebSocket {\n let switcher = findSwitcher();\n let client = switcher.active;\n if (!client) throw \"invalid switcher\";\n\n if (!client.ready)\n throw new TypeError(\n 'You need to wait for the client to finish fetching the manifest before creating any WebSockets. Try caching the manifest data before making this request.'\n );\n\n try {\n remote = new URL(remote);\n } catch (err) {\n throw new DOMException(\n `Faiiled to construct 'WebSocket': The URL '${remote}' is invalid.`\n );\n }\n\n if (!wsProtocols.includes(remote.protocol))\n throw new DOMException(\n `Failed to construct 'WebSocket': The URL's scheme must be either 'ws' or 'wss'. '${remote.protocol}' is not allowed.`\n );\n\n if (!Array.isArray(protocols)) protocols = [protocols];\n\n protocols = protocols.map(String);\n\n for (const proto of protocols)\n if (!validProtocol(proto))\n throw new DOMException(\n `Failed to construct 'WebSocket': The subprotocol '${proto}' is invalid.`\n );\n\n\n let wsImpl = (webSocketImpl || WebSocket) as WebSocketImpl;\n const socket = new wsImpl(\"wss:null\", protocols);\n\n let fakeProtocol = '';\n\n let fakeReadyState: number = WebSocketFields.CONNECTING;\n\n let initialErrorHappened = false;\n socket.addEventListener(\"error\", (e) => {\n if (!initialErrorHappened) {\n fakeReadyState = WebSocket.CONNECTING;\n e.stopImmediatePropagation();\n initialErrorHappened = true;\n }\n });\n let initialCloseHappened = false;\n socket.addEventListener(\"close\", (e) => {\n if (!initialCloseHappened) {\n e.stopImmediatePropagation();\n initialCloseHappened = true;\n }\n });\n // TODO socket onerror will be broken\n\n arrayBufferImpl = arrayBufferImpl || webSocketImpl.constructor.constructor(\"return ArrayBuffer\")().prototype;\n requestHeaders['Host'] = (new URL(remote)).host;\n // requestHeaders['Origin'] = origin;\n requestHeaders['Pragma'] = 'no-cache';\n requestHeaders['Cache-Control'] = 'no-cache';\n requestHeaders['Upgrade'] = 'websocket';\n // requestHeaders['User-Agent'] = navigator.userAgent;\n requestHeaders['Connection'] = 'Upgrade';\n const sendData = client.connect(\n remote,\n origin,\n protocols,\n requestHeaders,\n (protocol: string) => {\n fakeReadyState = WebSocketFields.OPEN;\n fakeProtocol = protocol;\n\n (socket as any).meta = {\n headers: {\n \"sec-websocket-protocol\": protocol,\n }\n }; // what the fuck is a meta\n socket.dispatchEvent(new Event(\"open\"));\n },\n async (payload) => {\n if (typeof payload === \"string\") {\n socket.dispatchEvent(new MessageEvent(\"message\", { data: payload }));\n } else if (\"byteLength\" in payload) {\n if (socket.binaryType === \"blob\") {\n payload = new Blob([payload]);\n } else {\n Object.setPrototypeOf(payload, arrayBufferImpl);\n }\n\n socket.dispatchEvent(new MessageEvent(\"message\", { data: payload }));\n } else if (\"arrayBuffer\" in payload) {\n if (socket.binaryType === \"arraybuffer\") {\n payload = await payload.arrayBuffer()\n Object.setPrototypeOf(payload, arrayBufferImpl);\n console.log(payload);\n }\n\n socket.dispatchEvent(new MessageEvent(\"message\", { data: payload }));\n }\n },\n (code, reason) => {\n fakeReadyState = WebSocketFields.CLOSED;\n socket.dispatchEvent(new CloseEvent(\"close\", { code, reason }));\n },\n () => {\n fakeReadyState = WebSocketFields.CLOSED;\n },\n )\n\n // const socket = this.client.connect(\n // remote,\n // protocols,\n // async () => {\n // const resolvedHeaders =\n // typeof options.headers === 'function'\n // ? await options.headers()\n // : options.headers || {};\n //\n // const requestHeaders: BareHeaders =\n // resolvedHeaders instanceof Headers\n // ? Object.fromEntries(resolvedHeaders)\n // : resolvedHeaders;\n //\n // // user is expected to specify user-agent and origin\n // // both are in spec\n //\n //\n // return requestHeaders;\n // },\n // (meta) => {\n // fakeProtocol = meta.protocol;\n // if (options.setCookiesCallback)\n // options.setCookiesCallback(meta.setCookies);\n // },\n // (readyState) => {\n // fakeReadyState = readyState;\n // },\n // options.webSocketImpl || WebSocket\n // );\n\n // protocol is always an empty before connecting\n // updated when we receive the metadata\n // this value doesn't change when it's CLOSING or CLOSED etc\n const getReadyState = () => {\n const realReadyState = getRealReadyState.call(socket);\n // readyState should only be faked when the real readyState is OPEN\n return realReadyState === WebSocketFields.OPEN\n ? fakeReadyState\n : realReadyState;\n };\n\n // we have to hook .readyState ourselves\n\n Object.defineProperty(socket, 'readyState', {\n get: getReadyState,\n configurable: true,\n enumerable: true,\n });\n\n /**\n * @returns The error that should be thrown if send() were to be called on this socket according to the fake readyState value\n */\n const getSendError = () => {\n const readyState = getReadyState();\n\n if (readyState === WebSocketFields.CONNECTING)\n return new DOMException(\n \"Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.\"\n );\n };\n\n // we have to hook .send ourselves\n // use ...args to avoid giving the number of args a quantity\n // no arguments will trip the following error: TypeError: Failed to execute 'send' on 'WebSocket': 1 argument required, but only 0 present.\n socket.send = function(...args) {\n const error = getSendError();\n\n if (error) throw error;\n sendData(args[0] as any);\n };\n\n Object.defineProperty(socket, 'url', {\n get: () => remote.toString(),\n configurable: true,\n enumerable: true,\n });\n\n const getProtocol = () => fakeProtocol;\n\n Object.defineProperty(socket, 'protocol', {\n get: getProtocol,\n configurable: true,\n enumerable: true,\n });\n\n return socket;\n }\n\n async fetch(\n url: string | URL,\n init?: RequestInit\n ): Promise {\n // Only create an instance of Request to parse certain parameters of init such as method, headers, redirect\n // But use init values whenever possible\n const req = new Request(url, init);\n\n\n // try to use init.headers because it may contain capitalized headers\n // furthermore, important headers on the Request class are blocked...\n // we should try to preserve the capitalization due to quirks with earlier servers\n const inputHeaders = init?.headers || req.headers;\n\n const headers: BareHeaders =\n inputHeaders instanceof Headers\n ? Object.fromEntries(inputHeaders)\n : (inputHeaders as BareHeaders);\n\n\n const body = init?.body || req.body;\n\n let urlO = new URL(req.url);\n\n if (urlO.protocol.startsWith('blob:')) {\n const response = await fetch(urlO);\n const result: Response & Partial = new Response(\n response.body,\n response\n );\n\n result.rawHeaders = Object.fromEntries(response.headers);\n result.rawResponse = response;\n\n return result as BareResponseFetch;\n }\n\n let switcher = findSwitcher();\n if (!switcher.active) throw \"there are no bare clients\";\n const client = switcher.active;\n if (!client.ready) await client.init();\n\n for (let i = 0; ; i++) {\n if ('host' in headers) headers.host = urlO.host;\n else headers.Host = urlO.host;\n\n\n let resp = await client.request(\n urlO,\n req.method,\n body,\n headers,\n req.signal\n );\n\n let responseobj: BareResponse & Partial = new Response(\n statusEmpty.includes(resp.status) ? undefined : resp.body, {\n headers: new Headers(resp.headers as HeadersInit),\n status: resp.status,\n statusText: resp.statusText,\n }) as BareResponse;\n responseobj.rawHeaders = resp.headers;\n responseobj.rawResponse = new Response(resp.body);\n\n\n responseobj.finalURL = urlO.toString();\n\n const redirect = init?.redirect || req.redirect;\n\n if (statusRedirect.includes(responseobj.status)) {\n switch (redirect) {\n case 'follow': {\n const location = responseobj.headers.get('location');\n if (maxRedirects > i && location !== null) {\n urlO = new URL(location, urlO);\n continue;\n } else throw new TypeError('Failed to fetch');\n }\n case 'error':\n throw new TypeError('Failed to fetch');\n case 'manual':\n return responseobj as BareResponseFetch;\n }\n } else {\n return responseobj as BareResponseFetch;\n }\n }\n }\n}\n"],"names":[],"mappings":"AA+CO,MAAM,YAAY,GAAG;;AC/C5B;AACA;AAEO,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC;AAC/B,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;AACvC,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;AACnC,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC;AAG/B,MAAA,eAAe,GAAG;AAC7B,IAAA,SAAS,EAAE;AACT,QAAA,IAAI,EAAE,SAAS,CAAC,SAAS,CAAC,IAAI;AAC/B,KAAA;IACD,MAAM,EAAE,SAAS,CAAC,MAAM;IACxB,OAAO,EAAE,SAAS,CAAC,OAAO;IAC1B,UAAU,EAAE,SAAS,CAAC,UAAU;IAChC,IAAI,EAAE,SAAS,CAAC,IAAI;;;ACdtB,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;AAC3B,OAAO,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;AAoBjD,MAAM,QAAQ,CAAA;IACZ,MAAM,GAAyB,IAAI,CAAC;AAEpC,IAAA,OAAO,GAAG,IAAI,gBAAgB,CAAC,UAAU,CAAC,CAAC;AAE3C,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAI;YACpE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,eAAe,IAAI,UAAU,CAAC,CAAC;YACvD,QAAQ,IAAI;AACV,gBAAA,KAAK,WAAW;;oBAEd,MAAM;AACR,gBAAA,KAAK,KAAK;AACR,oBAAA,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;AAC9B,oBAAA,IAAI,CAAC,MAAM,GAAG,KAAK,IAAI,IAAI,EAAE,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC;oBAC/C,MAAM;aACT;AACH,SAAC,CAAC,CAAC;KACJ;AACF,CAAA;SAEe,YAAY,GAAA;IAC1B,IAAI,UAAU,CAAC,SAAS;QAAE,OAAO,UAAU,CAAC,SAAS,CAAC;AACtD,IAAA,IAAI,0BAA0B,IAAI,UAAU,EAAE;AAC5C,QAAA,UAAU,CAAC,SAAS,GAAG,IAAI,QAAQ,CAAC;QACpC,OAAO,UAAU,CAAC,SAAS,CAAC;KAC7B;IAED,IAAI,OAAO,GAAQ,MAAM,CAAC;AAC1B,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;AAC3B,QAAA,IAAI;AACF,YAAA,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE;AAC7B,gBAAA,UAAU,CAAC,SAAS,GAAG,IAAI,QAAQ,CAAC;gBACpC,OAAO,UAAU,CAAC,SAAS,CAAC;aAC7B;AACD,YAAA,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;AAEzB,YAAA,IAAI,OAAO,IAAI,OAAO,CAAC,WAAW,CAAC,EAAE;AACnC,gBAAA,OAAO,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;AAC/C,gBAAA,UAAU,CAAC,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AAC5C,gBAAA,OAAO,OAAO,CAAC,WAAW,CAAC,CAAC;aAC7B;SACF;QAAC,OAAO,CAAC,EAAE;AACV,YAAA,UAAU,CAAC,SAAS,GAAG,IAAI,QAAQ,CAAC;YACpC,OAAO,UAAU,CAAC,SAAS,CAAC;SAC7B;KACF;AAED,IAAA,MAAM,aAAa,CAAC;AACtB,CAAC;AACD,YAAY,EAAE,CAAC;SAEC,YAAY,CAAC,IAAY,EAAE,GAAG,MAAa,EAAA;AACzD,IAAA,IAAI,QAAQ,GAAG,YAAY,EAAE,CAAC;AAC9B,IAAA,QAAQ,CAAC,MAAM,GAAG,KAAK,IAAI,IAAI,EAAE,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC;AACnD,IAAA,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;AACxE,CAAC;AAEK,SAAU,qBAAqB,CAAC,MAAqB,EAAA;AACzD,IAAA,IAAI,QAAQ,GAAG,YAAY,EAAE,CAAC;AAC9B,IAAA,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;AACtD;;ACrFA;;AAEG;AAEH,MAAM,UAAU,GACd,+EAA+E,CAAC;AAE5E,SAAU,aAAa,CAAC,QAAgB,EAAA;AAC5C,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACxC,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAEzB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AAC9B,YAAA,OAAO,KAAK,CAAC;SACd;KACF;AAED,IAAA,OAAO,IAAI,CAAC;AACd;;ACXA;AACA,MAAM,iBAAiB,GAAG,MAAM,CAAC,wBAAwB,CACvD,SAAS,CAAC,SAAS,EACnB,YAAY,CACZ,CAAC,GAAI,CAAC;AAER,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AACpC,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAEzC,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;MA0EpC,UAAU,CAAA;AAErB;;AAEG;AACH,IAAA,WAAA,GAAA,GAAiB;IAEjB,eAAe,CACb,MAAoB,EACpB,SAA2C,GAAA,EAAE,EAC7C,aAA4B,EAC5B,cAA2B,EAC3B,eAAmC,EAAA;AAEnC,QAAA,IAAI,QAAQ,GAAG,YAAY,EAAE,CAAC;AAC9B,QAAA,IAAI,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;AAC7B,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,MAAM,kBAAkB,CAAC;QAEtC,IAAI,CAAC,MAAM,CAAC,KAAK;AACf,YAAA,MAAM,IAAI,SAAS,CACjB,2JAA2J,CAC5J,CAAC;AAEJ,QAAA,IAAI;AACF,YAAA,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;SAC1B;QAAC,OAAO,GAAG,EAAE;AACZ,YAAA,MAAM,IAAI,YAAY,CACpB,8CAA8C,MAAM,CAAA,aAAA,CAAe,CACpE,CAAC;SACH;QAED,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC;YACxC,MAAM,IAAI,YAAY,CACpB,CAAA,iFAAA,EAAoF,MAAM,CAAC,QAAQ,CAAmB,iBAAA,CAAA,CACvH,CAAC;AAEJ,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;AAAE,YAAA,SAAS,GAAG,CAAC,SAAS,CAAC,CAAC;AAEvD,QAAA,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAElC,KAAK,MAAM,KAAK,IAAI,SAAS;AAC3B,YAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;AACvB,gBAAA,MAAM,IAAI,YAAY,CACpB,qDAAqD,KAAK,CAAA,aAAA,CAAe,CAC1E,CAAC;AAGN,QAAA,IAAI,MAAM,IAAI,aAAa,IAAI,SAAS,CAAkB,CAAC;QAC3D,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAEjD,IAAI,YAAY,GAAG,EAAE,CAAC;AAEtB,QAAA,IAAI,cAAc,GAAW,eAAe,CAAC,UAAU,CAAC;QAExD,IAAI,oBAAoB,GAAG,KAAK,CAAC;QACjC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,KAAI;YACrC,IAAI,CAAC,oBAAoB,EAAE;AACzB,gBAAA,cAAc,GAAG,SAAS,CAAC,UAAU,CAAC;gBACtC,CAAC,CAAC,wBAAwB,EAAE,CAAC;gBAC7B,oBAAoB,GAAG,IAAI,CAAC;aAC7B;AACH,SAAC,CAAC,CAAC;QACH,IAAI,oBAAoB,GAAG,KAAK,CAAC;QACjC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,KAAI;YACrC,IAAI,CAAC,oBAAoB,EAAE;gBACzB,CAAC,CAAC,wBAAwB,EAAE,CAAC;gBAC7B,oBAAoB,GAAG,IAAI,CAAC;aAC7B;AACH,SAAC,CAAC,CAAC;;AAGH,QAAA,eAAe,GAAG,eAAe,IAAI,aAAa,CAAC,WAAW,CAAC,WAAW,CAAC,oBAAoB,CAAC,EAAE,CAAC,SAAS,CAAC;AAC7G,QAAA,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC;;AAEhD,QAAA,cAAc,CAAC,QAAQ,CAAC,GAAG,UAAU,CAAC;AACtC,QAAA,cAAc,CAAC,eAAe,CAAC,GAAG,UAAU,CAAC;AAC7C,QAAA,cAAc,CAAC,SAAS,CAAC,GAAG,WAAW,CAAC;;AAExC,QAAA,cAAc,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC;AACzC,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAC7B,MAAM,EACN,MAAM,EACN,SAAS,EACT,cAAc,EACd,CAAC,QAAgB,KAAI;AACnB,YAAA,cAAc,GAAG,eAAe,CAAC,IAAI,CAAC;YACtC,YAAY,GAAG,QAAQ,CAAC;YAEvB,MAAc,CAAC,IAAI,GAAG;AACrB,gBAAA,OAAO,EAAE;AACP,oBAAA,wBAAwB,EAAE,QAAQ;AACnC,iBAAA;AACF,aAAA,CAAC;YACF,MAAM,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AAC1C,SAAC,EACD,OAAO,OAAO,KAAI;AAChB,YAAA,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AAC/B,gBAAA,MAAM,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;aACtE;AAAM,iBAAA,IAAI,YAAY,IAAI,OAAO,EAAE;AAClC,gBAAA,IAAI,MAAM,CAAC,UAAU,KAAK,MAAM,EAAE;oBAChC,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;iBAC/B;qBAAM;AACL,oBAAA,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;iBACjD;AAED,gBAAA,MAAM,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;aACtE;AAAM,iBAAA,IAAI,aAAa,IAAI,OAAO,EAAE;AACnC,gBAAA,IAAI,MAAM,CAAC,UAAU,KAAK,aAAa,EAAE;AACvC,oBAAA,OAAO,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,CAAA;AACrC,oBAAA,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;AAChD,oBAAA,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;iBACtB;AAED,gBAAA,MAAM,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;aACtE;AACH,SAAC,EACD,CAAC,IAAI,EAAE,MAAM,KAAI;AACf,YAAA,cAAc,GAAG,eAAe,CAAC,MAAM,CAAC;AACxC,YAAA,MAAM,CAAC,aAAa,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;SACjE,EACD,MAAK;AACH,YAAA,cAAc,GAAG,eAAe,CAAC,MAAM,CAAC;AAC1C,SAAC,CACF,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAoCD,MAAM,aAAa,GAAG,MAAK;YACzB,MAAM,cAAc,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;;AAEtD,YAAA,OAAO,cAAc,KAAK,eAAe,CAAC,IAAI;AAC5C,kBAAE,cAAc;kBACd,cAAc,CAAC;AACrB,SAAC,CAAC;;AAIF,QAAA,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE;AAC1C,YAAA,GAAG,EAAE,aAAa;AAClB,YAAA,YAAY,EAAE,IAAI;AAClB,YAAA,UAAU,EAAE,IAAI;AACjB,SAAA,CAAC,CAAC;AAEH;;AAEG;QACH,MAAM,YAAY,GAAG,MAAK;AACxB,YAAA,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;AAEnC,YAAA,IAAI,UAAU,KAAK,eAAe,CAAC,UAAU;AAC3C,gBAAA,OAAO,IAAI,YAAY,CACrB,qEAAqE,CACtE,CAAC;AACN,SAAC,CAAC;;;;AAKF,QAAA,MAAM,CAAC,IAAI,GAAG,UAAS,GAAG,IAAI,EAAA;AAC5B,YAAA,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;AAE7B,YAAA,IAAI,KAAK;AAAE,gBAAA,MAAM,KAAK,CAAC;AACvB,YAAA,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAQ,CAAC,CAAC;AAC3B,SAAC,CAAC;AAEF,QAAA,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE;AACnC,YAAA,GAAG,EAAE,MAAM,MAAM,CAAC,QAAQ,EAAE;AAC5B,YAAA,YAAY,EAAE,IAAI;AAClB,YAAA,UAAU,EAAE,IAAI;AACjB,SAAA,CAAC,CAAC;AAEH,QAAA,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC;AAEvC,QAAA,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE;AACxC,YAAA,GAAG,EAAE,WAAW;AAChB,YAAA,YAAY,EAAE,IAAI;AAClB,YAAA,UAAU,EAAE,IAAI;AACjB,SAAA,CAAC,CAAC;AAEH,QAAA,OAAO,MAAM,CAAC;KACf;AAED,IAAA,MAAM,KAAK,CACT,GAAiB,EACjB,IAAkB,EAAA;;;QAIlB,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;;;;QAMnC,MAAM,YAAY,GAAG,IAAI,EAAE,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC;AAElD,QAAA,MAAM,OAAO,GACX,YAAY,YAAY,OAAO;AAC7B,cAAE,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC;cAC/B,YAA4B,CAAC;QAGpC,MAAM,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC;QAEpC,IAAI,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAE5B,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;AACrC,YAAA,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,MAAM,GAAqC,IAAI,QAAQ,CAC3D,QAAQ,CAAC,IAAI,EACb,QAAQ,CACT,CAAC;YAEF,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACzD,YAAA,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAC;AAE9B,YAAA,OAAO,MAA2B,CAAC;SACpC;AAED,QAAA,IAAI,QAAQ,GAAG,YAAY,EAAE,CAAC;QAC9B,IAAI,CAAC,QAAQ,CAAC,MAAM;AAAE,YAAA,MAAM,2BAA2B,CAAC;AACxD,QAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,KAAK;AAAE,YAAA,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QAEvC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAI,CAAC,EAAE,EAAE;YACrB,IAAI,MAAM,IAAI,OAAO;AAAE,gBAAA,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;;AAC3C,gBAAA,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YAG9B,IAAI,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAC7B,IAAI,EACJ,GAAG,CAAC,MAAM,EACV,IAAI,EACJ,OAAO,EACP,GAAG,CAAC,MAAM,CACX,CAAC;YAEF,IAAI,WAAW,GAA8C,IAAI,QAAQ,CACvE,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE;AAC3D,gBAAA,OAAO,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,OAAsB,CAAC;gBACjD,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,UAAU,EAAE,IAAI,CAAC,UAAU;AAC5B,aAAA,CAAiB,CAAC;AACnB,YAAA,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC;YACtC,WAAW,CAAC,WAAW,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAGlD,YAAA,WAAW,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAEvC,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC;YAEhD,IAAI,cAAc,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE;gBAC/C,QAAQ,QAAQ;oBACd,KAAK,QAAQ,EAAE;wBACb,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;wBACrD,IAAI,YAAY,GAAG,CAAC,IAAI,QAAQ,KAAK,IAAI,EAAE;4BACzC,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;4BAC/B,SAAS;yBACV;;AAAM,4BAAA,MAAM,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAC;qBAC/C;AACD,oBAAA,KAAK,OAAO;AACV,wBAAA,MAAM,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAC;AACzC,oBAAA,KAAK,QAAQ;AACX,wBAAA,OAAO,WAAgC,CAAC;iBAC3C;aACF;iBAAM;AACL,gBAAA,OAAO,WAAgC,CAAC;aACzC;SACF;KACF;AACF;;;;"} \ No newline at end of file +{"version":3,"file":"index.js","sources":["../src/BareTypes.ts","../src/snapshot.ts","../src/RemoteClient.ts","../src/Switcher.ts","../src/webSocket.ts","../src/BareClient.ts"],"sourcesContent":["export type BareHeaders = Record;\n\nexport type BareMeta =\n {\n // ???\n };\n\nexport type TransferrableResponse =\n {\n body: ReadableStream | ArrayBuffer | Blob | string,\n headers: BareHeaders,\n status: number,\n statusText: string\n }\n\nexport interface BareTransport {\n init: () => Promise;\n ready: boolean;\n connect: (\n url: URL,\n origin: string,\n protocols: string[],\n requestHeaders: BareHeaders,\n onopen: (protocol: string) => void,\n onmessage: (data: Blob | ArrayBuffer | string) => void,\n onclose: (code: number, reason: string) => void,\n onerror: (error: string) => void,\n ) => (data: Blob | ArrayBuffer | string) => void;\n\n request: (\n remote: URL,\n method: string,\n body: BodyInit | null,\n headers: BareHeaders,\n signal: AbortSignal | undefined\n ) => Promise;\n\n meta: () => BareMeta\n}\nexport interface BareWebSocketMeta {\n protocol: string;\n setCookies: string[];\n}\n\nexport type BareHTTPProtocol = 'blob:' | 'http:' | 'https:' | string;\nexport type BareWSProtocol = 'ws:' | 'wss:' | string;\n\nexport const maxRedirects = 20;\n\n\n","// The user likely has overwritten all networking functions after importing bare-client\n// It is our responsibility to make sure components of Bare-Client are using native networking functions\n\nexport const fetch = globalThis.fetch;\nexport const WebSocket = globalThis.WebSocket;\nexport const Request = globalThis.Request;\nexport const Response = globalThis.Response;\nexport const XMLHttpRequest = globalThis.XMLHttpRequest;\n\nexport const WebSocketFields = {\n prototype: {\n send: WebSocket.prototype.send,\n },\n CLOSED: WebSocket.CLOSED,\n CLOSING: WebSocket.CLOSING,\n CONNECTING: WebSocket.CONNECTING,\n OPEN: WebSocket.OPEN,\n};\n","/// \nimport { v4 as uuid } from 'uuid';\nimport { BareHeaders, BareTransport, TransferrableResponse } from './BareTypes';\nimport { findSwitcher } from './Switcher';\n\nexport function registerRemoteListener(channel: ServiceWorker) {\n (navigator as any).serviceWorker.addEventListener(\"message\", async ({ data }) => {\n if (data.type === \"request\") {\n const { remote, method, body, headers } = data;\n\n let response: any = await findSwitcher().active?.request(new URL(remote), method, body, headers, undefined)!;\n let transferred: any = [];\n if (response.body instanceof ArrayBuffer || response.body instanceof Blob || response.body instanceof ReadableStream) {\n transferred.push(response.body);\n }\n response.id = data.id;\n response.type = \"response\";\n channel.postMessage(response, transferred);\n }\n });\n}\n\ndeclare var self: ServiceWorkerGlobalScope;\nlet remote: RemoteTransport;\nif (\"ServiceWorkerGlobalScope\" in self) {\n addEventListener(\"message\", async ({ data }) => {\n if (data.type === \"response\") {\n let resolve = remote.promises.get(data.id);\n if (resolve) {\n resolve(data);\n remote.promises.delete(data.id);\n }\n }\n });\n}\n\nexport default class RemoteTransport implements BareTransport {\n canstart = true;\n ready = false;\n promises = new Map void>();\n constructor() {\n if (!(\"ServiceWorkerGlobalScope\" in self)) {\n throw new TypeError(\"Attempt to construct RemoteClient from outside a service worker\")\n }\n }\n\n async init() {\n remote = this;\n this.ready = true;\n }\n\n async meta() { }\n async request(\n remote: URL,\n method: string,\n body: BodyInit | null,\n headers: BareHeaders,\n signal: AbortSignal | undefined\n ): Promise {\n let id = uuid();\n const clients = await self.clients.matchAll();\n if (clients.length < 1)\n throw new Error(\"no available clients\");\n\n for (const client of clients) {\n client.postMessage({\n type: \"request\",\n id,\n remote: remote.toString(),\n method,\n body,\n headers\n });\n }\n\n\n return await new Promise((resolve, reject) => {\n this.promises.set(id, resolve);\n });\n }\n\n connect(\n url: URL,\n origin: string,\n protocols: string[],\n requestHeaders: BareHeaders,\n onopen: (protocol: string) => void,\n onmessage: (data: Blob | ArrayBuffer | string) => void,\n onclose: (code: number, reason: string) => void,\n onerror: (error: string) => void\n ): (data: Blob | ArrayBuffer | string) => void {\n throw \"why are you calling connect from remoteclient\"\n }\n}\n//\n// declare const self: ServiceWorkerGlobalScope;\n// export default class RemoteClient extends Client {\n// static singleton: RemoteClient;\n// private callbacks: Record) => void> = {};\n//\n// private uid = uuid();\n// constructor() {\n// if (RemoteClient.singleton) return RemoteClient.singleton;\n// super();\n// // this should be fine\n// // if (!(\"ServiceWorkerGlobalScope\" in self)) {\n// // throw new TypeError(\"Attempt to construct RemoteClient from outside a service worker\")\n// // }\n//\n// addEventListener(\"message\", (event) => {\n// if (event.data.__remote_target === this.uid) {\n// const callback = this.callbacks[event.data.__remote_id];\n// callback(event.data.__remote_value);\n// }\n// });\n//\n// RemoteClient.singleton = this;\n// }\n//\n// async send(message: Record, id?: string) {\n// const clients = await self.clients.matchAll();\n// if (clients.length < 1)\n// throw new Error(\"no available clients\");\n//\n// for (const client of clients) {\n// client.postMessage({\n// __remote_target: this.uid,\n// __remote_id: id,\n// __remote_value: message\n// })\n// }\n//\n// }\n//\n// async sendWithResponse(message: Record): Promise {\n// const id = uuid();\n// return new Promise((resolve) => {\n// this.callbacks[id] = resolve;\n// this.send(message, id);\n// });\n// }\n//\n// connect(\n// ...args: any\n// ) {\n// throw \"why are you calling connect from remoteclient\"\n// }\n// async request(\n// method: BareMethod,\n// requestHeaders: BareHeaders,\n// body: BodyInit | null,\n// remote: URL,\n// cache: BareCache | undefined,\n// duplex: string | undefined,\n// signal: AbortSignal | undefined\n// ): Promise {\n//\n// const response = await this.sendWithResponse({\n// type: \"request\",\n// options: {\n// method,\n// requestHeaders,\n// body,\n// remote: remote.toString(),\n// },\n// });\n// // const readResponse = await this.readBareResponse(response);\n//\n// const result: Response & Partial = new Response(\n// statusEmpty.includes(response.status!) ? undefined : response.body,\n// {\n// status: response.status,\n// statusText: response.statusText ?? undefined,\n// headers: new Headers(response.headers as HeadersInit),\n// }\n// );\n//\n// result.rawHeaders = response.rawHeaders;\n// result.rawResponse = response;\n//\n// return result as BareResponse;\n// }\n// }\n","import { BareTransport } from \"./BareTypes\";\nimport RemoteTransport from \"./RemoteClient\";\n\nself.BCC_VERSION = \"3.0.4\";\nconsole.warn(\"BCC_VERSION: \" + self.BCC_VERSION);\n\ndeclare global {\n interface ServiceWorkerGlobalScope {\n gSwitcher: Switcher;\n BCC_VERSION: string;\n BCC_DEBUG: boolean;\n }\n interface WorkerGlobalScope {\n gSwitcher: Switcher;\n BCC_VERSION: string;\n BCC_DEBUG: boolean;\n }\n interface Window {\n gSwitcher: Switcher;\n BCC_VERSION: string;\n BCC_DEBUG: boolean;\n }\n}\n\nclass Switcher {\n active: BareTransport | null = null;\n\n channel = new BroadcastChannel(\"bare-mux\");\n\n constructor() {\n this.channel.addEventListener(\"message\", ({ data: { type, data } }) => {\n console.log(type, data, \"ServiceWorker\" in globalThis);\n switch (type) {\n case \"setremote\":\n this.active = new RemoteTransport\n break;\n case \"set\":\n const { name, config } = data;\n this.active = new ((0, eval)(name))(...config);\n break;\n }\n });\n }\n}\n\nexport function findSwitcher(): Switcher {\n if (globalThis.gSwitcher) return globalThis.gSwitcher;\n if (\"ServiceWorkerGlobalScope\" in globalThis) {\n globalThis.gSwitcher = new Switcher;\n return globalThis.gSwitcher;\n }\n\n let _parent: any = window;\n for (let i = 0; i < 20; i++) {\n try {\n if (_parent == _parent.parent) {\n globalThis.gSwitcher = new Switcher;\n return globalThis.gSwitcher;\n }\n _parent = _parent.parent;\n\n if (_parent && _parent[\"gSwitcher\"]) {\n console.warn(\"found implementation on parent\");\n globalThis.gSwitcher = _parent[\"gSwitcher\"];\n return _parent[\"gSwitcher\"];\n }\n } catch (e) {\n globalThis.gSwitcher = new Switcher;\n return globalThis.gSwitcher;\n }\n }\n\n throw \"unreachable\";\n}\nfindSwitcher();\n\nexport function SetTransport(name: string, ...config: any[]) {\n let switcher = findSwitcher();\n switcher.active = new ((0, eval)(name))(...config);\n switcher.channel.postMessage({ type: \"set\", data: { name, config } });\n}\n\nexport function SetSingletonTransport(client: BareTransport) {\n let switcher = findSwitcher();\n switcher.active = client;\n switcher.channel.postMessage({ type: \"setremote\" });\n}\n","/*\n * WebSocket helpers\n */\n\nconst validChars =\n \"!#$%&'*+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz|~\";\n\nexport function validProtocol(protocol: string): boolean {\n for (let i = 0; i < protocol.length; i++) {\n const char = protocol[i];\n\n if (!validChars.includes(char)) {\n return false;\n }\n }\n\n return true;\n}\n","import { BareHeaders, maxRedirects } from './BareTypes';\nimport { findSwitcher } from './Switcher';\nimport { WebSocketFields } from './snapshot.js';\nimport { validProtocol } from './webSocket';\n\n\n// get the unhooked value\nconst getRealReadyState = Object.getOwnPropertyDescriptor(\n WebSocket.prototype,\n 'readyState'\n)!.get!;\n\nconst wsProtocols = ['ws:', 'wss:'];\nconst statusEmpty = [101, 204, 205, 304];\n\nconst statusRedirect = [301, 302, 303, 307, 308];\n\nexport type WebSocketImpl = {\n new(...args: ConstructorParameters): WebSocket;\n};\n\nexport namespace BareWebSocket {\n export type GetReadyStateCallback = () => number;\n export type GetSendErrorCallback = () => Error | undefined;\n export type GetProtocolCallback = () => string;\n export type HeadersType = BareHeaders | Headers | undefined;\n export type HeadersProvider =\n | BareHeaders\n | (() => BareHeaders | Promise);\n\n export interface Options {\n /**\n * A provider of request headers to pass to the remote.\n * Usually one of `User-Agent`, `Origin`, and `Cookie`\n * Can be just the headers object or an synchronous/asynchronous function that returns the headers object\n */\n headers?: BareWebSocket.HeadersProvider;\n /**\n * A hook executed by this function with helper arguments for hooking the readyState property. If a hook isn't provided, bare-client will hook the property on the instance. Hooking it on an instance basis is good for small projects, but ideally the class should be hooked by the user of bare-client.\n */\n readyStateHook?:\n | ((\n socket: WebSocket,\n getReadyState: BareWebSocket.GetReadyStateCallback\n ) => void)\n | undefined;\n /**\n * A hook executed by this function with helper arguments for determining if the send function should throw an error. If a hook isn't provided, bare-client will hook the function on the instance.\n */\n sendErrorHook?:\n | ((\n socket: WebSocket,\n getSendError: BareWebSocket.GetSendErrorCallback\n ) => void)\n | undefined;\n /**\n * A hook executed by this function with the URL. If a hook isn't provided, bare-client will hook the URL.\n */\n urlHook?: ((socket: WebSocket, url: URL) => void) | undefined;\n /**\n * A hook executed by this function with a helper for getting the current fake protocol. If a hook isn't provided, bare-client will hook the protocol.\n */\n protocolHook?:\n | ((\n socket: WebSocket,\n getProtocol: BareWebSocket.GetProtocolCallback\n ) => void)\n | undefined;\n /**\n * A callback executed by this function with an array of cookies. This is called once the metadata from the server is received.\n */\n setCookiesCallback?: ((setCookies: string[]) => void) | undefined;\n webSocketImpl?: WebSocket;\n }\n}\n\n/**\n * A Response with additional properties.\n */\nexport interface BareResponse extends Response {\n rawResponse: Response;\n rawHeaders: BareHeaders;\n}\n/**\n * A BareResponse with additional properties.\n */\nexport interface BareResponseFetch extends BareResponse {\n finalURL: string;\n}\nexport class BareClient {\n\n /**\n * Create a BareClient. Calls to fetch and connect will wait for an implementation to be ready.\n */\n constructor() { }\n\n createWebSocket(\n remote: string | URL,\n protocols: string | string[] | undefined = [],\n webSocketImpl: WebSocketImpl,\n requestHeaders: BareHeaders,\n arrayBufferImpl: typeof ArrayBuffer,\n ): WebSocket {\n let switcher = findSwitcher();\n let client = switcher.active;\n if (!client) throw \"invalid switcher\";\n\n if (!client.ready)\n throw new TypeError(\n 'You need to wait for the client to finish fetching the manifest before creating any WebSockets. Try caching the manifest data before making this request.'\n );\n\n try {\n remote = new URL(remote);\n } catch (err) {\n throw new DOMException(\n `Faiiled to construct 'WebSocket': The URL '${remote}' is invalid.`\n );\n }\n\n if (!wsProtocols.includes(remote.protocol))\n throw new DOMException(\n `Failed to construct 'WebSocket': The URL's scheme must be either 'ws' or 'wss'. '${remote.protocol}' is not allowed.`\n );\n\n if (!Array.isArray(protocols)) protocols = [protocols];\n\n protocols = protocols.map(String);\n\n for (const proto of protocols)\n if (!validProtocol(proto))\n throw new DOMException(\n `Failed to construct 'WebSocket': The subprotocol '${proto}' is invalid.`\n );\n\n\n let wsImpl = (webSocketImpl || WebSocket) as WebSocketImpl;\n const socket = new wsImpl(\"wss:null\", protocols);\n\n let fakeProtocol = '';\n\n let fakeReadyState: number = WebSocketFields.CONNECTING;\n\n let initialErrorHappened = false;\n socket.addEventListener(\"error\", (e) => {\n if (!initialErrorHappened) {\n fakeReadyState = WebSocket.CONNECTING;\n e.stopImmediatePropagation();\n initialErrorHappened = true;\n }\n });\n let initialCloseHappened = false;\n socket.addEventListener(\"close\", (e) => {\n if (!initialCloseHappened) {\n e.stopImmediatePropagation();\n initialCloseHappened = true;\n }\n });\n // TODO socket onerror will be broken\n\n arrayBufferImpl = arrayBufferImpl || webSocketImpl.constructor.constructor(\"return ArrayBuffer\")().prototype;\n requestHeaders['Host'] = (new URL(remote)).host;\n // requestHeaders['Origin'] = origin;\n requestHeaders['Pragma'] = 'no-cache';\n requestHeaders['Cache-Control'] = 'no-cache';\n requestHeaders['Upgrade'] = 'websocket';\n // requestHeaders['User-Agent'] = navigator.userAgent;\n requestHeaders['Connection'] = 'Upgrade';\n const sendData = client.connect(\n remote,\n origin,\n protocols,\n requestHeaders,\n (protocol: string) => {\n fakeReadyState = WebSocketFields.OPEN;\n fakeProtocol = protocol;\n\n (socket as any).meta = {\n headers: {\n \"sec-websocket-protocol\": protocol,\n }\n }; // what the fuck is a meta\n socket.dispatchEvent(new Event(\"open\"));\n },\n async (payload) => {\n if (typeof payload === \"string\") {\n socket.dispatchEvent(new MessageEvent(\"message\", { data: payload }));\n } else if (\"byteLength\" in payload) {\n if (socket.binaryType === \"blob\") {\n payload = new Blob([payload]);\n } else {\n Object.setPrototypeOf(payload, arrayBufferImpl);\n }\n\n socket.dispatchEvent(new MessageEvent(\"message\", { data: payload }));\n } else if (\"arrayBuffer\" in payload) {\n if (socket.binaryType === \"arraybuffer\") {\n payload = await payload.arrayBuffer()\n Object.setPrototypeOf(payload, arrayBufferImpl);\n }\n\n socket.dispatchEvent(new MessageEvent(\"message\", { data: payload }));\n }\n },\n (code, reason) => {\n fakeReadyState = WebSocketFields.CLOSED;\n socket.dispatchEvent(new CloseEvent(\"close\", { code, reason }));\n },\n () => {\n fakeReadyState = WebSocketFields.CLOSED;\n },\n )\n\n // const socket = this.client.connect(\n // remote,\n // protocols,\n // async () => {\n // const resolvedHeaders =\n // typeof options.headers === 'function'\n // ? await options.headers()\n // : options.headers || {};\n //\n // const requestHeaders: BareHeaders =\n // resolvedHeaders instanceof Headers\n // ? Object.fromEntries(resolvedHeaders)\n // : resolvedHeaders;\n //\n // // user is expected to specify user-agent and origin\n // // both are in spec\n //\n //\n // return requestHeaders;\n // },\n // (meta) => {\n // fakeProtocol = meta.protocol;\n // if (options.setCookiesCallback)\n // options.setCookiesCallback(meta.setCookies);\n // },\n // (readyState) => {\n // fakeReadyState = readyState;\n // },\n // options.webSocketImpl || WebSocket\n // );\n\n // protocol is always an empty before connecting\n // updated when we receive the metadata\n // this value doesn't change when it's CLOSING or CLOSED etc\n const getReadyState = () => {\n const realReadyState = getRealReadyState.call(socket);\n // readyState should only be faked when the real readyState is OPEN\n return realReadyState === WebSocketFields.OPEN\n ? fakeReadyState\n : realReadyState;\n };\n\n // we have to hook .readyState ourselves\n\n Object.defineProperty(socket, 'readyState', {\n get: getReadyState,\n configurable: true,\n enumerable: true,\n });\n\n /**\n * @returns The error that should be thrown if send() were to be called on this socket according to the fake readyState value\n */\n const getSendError = () => {\n const readyState = getReadyState();\n\n if (readyState === WebSocketFields.CONNECTING)\n return new DOMException(\n \"Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.\"\n );\n };\n\n // we have to hook .send ourselves\n // use ...args to avoid giving the number of args a quantity\n // no arguments will trip the following error: TypeError: Failed to execute 'send' on 'WebSocket': 1 argument required, but only 0 present.\n socket.send = function(...args) {\n const error = getSendError();\n\n if (error) throw error;\n sendData(args[0] as any);\n };\n\n Object.defineProperty(socket, 'url', {\n get: () => remote.toString(),\n configurable: true,\n enumerable: true,\n });\n\n const getProtocol = () => fakeProtocol;\n\n Object.defineProperty(socket, 'protocol', {\n get: getProtocol,\n configurable: true,\n enumerable: true,\n });\n\n return socket;\n }\n\n async fetch(\n url: string | URL,\n init?: RequestInit\n ): Promise {\n // Only create an instance of Request to parse certain parameters of init such as method, headers, redirect\n // But use init values whenever possible\n const req = new Request(url, init);\n\n\n // try to use init.headers because it may contain capitalized headers\n // furthermore, important headers on the Request class are blocked...\n // we should try to preserve the capitalization due to quirks with earlier servers\n const inputHeaders = init?.headers || req.headers;\n\n const headers: BareHeaders =\n inputHeaders instanceof Headers\n ? Object.fromEntries(inputHeaders)\n : (inputHeaders as BareHeaders);\n\n\n const body = init?.body || req.body;\n\n let urlO = new URL(req.url);\n\n if (urlO.protocol.startsWith('blob:')) {\n const response = await fetch(urlO);\n const result: Response & Partial = new Response(\n response.body,\n response\n );\n\n result.rawHeaders = Object.fromEntries(response.headers);\n result.rawResponse = response;\n\n return result as BareResponseFetch;\n }\n\n let switcher = findSwitcher();\n if (!switcher.active) throw \"there are no bare clients\";\n const client = switcher.active;\n if (!client.ready) await client.init();\n\n for (let i = 0; ; i++) {\n if ('host' in headers) headers.host = urlO.host;\n else headers.Host = urlO.host;\n\n\n let resp = await client.request(\n urlO,\n req.method,\n body,\n headers,\n req.signal\n );\n\n let responseobj: BareResponse & Partial = new Response(\n statusEmpty.includes(resp.status) ? undefined : resp.body, {\n headers: new Headers(resp.headers as HeadersInit),\n status: resp.status,\n statusText: resp.statusText,\n }) as BareResponse;\n responseobj.rawHeaders = resp.headers;\n responseobj.rawResponse = new Response(resp.body);\n\n\n responseobj.finalURL = urlO.toString();\n\n const redirect = init?.redirect || req.redirect;\n\n if (statusRedirect.includes(responseobj.status)) {\n switch (redirect) {\n case 'follow': {\n const location = responseobj.headers.get('location');\n if (maxRedirects > i && location !== null) {\n urlO = new URL(location, urlO);\n continue;\n } else throw new TypeError('Failed to fetch');\n }\n case 'error':\n throw new TypeError('Failed to fetch');\n case 'manual':\n return responseobj as BareResponseFetch;\n }\n } else {\n return responseobj as BareResponseFetch;\n }\n }\n }\n}\n"],"names":["uuid"],"mappings":"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"} \ No newline at end of file diff --git a/src/RemoteClient.ts b/src/RemoteClient.ts index 00451b6..64d03d8 100644 --- a/src/RemoteClient.ts +++ b/src/RemoteClient.ts @@ -1,5 +1,97 @@ -// /// -// import { v4 as uuid } from 'uuid'; +/// +import { v4 as uuid } from 'uuid'; +import { BareHeaders, BareTransport, TransferrableResponse } from './BareTypes'; +import { findSwitcher } from './Switcher'; + +export function registerRemoteListener(channel: ServiceWorker) { + (navigator as any).serviceWorker.addEventListener("message", async ({ data }) => { + if (data.type === "request") { + const { remote, method, body, headers } = data; + + let response: any = await findSwitcher().active?.request(new URL(remote), method, body, headers, undefined)!; + let transferred: any = []; + if (response.body instanceof ArrayBuffer || response.body instanceof Blob || response.body instanceof ReadableStream) { + transferred.push(response.body); + } + response.id = data.id; + response.type = "response"; + channel.postMessage(response, transferred); + } + }); +} + +declare var self: ServiceWorkerGlobalScope; +let remote: RemoteTransport; +if ("ServiceWorkerGlobalScope" in self) { + addEventListener("message", async ({ data }) => { + if (data.type === "response") { + let resolve = remote.promises.get(data.id); + if (resolve) { + resolve(data); + remote.promises.delete(data.id); + } + } + }); +} + +export default class RemoteTransport implements BareTransport { + canstart = true; + ready = false; + promises = new Map void>(); + constructor() { + if (!("ServiceWorkerGlobalScope" in self)) { + throw new TypeError("Attempt to construct RemoteClient from outside a service worker") + } + } + + async init() { + remote = this; + this.ready = true; + } + + async meta() { } + async request( + remote: URL, + method: string, + body: BodyInit | null, + headers: BareHeaders, + signal: AbortSignal | undefined + ): Promise { + let id = uuid(); + const clients = await self.clients.matchAll(); + if (clients.length < 1) + throw new Error("no available clients"); + + for (const client of clients) { + client.postMessage({ + type: "request", + id, + remote: remote.toString(), + method, + body, + headers + }); + } + + + return await new Promise((resolve, reject) => { + this.promises.set(id, resolve); + }); + } + + connect( + url: URL, + origin: string, + protocols: string[], + requestHeaders: BareHeaders, + onopen: (protocol: string) => void, + onmessage: (data: Blob | ArrayBuffer | string) => void, + onclose: (code: number, reason: string) => void, + onerror: (error: string) => void + ): (data: Blob | ArrayBuffer | string) => void { + throw "why are you calling connect from remoteclient" + } +} // // declare const self: ServiceWorkerGlobalScope; // export default class RemoteClient extends Client { diff --git a/src/Switcher.ts b/src/Switcher.ts index 87a4f69..2012a12 100644 --- a/src/Switcher.ts +++ b/src/Switcher.ts @@ -1,6 +1,7 @@ import { BareTransport } from "./BareTypes"; +import RemoteTransport from "./RemoteClient"; -self.BCC_VERSION = "3.0.2"; +self.BCC_VERSION = "3.0.4"; console.warn("BCC_VERSION: " + self.BCC_VERSION); declare global { @@ -31,7 +32,7 @@ class Switcher { console.log(type, data, "ServiceWorker" in globalThis); switch (type) { case "setremote": - // this.active = new RemoteClient + this.active = new RemoteTransport break; case "set": const { name, config } = data; diff --git a/src/index.ts b/src/index.ts index 9725366..4e27ca4 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,6 @@ export * from './BareTypes'; export * from './BareClient'; export * from './Switcher'; +export * from './RemoteClient'; export { BareClient as default } from './BareClient'; export { WebSocketFields } from "./snapshot";