@@ -17,2 +17,3 @@ /** | ||
| export declare const createEndpoint: unique symbol; | ||
| export declare const releaseProxy: unique symbol; | ||
| declare type Promisify<T> = T extends { | ||
@@ -19,0 +20,0 @@ [proxyMarker]: boolean; |
@@ -1,2 +0,2 @@ | ||
| const e=Symbol("Comlink.proxy"),t=Symbol("Comlink.endpoint"),n=new WeakSet,a=new Map([["proxy",{canHandle:t=>t&&t[e],serialize(e){const{port1:t,port2:n}=new MessageChannel;return r(e,t),[n,[n]]},deserialize:e=>(e.start(),s(e))}],["throw",{canHandle:e=>n.has(e),serialize(e){const t=e instanceof Error;let n=e;return t&&(n={isError:t,message:e.message,stack:e.stack}),[n,[]]},deserialize(e){if(e.isError)throw Object.assign(new Error,e);throw e}}]]);function r(e,t=self){t.addEventListener("message",async a=>{if(!a||!a.data)return;const{id:s,type:o,path:i}={path:[],...a.data},p=(a.data.argumentList||[]).map(l);let m;try{const t=i.slice(0,-1).reduce((e,t)=>e[t],e),s=i.reduce((e,t)=>e[t],e);switch(o){case 0:m=await s;break;case 1:t[i.slice(-1)[0]]=l(a.data.value),m=!0;break;case 2:m=await s.apply(t,p);break;case 3:m=u(await new s(...p));break;case 4:{const{port1:t,port2:n}=new MessageChannel;r(e,n),m=c(t,[t])}break;default:console.warn("Unrecognized message",a.data)}}catch(e){m=e,n.add(e)}const[g,f]=d(m);t.postMessage({...g,id:s},f)}),t.start&&t.start()}function s(e){return function e(n,a=[]){const r=new Proxy(function(){},{get(t,s){if("then"===s){if(0===a.length)return{then:()=>r};const e=m(n,{type:0,path:a.map(e=>e.toString())}).then(l);return e.then.bind(e)}return e(n,[...a,s])},set(e,t,r){const[s,o]=d(r);return m(n,{type:1,path:[...a,t].map(e=>e.toString()),value:s},o).then(l)},apply(r,s,i){const c=a[a.length-1];if(c===t)return m(n,{type:4}).then(l);if("bind"===c)return e(n,a.slice(0,-1));const[u,p]=o(i);return m(n,{type:2,path:a.map(e=>e.toString()),argumentList:u},p).then(l)},construct(e,t){const[r,s]=o(t);return m(n,{type:3,path:a.map(e=>e.toString()),argumentList:r},s).then(l)}});return r}(e)}function o(e){const t=e.map(d);return[t.map(e=>e[0]),(n=t.map(e=>e[1]),Array.prototype.concat.apply([],n))];var n}const i=new WeakMap;function c(e,t){return i.set(e,t),e}function u(t){return Object.assign(t,{[e]:!0})}function p(e,t=self){return{postMessage:(t,n)=>e.postMessage(t,"*",n),addEventListener:t.addEventListener.bind(t),removeEventListener:t.removeEventListener.bind(t)}}function d(e){for(const[t,n]of a)if(n.canHandle(e)){const[a,r]=n.serialize(e);return[{type:3,name:t,value:a},r]}return[{type:0,value:e},i.get(e)||[]]}function l(e){switch(e.type){case 3:return a.get(e.name).deserialize(e.value);case 0:return e.value}}function m(e,t,n){return new Promise(a=>{const r=new Array(4).fill(0).map(()=>Math.floor(Math.random()*Number.MAX_SAFE_INTEGER).toString(16)).join("-");e.addEventListener("message",function t(n){n.data&&n.data.id&&n.data.id===r&&(e.removeEventListener("message",t),a(n.data))}),e.start&&e.start(),e.postMessage({id:r,...t},n)})}export{t as createEndpoint,r as expose,u as proxy,e as proxyMarker,c as transfer,a as transferHandlers,p as windowEndpoint,s as wrap}; | ||
| const e=Symbol("Comlink.proxy"),t=Symbol("Comlink.endpoint"),n=Symbol("Comlink.releaseProxy"),r=new WeakSet,a=new Map([["proxy",{canHandle:t=>t&&t[e],serialize(e){const{port1:t,port2:n}=new MessageChannel;return s(e,t),[n,[n]]},deserialize:e=>(e.start(),i(e))}],["throw",{canHandle:e=>r.has(e),serialize(e){const t=e instanceof Error;let n=e;return t&&(n={isError:t,message:e.message,stack:e.stack}),[n,[]]},deserialize(e){if(e.isError)throw Object.assign(new Error,e);throw e}}]]);function s(e,t=self){t.addEventListener("message",(async function n(a){if(!a||!a.data)return;const{id:i,type:c,path:u}={path:[],...a.data},p=(a.data.argumentList||[]).map(h);let m;try{const t=u.slice(0,-1).reduce((e,t)=>e[t],e),n=u.reduce((e,t)=>e[t],e);switch(c){case 0:m=await n;break;case 1:t[u.slice(-1)[0]]=h(a.data.value),m=!0;break;case 2:m=await n.apply(t,p);break;case 3:m=d(await new n(...p));break;case 4:{const{port1:t,port2:n}=new MessageChannel;s(e,n),m=l(t,[t])}break;case 5:m=void 0}}catch(e){m=e,r.add(e)}const[g,y]=f(m);t.postMessage({...g,id:i},y),5===c&&(t.removeEventListener("message",n),o(t))})),t.start&&t.start()}function o(e){(function(e){return"MessagePort"===e.constructor.name})(e)&&e.close()}function i(e){return function e(r,a=[]){let s=!1;const i=new Proxy((function(){}),{get(t,u){if(c(s),u===n)return()=>g(r,{type:5,path:a.map(e=>e.toString())}).then(()=>{o(r),s=!0});if("then"===u){if(0===a.length)return{then:()=>i};const e=g(r,{type:0,path:a.map(e=>e.toString())}).then(h);return e.then.bind(e)}return e(r,[...a,u])},set(e,t,n){c(s);const[o,i]=f(n);return g(r,{type:1,path:[...a,t].map(e=>e.toString()),value:o},i).then(h)},apply(n,o,i){c(s);const p=a[a.length-1];if(p===t)return g(r,{type:4}).then(h);if("bind"===p)return e(r,a.slice(0,-1));const[l,d]=u(i);return g(r,{type:2,path:a.map(e=>e.toString()),argumentList:l},d).then(h)},construct(e,t){c(s);const[n,o]=u(t);return g(r,{type:3,path:a.map(e=>e.toString()),argumentList:n},o).then(h)}});return i}(e)}function c(e){if(e)throw new Error("Proxy has been released and is not useable")}function u(e){const t=e.map(f);return[t.map(e=>e[0]),(n=t.map(e=>e[1]),Array.prototype.concat.apply([],n))];var n}const p=new WeakMap;function l(e,t){return p.set(e,t),e}function d(t){return Object.assign(t,{[e]:!0})}function m(e,t=self){return{postMessage:(t,n)=>e.postMessage(t,"*",n),addEventListener:t.addEventListener.bind(t),removeEventListener:t.removeEventListener.bind(t)}}function f(e){for(const[t,n]of a)if(n.canHandle(e)){const[r,a]=n.serialize(e);return[{type:3,name:t,value:r},a]}return[{type:0,value:e},p.get(e)||[]]}function h(e){switch(e.type){case 3:return a.get(e.name).deserialize(e.value);case 0:return e.value}}function g(e,t,n){return new Promise(r=>{const a=new Array(4).fill(0).map(()=>Math.floor(Math.random()*Number.MAX_SAFE_INTEGER).toString(16)).join("-");e.addEventListener("message",(function t(n){n.data&&n.data.id&&n.data.id===a&&(e.removeEventListener("message",t),r(n.data))})),e.start&&e.start(),e.postMessage({id:a,...t},n)})}export{t as createEndpoint,s as expose,d as proxy,e as proxyMarker,n as releaseProxy,l as transfer,a as transferHandlers,m as windowEndpoint,i as wrap}; | ||
| //# sourceMappingURL=comlink.min.mjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"comlink.min.mjs","sources":["../../src/comlink.ts"],"sourcesContent":["/**\n * Copyright 2019 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n Endpoint,\n EventSource,\n Message,\n MessageType,\n PostMessageWithOrigin,\n WireValue,\n WireValueType\n} from \"./protocol.js\";\nexport { Endpoint };\n\nexport const proxyMarker = Symbol(\"Comlink.proxy\");\nexport const createEndpoint = Symbol(\"Comlink.endpoint\");\nconst throwSet = new WeakSet();\n\n// prettier-ignore\ntype Promisify<T> = T extends { [proxyMarker]: boolean }\n ? Promise<Remote<T>>\n : T extends Promise<any>\n ? T\n : T extends (...args: infer R1) => infer R2\n ? (...args: R1) => Promisify<R2>\n : Promise<T>;\n\n// prettier-ignore\nexport type Remote<T> =\n (\n T extends (...args: infer R1) => infer R2\n ? (...args: R1) => Promisify<R2>\n : { [K in keyof T]: Promisify<T[K]> }\n ) & (\n T extends { new (...args: infer R1): infer R2 }\n ? { new (...args: R1): Promise<Remote<R2>> }\n : unknown\n );\n\nexport interface TransferHandler {\n canHandle(obj: any): boolean;\n serialize(obj: any): [any, Transferable[]];\n deserialize(obj: any): any;\n}\n\nexport const transferHandlers = new Map<string, TransferHandler>([\n [\n \"proxy\",\n {\n canHandle: obj => obj && obj[proxyMarker],\n serialize(obj) {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port1);\n return [port2, [port2]];\n },\n deserialize: (port: MessagePort) => {\n port.start();\n return wrap(port);\n }\n }\n ],\n [\n \"throw\",\n {\n canHandle: obj => throwSet.has(obj),\n serialize(obj) {\n const isError = obj instanceof Error;\n let serialized = obj;\n if (isError) {\n serialized = {\n isError,\n message: obj.message,\n stack: obj.stack\n };\n }\n return [serialized, []];\n },\n deserialize(obj) {\n if ((obj as any).isError) {\n throw Object.assign(new Error(), obj);\n }\n throw obj;\n }\n }\n ]\n]);\n\nexport function expose(obj: any, ep: Endpoint = self as any) {\n ep.addEventListener(\"message\", (async (ev: MessageEvent) => {\n if (!ev || !ev.data) {\n return;\n }\n const { id, type, path } = {\n path: [] as string[],\n ...(ev.data as Message)\n };\n const argumentList = (ev.data.argumentList || []).map(fromWireValue);\n let returnValue;\n try {\n const parent = path.slice(0, -1).reduce((obj, prop) => obj[prop], obj);\n const rawValue = path.reduce((obj, prop) => obj[prop], obj);\n switch (type) {\n case MessageType.GET:\n {\n returnValue = await rawValue;\n }\n break;\n case MessageType.SET:\n {\n parent[path.slice(-1)[0]] = fromWireValue(ev.data.value);\n returnValue = true;\n }\n break;\n case MessageType.APPLY:\n {\n returnValue = await rawValue.apply(parent, argumentList);\n }\n break;\n case MessageType.CONSTRUCT:\n {\n const value = await new rawValue(...argumentList);\n returnValue = proxy(value);\n }\n break;\n case MessageType.ENDPOINT:\n {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port2);\n returnValue = transfer(port1, [port1]);\n }\n break;\n default:\n console.warn(\"Unrecognized message\", ev.data);\n }\n } catch (e) {\n returnValue = e;\n throwSet.add(e);\n }\n const [wireValue, transferables] = toWireValue(returnValue);\n ep.postMessage({ ...wireValue, id }, transferables);\n }) as any);\n if (ep.start) {\n ep.start();\n }\n}\n\nexport function wrap<T>(ep: Endpoint): Remote<T> {\n return createProxy<T>(ep) as any;\n}\n\nfunction createProxy<T>(\n ep: Endpoint,\n path: (string | number | symbol)[] = []\n): Remote<T> {\n const proxy: Function = new Proxy(function() {}, {\n get(_target, prop) {\n if (prop === \"then\") {\n if (path.length === 0) {\n return { then: () => proxy };\n }\n const r = requestResponseMessage(ep, {\n type: MessageType.GET,\n path: path.map(p => p.toString())\n }).then(fromWireValue);\n return r.then.bind(r);\n }\n return createProxy(ep, [...path, prop]);\n },\n set(_target, prop, rawValue) {\n // FIXME: ES6 Proxy Handler `set` methods are supposed to return a\n // boolean. To show good will, we return true asynchronously ¯\\_(ツ)_/¯\n const [value, transferables] = toWireValue(rawValue);\n return requestResponseMessage(\n ep,\n {\n type: MessageType.SET,\n path: [...path, prop].map(p => p.toString()),\n value\n },\n transferables\n ).then(fromWireValue) as any;\n },\n apply(_target, _thisArg, rawArgumentList) {\n const last = path[path.length - 1];\n if ((last as any) === createEndpoint) {\n return requestResponseMessage(ep, {\n type: MessageType.ENDPOINT\n }).then(fromWireValue);\n }\n // We just pretend that `bind()` didn’t happen.\n if (last === \"bind\") {\n return createProxy(ep, path.slice(0, -1));\n }\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(\n ep,\n {\n type: MessageType.APPLY,\n path: path.map(p => p.toString()),\n argumentList\n },\n transferables\n ).then(fromWireValue);\n },\n construct(_target, rawArgumentList) {\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(\n ep,\n {\n type: MessageType.CONSTRUCT,\n path: path.map(p => p.toString()),\n argumentList\n },\n transferables\n ).then(fromWireValue);\n }\n });\n return proxy as any;\n}\n\nfunction myFlat<T>(arr: (T | T[])[]): T[] {\n return Array.prototype.concat.apply([], arr);\n}\n\nfunction processArguments(argumentList: any[]): [WireValue[], Transferable[]] {\n const processed = argumentList.map(toWireValue);\n return [processed.map(v => v[0]), myFlat(processed.map(v => v[1]))];\n}\n\nconst transferCache = new WeakMap<any, Transferable[]>();\nexport function transfer(obj: any, transfers: Transferable[]) {\n transferCache.set(obj, transfers);\n return obj;\n}\n\nexport function proxy<T>(obj: T): T & { [proxyMarker]: true } {\n return Object.assign(obj, { [proxyMarker]: true }) as any;\n}\n\nexport function windowEndpoint(\n w: PostMessageWithOrigin,\n context: EventSource = self\n): Endpoint {\n return {\n postMessage: (msg: any, transferables: Transferable[]) =>\n w.postMessage(msg, \"*\", transferables),\n addEventListener: context.addEventListener.bind(context),\n removeEventListener: context.removeEventListener.bind(context)\n };\n}\n\nfunction toWireValue(value: any): [WireValue, Transferable[]] {\n for (const [name, handler] of transferHandlers) {\n if (handler.canHandle(value)) {\n const [serializedValue, transferables] = handler.serialize(value);\n return [\n {\n type: WireValueType.HANDLER,\n name,\n value: serializedValue\n },\n transferables\n ];\n }\n }\n return [\n {\n type: WireValueType.RAW,\n value\n },\n transferCache.get(value) || []\n ];\n}\n\nfunction fromWireValue(value: WireValue): any {\n switch (value.type) {\n case WireValueType.HANDLER:\n return transferHandlers.get(value.name)!.deserialize(value.value);\n case WireValueType.RAW:\n return value.value;\n }\n}\n\nfunction requestResponseMessage(\n ep: Endpoint,\n msg: Message,\n transfers?: Transferable[]\n): Promise<WireValue> {\n return new Promise(resolve => {\n const id = generateUUID();\n ep.addEventListener(\"message\", function l(ev: MessageEvent) {\n if (!ev.data || !ev.data.id || ev.data.id !== id) {\n return;\n }\n ep.removeEventListener(\"message\", l as any);\n resolve(ev.data);\n } as any);\n if (ep.start) {\n ep.start();\n }\n ep.postMessage({ id, ...msg }, transfers);\n });\n}\n\nfunction generateUUID(): string {\n return new Array(4)\n .fill(0)\n .map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16))\n .join(\"-\");\n}\n"],"names":["proxyMarker","Symbol","createEndpoint","throwSet","WeakSet","transferHandlers","Map","canHandle","obj","[object Object]","port1","port2","MessageChannel","expose","deserialize","port","start","wrap","has","isError","Error","serialized","message","stack","Object","assign","ep","self","addEventListener","ev","data","id","type","path","argumentList","map","fromWireValue","returnValue","parent","slice","reduce","prop","rawValue","value","apply","proxy","transfer","console","warn","e","add","wireValue","transferables","toWireValue","postMessage","createProxy","Proxy","_target","length","then","r","requestResponseMessage","p","toString","bind","_thisArg","rawArgumentList","last","processArguments","processed","v","arr","Array","prototype","concat","transferCache","WeakMap","transfers","set","windowEndpoint","w","context","msg","removeEventListener","name","handler","serializedValue","serialize","get","Promise","resolve","fill","Math","floor","random","Number","MAX_SAFE_INTEGER","join","l"],"mappings":"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"} | ||
| {"version":3,"file":"comlink.min.mjs","sources":["../../src/comlink.ts"],"sourcesContent":["/**\n * Copyright 2019 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n Endpoint,\n EventSource,\n Message,\n MessageType,\n PostMessageWithOrigin,\n WireValue,\n WireValueType\n} from \"./protocol.js\";\nexport { Endpoint };\n\nexport const proxyMarker = Symbol(\"Comlink.proxy\");\nexport const createEndpoint = Symbol(\"Comlink.endpoint\");\nexport const releaseProxy = Symbol(\"Comlink.releaseProxy\");\nconst throwSet = new WeakSet();\n\n// prettier-ignore\ntype Promisify<T> = T extends { [proxyMarker]: boolean }\n ? Promise<Remote<T>>\n : T extends Promise<any>\n ? T\n : T extends (...args: infer R1) => infer R2\n ? (...args: R1) => Promisify<R2>\n : Promise<T>;\n\n// prettier-ignore\nexport type Remote<T> =\n (\n T extends (...args: infer R1) => infer R2\n ? (...args: R1) => Promisify<R2>\n : { [K in keyof T]: Promisify<T[K]> }\n ) & (\n T extends { new (...args: infer R1): infer R2 }\n ? { new (...args: R1): Promise<Remote<R2>> }\n : unknown\n );\n\nexport interface TransferHandler {\n canHandle(obj: any): boolean;\n serialize(obj: any): [any, Transferable[]];\n deserialize(obj: any): any;\n}\n\nexport const transferHandlers = new Map<string, TransferHandler>([\n [\n \"proxy\",\n {\n canHandle: obj => obj && obj[proxyMarker],\n serialize(obj) {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port1);\n return [port2, [port2]];\n },\n deserialize: (port: MessagePort) => {\n port.start();\n return wrap(port);\n }\n }\n ],\n [\n \"throw\",\n {\n canHandle: obj => throwSet.has(obj),\n serialize(obj) {\n const isError = obj instanceof Error;\n let serialized = obj;\n if (isError) {\n serialized = {\n isError,\n message: obj.message,\n stack: obj.stack\n };\n }\n return [serialized, []];\n },\n deserialize(obj) {\n if ((obj as any).isError) {\n throw Object.assign(new Error(), obj);\n }\n throw obj;\n }\n }\n ]\n]);\n\nexport function expose(obj: any, ep: Endpoint = self as any) {\n ep.addEventListener(\"message\", async function callback(ev: MessageEvent) {\n if (!ev || !ev.data) {\n return;\n }\n const { id, type, path } = {\n path: [] as string[],\n ...(ev.data as Message)\n };\n const argumentList = (ev.data.argumentList || []).map(fromWireValue);\n let returnValue;\n try {\n const parent = path.slice(0, -1).reduce((obj, prop) => obj[prop], obj);\n const rawValue = path.reduce((obj, prop) => obj[prop], obj);\n switch (type) {\n case MessageType.GET:\n {\n returnValue = await rawValue;\n }\n break;\n case MessageType.SET:\n {\n parent[path.slice(-1)[0]] = fromWireValue(ev.data.value);\n returnValue = true;\n }\n break;\n case MessageType.APPLY:\n {\n returnValue = await rawValue.apply(parent, argumentList);\n }\n break;\n case MessageType.CONSTRUCT:\n {\n const value = await new rawValue(...argumentList);\n returnValue = proxy(value);\n }\n break;\n case MessageType.ENDPOINT:\n {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port2);\n returnValue = transfer(port1, [port1]);\n }\n break;\n case MessageType.RELEASE:\n {\n returnValue = undefined;\n }\n break;\n }\n } catch (e) {\n returnValue = e;\n throwSet.add(e);\n }\n const [wireValue, transferables] = toWireValue(returnValue);\n ep.postMessage({ ...wireValue, id }, transferables);\n if (type === MessageType.RELEASE) {\n // detach and deactive after sending release response above.\n ep.removeEventListener(\"message\", callback as any);\n closeEndPoint(ep);\n }\n } as any);\n if (ep.start) {\n ep.start();\n }\n}\n\nfunction isMessagePort(endpoint: Endpoint): endpoint is MessagePort {\n return endpoint.constructor.name === \"MessagePort\";\n}\n\nfunction closeEndPoint(endpoint: Endpoint) {\n if (isMessagePort(endpoint)) endpoint.close();\n}\n\nexport function wrap<T>(ep: Endpoint): Remote<T> {\n return createProxy<T>(ep) as any;\n}\n\nfunction throwIfProxyReleased(isReleased: boolean) {\n if (isReleased) {\n throw new Error(\"Proxy has been released and is not useable\");\n }\n}\n\nfunction createProxy<T>(\n ep: Endpoint,\n path: (string | number | symbol)[] = []\n): Remote<T> {\n let isProxyReleased = false;\n const proxy = new Proxy(function() {}, {\n get(_target, prop) {\n throwIfProxyReleased(isProxyReleased);\n if (prop === releaseProxy) {\n return () => {\n return requestResponseMessage(ep, {\n type: MessageType.RELEASE,\n path: path.map(p => p.toString())\n }).then(() => {\n closeEndPoint(ep);\n isProxyReleased = true;\n });\n };\n }\n if (prop === \"then\") {\n if (path.length === 0) {\n return { then: () => proxy };\n }\n const r = requestResponseMessage(ep, {\n type: MessageType.GET,\n path: path.map(p => p.toString())\n }).then(fromWireValue);\n return r.then.bind(r);\n }\n return createProxy(ep, [...path, prop]);\n },\n set(_target, prop, rawValue) {\n throwIfProxyReleased(isProxyReleased);\n // FIXME: ES6 Proxy Handler `set` methods are supposed to return a\n // boolean. To show good will, we return true asynchronously ¯\\_(ツ)_/¯\n const [value, transferables] = toWireValue(rawValue);\n return requestResponseMessage(\n ep,\n {\n type: MessageType.SET,\n path: [...path, prop].map(p => p.toString()),\n value\n },\n transferables\n ).then(fromWireValue) as any;\n },\n apply(_target, _thisArg, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const last = path[path.length - 1];\n if ((last as any) === createEndpoint) {\n return requestResponseMessage(ep, {\n type: MessageType.ENDPOINT\n }).then(fromWireValue);\n }\n // We just pretend that `bind()` didn’t happen.\n if (last === \"bind\") {\n return createProxy(ep, path.slice(0, -1));\n }\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(\n ep,\n {\n type: MessageType.APPLY,\n path: path.map(p => p.toString()),\n argumentList\n },\n transferables\n ).then(fromWireValue);\n },\n construct(_target, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(\n ep,\n {\n type: MessageType.CONSTRUCT,\n path: path.map(p => p.toString()),\n argumentList\n },\n transferables\n ).then(fromWireValue);\n }\n });\n return proxy as any;\n}\n\nfunction myFlat<T>(arr: (T | T[])[]): T[] {\n return Array.prototype.concat.apply([], arr);\n}\n\nfunction processArguments(argumentList: any[]): [WireValue[], Transferable[]] {\n const processed = argumentList.map(toWireValue);\n return [processed.map(v => v[0]), myFlat(processed.map(v => v[1]))];\n}\n\nconst transferCache = new WeakMap<any, Transferable[]>();\nexport function transfer(obj: any, transfers: Transferable[]) {\n transferCache.set(obj, transfers);\n return obj;\n}\n\nexport function proxy<T>(obj: T): T & { [proxyMarker]: true } {\n return Object.assign(obj, { [proxyMarker]: true }) as any;\n}\n\nexport function windowEndpoint(\n w: PostMessageWithOrigin,\n context: EventSource = self\n): Endpoint {\n return {\n postMessage: (msg: any, transferables: Transferable[]) =>\n w.postMessage(msg, \"*\", transferables),\n addEventListener: context.addEventListener.bind(context),\n removeEventListener: context.removeEventListener.bind(context)\n };\n}\n\nfunction toWireValue(value: any): [WireValue, Transferable[]] {\n for (const [name, handler] of transferHandlers) {\n if (handler.canHandle(value)) {\n const [serializedValue, transferables] = handler.serialize(value);\n return [\n {\n type: WireValueType.HANDLER,\n name,\n value: serializedValue\n },\n transferables\n ];\n }\n }\n return [\n {\n type: WireValueType.RAW,\n value\n },\n transferCache.get(value) || []\n ];\n}\n\nfunction fromWireValue(value: WireValue): any {\n switch (value.type) {\n case WireValueType.HANDLER:\n return transferHandlers.get(value.name)!.deserialize(value.value);\n case WireValueType.RAW:\n return value.value;\n }\n}\n\nfunction requestResponseMessage(\n ep: Endpoint,\n msg: Message,\n transfers?: Transferable[]\n): Promise<WireValue> {\n return new Promise(resolve => {\n const id = generateUUID();\n ep.addEventListener(\"message\", function l(ev: MessageEvent) {\n if (!ev.data || !ev.data.id || ev.data.id !== id) {\n return;\n }\n ep.removeEventListener(\"message\", l as any);\n resolve(ev.data);\n } as any);\n if (ep.start) {\n ep.start();\n }\n ep.postMessage({ id, ...msg }, transfers);\n });\n}\n\nfunction generateUUID(): string {\n return new Array(4)\n .fill(0)\n .map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16))\n .join(\"-\");\n}\n"],"names":["proxyMarker","Symbol","createEndpoint","releaseProxy","throwSet","WeakSet","transferHandlers","Map","canHandle","obj","[object Object]","port1","port2","MessageChannel","expose","deserialize","port","start","wrap","has","isError","Error","serialized","message","stack","Object","assign","ep","self","addEventListener","async","callback","ev","data","id","type","path","argumentList","map","fromWireValue","returnValue","parent","slice","reduce","prop","rawValue","value","apply","proxy","transfer","undefined","e","add","wireValue","transferables","toWireValue","postMessage","removeEventListener","closeEndPoint","endpoint","constructor","name","isMessagePort","close","createProxy","isProxyReleased","Proxy","_target","throwIfProxyReleased","requestResponseMessage","p","toString","then","length","r","bind","_thisArg","rawArgumentList","last","processArguments","isReleased","processed","v","arr","Array","prototype","concat","transferCache","WeakMap","transfers","set","windowEndpoint","w","context","msg","handler","serializedValue","serialize","get","Promise","resolve","fill","Math","floor","random","Number","MAX_SAFE_INTEGER","join","l"],"mappings":"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"} |
+42
-5
@@ -15,2 +15,3 @@ /** | ||
| const createEndpoint = Symbol("Comlink.endpoint"); | ||
| const releaseProxy = Symbol("Comlink.releaseProxy"); | ||
| const throwSet = new WeakSet(); | ||
@@ -59,3 +60,3 @@ const transferHandlers = new Map([ | ||
| function expose(obj, ep = self) { | ||
| ep.addEventListener("message", (async (ev) => { | ||
| ep.addEventListener("message", async function callback(ev) { | ||
| if (!ev || !ev.data) { | ||
@@ -103,4 +104,7 @@ return; | ||
| break; | ||
| default: | ||
| console.warn("Unrecognized message", ev.data); | ||
| case 5 /* RELEASE */: | ||
| { | ||
| returnValue = undefined; | ||
| } | ||
| break; | ||
| } | ||
@@ -114,3 +118,8 @@ } | ||
| ep.postMessage({ ...wireValue, id }, transferables); | ||
| })); | ||
| if (type === 5 /* RELEASE */) { | ||
| // detach and deactive after sending release response above. | ||
| ep.removeEventListener("message", callback); | ||
| closeEndPoint(ep); | ||
| } | ||
| }); | ||
| if (ep.start) { | ||
@@ -120,8 +129,33 @@ ep.start(); | ||
| } | ||
| function isMessagePort(endpoint) { | ||
| return endpoint.constructor.name === "MessagePort"; | ||
| } | ||
| function closeEndPoint(endpoint) { | ||
| if (isMessagePort(endpoint)) | ||
| endpoint.close(); | ||
| } | ||
| function wrap(ep) { | ||
| return createProxy(ep); | ||
| } | ||
| function throwIfProxyReleased(isReleased) { | ||
| if (isReleased) { | ||
| throw new Error("Proxy has been released and is not useable"); | ||
| } | ||
| } | ||
| function createProxy(ep, path = []) { | ||
| let isProxyReleased = false; | ||
| const proxy = new Proxy(function () { }, { | ||
| get(_target, prop) { | ||
| throwIfProxyReleased(isProxyReleased); | ||
| if (prop === releaseProxy) { | ||
| return () => { | ||
| return requestResponseMessage(ep, { | ||
| type: 5 /* RELEASE */, | ||
| path: path.map(p => p.toString()) | ||
| }).then(() => { | ||
| closeEndPoint(ep); | ||
| isProxyReleased = true; | ||
| }); | ||
| }; | ||
| } | ||
| if (prop === "then") { | ||
@@ -140,2 +174,3 @@ if (path.length === 0) { | ||
| set(_target, prop, rawValue) { | ||
| throwIfProxyReleased(isProxyReleased); | ||
| // FIXME: ES6 Proxy Handler `set` methods are supposed to return a | ||
@@ -151,2 +186,3 @@ // boolean. To show good will, we return true asynchronously ¯\_(ツ)_/¯ | ||
| apply(_target, _thisArg, rawArgumentList) { | ||
| throwIfProxyReleased(isProxyReleased); | ||
| const last = path[path.length - 1]; | ||
@@ -170,2 +206,3 @@ if (last === createEndpoint) { | ||
| construct(_target, rawArgumentList) { | ||
| throwIfProxyReleased(isProxyReleased); | ||
| const [argumentList, transferables] = processArguments(rawArgumentList); | ||
@@ -256,3 +293,3 @@ return requestResponseMessage(ep, { | ||
| export { createEndpoint, expose, proxy, proxyMarker, transfer, transferHandlers, windowEndpoint, wrap }; | ||
| export { createEndpoint, expose, proxy, proxyMarker, releaseProxy, transfer, transferHandlers, windowEndpoint, wrap }; | ||
| //# sourceMappingURL=comlink.mjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"comlink.mjs","sources":["../../src/comlink.ts"],"sourcesContent":["/**\n * Copyright 2019 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n Endpoint,\n EventSource,\n Message,\n MessageType,\n PostMessageWithOrigin,\n WireValue,\n WireValueType\n} from \"./protocol.js\";\nexport { Endpoint };\n\nexport const proxyMarker = Symbol(\"Comlink.proxy\");\nexport const createEndpoint = Symbol(\"Comlink.endpoint\");\nconst throwSet = new WeakSet();\n\n// prettier-ignore\ntype Promisify<T> = T extends { [proxyMarker]: boolean }\n ? Promise<Remote<T>>\n : T extends Promise<any>\n ? T\n : T extends (...args: infer R1) => infer R2\n ? (...args: R1) => Promisify<R2>\n : Promise<T>;\n\n// prettier-ignore\nexport type Remote<T> =\n (\n T extends (...args: infer R1) => infer R2\n ? (...args: R1) => Promisify<R2>\n : { [K in keyof T]: Promisify<T[K]> }\n ) & (\n T extends { new (...args: infer R1): infer R2 }\n ? { new (...args: R1): Promise<Remote<R2>> }\n : unknown\n );\n\nexport interface TransferHandler {\n canHandle(obj: any): boolean;\n serialize(obj: any): [any, Transferable[]];\n deserialize(obj: any): any;\n}\n\nexport const transferHandlers = new Map<string, TransferHandler>([\n [\n \"proxy\",\n {\n canHandle: obj => obj && obj[proxyMarker],\n serialize(obj) {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port1);\n return [port2, [port2]];\n },\n deserialize: (port: MessagePort) => {\n port.start();\n return wrap(port);\n }\n }\n ],\n [\n \"throw\",\n {\n canHandle: obj => throwSet.has(obj),\n serialize(obj) {\n const isError = obj instanceof Error;\n let serialized = obj;\n if (isError) {\n serialized = {\n isError,\n message: obj.message,\n stack: obj.stack\n };\n }\n return [serialized, []];\n },\n deserialize(obj) {\n if ((obj as any).isError) {\n throw Object.assign(new Error(), obj);\n }\n throw obj;\n }\n }\n ]\n]);\n\nexport function expose(obj: any, ep: Endpoint = self as any) {\n ep.addEventListener(\"message\", (async (ev: MessageEvent) => {\n if (!ev || !ev.data) {\n return;\n }\n const { id, type, path } = {\n path: [] as string[],\n ...(ev.data as Message)\n };\n const argumentList = (ev.data.argumentList || []).map(fromWireValue);\n let returnValue;\n try {\n const parent = path.slice(0, -1).reduce((obj, prop) => obj[prop], obj);\n const rawValue = path.reduce((obj, prop) => obj[prop], obj);\n switch (type) {\n case MessageType.GET:\n {\n returnValue = await rawValue;\n }\n break;\n case MessageType.SET:\n {\n parent[path.slice(-1)[0]] = fromWireValue(ev.data.value);\n returnValue = true;\n }\n break;\n case MessageType.APPLY:\n {\n returnValue = await rawValue.apply(parent, argumentList);\n }\n break;\n case MessageType.CONSTRUCT:\n {\n const value = await new rawValue(...argumentList);\n returnValue = proxy(value);\n }\n break;\n case MessageType.ENDPOINT:\n {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port2);\n returnValue = transfer(port1, [port1]);\n }\n break;\n default:\n console.warn(\"Unrecognized message\", ev.data);\n }\n } catch (e) {\n returnValue = e;\n throwSet.add(e);\n }\n const [wireValue, transferables] = toWireValue(returnValue);\n ep.postMessage({ ...wireValue, id }, transferables);\n }) as any);\n if (ep.start) {\n ep.start();\n }\n}\n\nexport function wrap<T>(ep: Endpoint): Remote<T> {\n return createProxy<T>(ep) as any;\n}\n\nfunction createProxy<T>(\n ep: Endpoint,\n path: (string | number | symbol)[] = []\n): Remote<T> {\n const proxy: Function = new Proxy(function() {}, {\n get(_target, prop) {\n if (prop === \"then\") {\n if (path.length === 0) {\n return { then: () => proxy };\n }\n const r = requestResponseMessage(ep, {\n type: MessageType.GET,\n path: path.map(p => p.toString())\n }).then(fromWireValue);\n return r.then.bind(r);\n }\n return createProxy(ep, [...path, prop]);\n },\n set(_target, prop, rawValue) {\n // FIXME: ES6 Proxy Handler `set` methods are supposed to return a\n // boolean. To show good will, we return true asynchronously ¯\\_(ツ)_/¯\n const [value, transferables] = toWireValue(rawValue);\n return requestResponseMessage(\n ep,\n {\n type: MessageType.SET,\n path: [...path, prop].map(p => p.toString()),\n value\n },\n transferables\n ).then(fromWireValue) as any;\n },\n apply(_target, _thisArg, rawArgumentList) {\n const last = path[path.length - 1];\n if ((last as any) === createEndpoint) {\n return requestResponseMessage(ep, {\n type: MessageType.ENDPOINT\n }).then(fromWireValue);\n }\n // We just pretend that `bind()` didn’t happen.\n if (last === \"bind\") {\n return createProxy(ep, path.slice(0, -1));\n }\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(\n ep,\n {\n type: MessageType.APPLY,\n path: path.map(p => p.toString()),\n argumentList\n },\n transferables\n ).then(fromWireValue);\n },\n construct(_target, rawArgumentList) {\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(\n ep,\n {\n type: MessageType.CONSTRUCT,\n path: path.map(p => p.toString()),\n argumentList\n },\n transferables\n ).then(fromWireValue);\n }\n });\n return proxy as any;\n}\n\nfunction myFlat<T>(arr: (T | T[])[]): T[] {\n return Array.prototype.concat.apply([], arr);\n}\n\nfunction processArguments(argumentList: any[]): [WireValue[], Transferable[]] {\n const processed = argumentList.map(toWireValue);\n return [processed.map(v => v[0]), myFlat(processed.map(v => v[1]))];\n}\n\nconst transferCache = new WeakMap<any, Transferable[]>();\nexport function transfer(obj: any, transfers: Transferable[]) {\n transferCache.set(obj, transfers);\n return obj;\n}\n\nexport function proxy<T>(obj: T): T & { [proxyMarker]: true } {\n return Object.assign(obj, { [proxyMarker]: true }) as any;\n}\n\nexport function windowEndpoint(\n w: PostMessageWithOrigin,\n context: EventSource = self\n): Endpoint {\n return {\n postMessage: (msg: any, transferables: Transferable[]) =>\n w.postMessage(msg, \"*\", transferables),\n addEventListener: context.addEventListener.bind(context),\n removeEventListener: context.removeEventListener.bind(context)\n };\n}\n\nfunction toWireValue(value: any): [WireValue, Transferable[]] {\n for (const [name, handler] of transferHandlers) {\n if (handler.canHandle(value)) {\n const [serializedValue, transferables] = handler.serialize(value);\n return [\n {\n type: WireValueType.HANDLER,\n name,\n value: serializedValue\n },\n transferables\n ];\n }\n }\n return [\n {\n type: WireValueType.RAW,\n value\n },\n transferCache.get(value) || []\n ];\n}\n\nfunction fromWireValue(value: WireValue): any {\n switch (value.type) {\n case WireValueType.HANDLER:\n return transferHandlers.get(value.name)!.deserialize(value.value);\n case WireValueType.RAW:\n return value.value;\n }\n}\n\nfunction requestResponseMessage(\n ep: Endpoint,\n msg: Message,\n transfers?: Transferable[]\n): Promise<WireValue> {\n return new Promise(resolve => {\n const id = generateUUID();\n ep.addEventListener(\"message\", function l(ev: MessageEvent) {\n if (!ev.data || !ev.data.id || ev.data.id !== id) {\n return;\n }\n ep.removeEventListener(\"message\", l as any);\n resolve(ev.data);\n } as any);\n if (ep.start) {\n ep.start();\n }\n ep.postMessage({ id, ...msg }, transfers);\n });\n}\n\nfunction generateUUID(): string {\n return new Array(4)\n .fill(0)\n .map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16))\n .join(\"-\");\n}\n"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"comlink.mjs","sources":["../../src/comlink.ts"],"sourcesContent":["/**\n * Copyright 2019 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n Endpoint,\n EventSource,\n Message,\n MessageType,\n PostMessageWithOrigin,\n WireValue,\n WireValueType\n} from \"./protocol.js\";\nexport { Endpoint };\n\nexport const proxyMarker = Symbol(\"Comlink.proxy\");\nexport const createEndpoint = Symbol(\"Comlink.endpoint\");\nexport const releaseProxy = Symbol(\"Comlink.releaseProxy\");\nconst throwSet = new WeakSet();\n\n// prettier-ignore\ntype Promisify<T> = T extends { [proxyMarker]: boolean }\n ? Promise<Remote<T>>\n : T extends Promise<any>\n ? T\n : T extends (...args: infer R1) => infer R2\n ? (...args: R1) => Promisify<R2>\n : Promise<T>;\n\n// prettier-ignore\nexport type Remote<T> =\n (\n T extends (...args: infer R1) => infer R2\n ? (...args: R1) => Promisify<R2>\n : { [K in keyof T]: Promisify<T[K]> }\n ) & (\n T extends { new (...args: infer R1): infer R2 }\n ? { new (...args: R1): Promise<Remote<R2>> }\n : unknown\n );\n\nexport interface TransferHandler {\n canHandle(obj: any): boolean;\n serialize(obj: any): [any, Transferable[]];\n deserialize(obj: any): any;\n}\n\nexport const transferHandlers = new Map<string, TransferHandler>([\n [\n \"proxy\",\n {\n canHandle: obj => obj && obj[proxyMarker],\n serialize(obj) {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port1);\n return [port2, [port2]];\n },\n deserialize: (port: MessagePort) => {\n port.start();\n return wrap(port);\n }\n }\n ],\n [\n \"throw\",\n {\n canHandle: obj => throwSet.has(obj),\n serialize(obj) {\n const isError = obj instanceof Error;\n let serialized = obj;\n if (isError) {\n serialized = {\n isError,\n message: obj.message,\n stack: obj.stack\n };\n }\n return [serialized, []];\n },\n deserialize(obj) {\n if ((obj as any).isError) {\n throw Object.assign(new Error(), obj);\n }\n throw obj;\n }\n }\n ]\n]);\n\nexport function expose(obj: any, ep: Endpoint = self as any) {\n ep.addEventListener(\"message\", async function callback(ev: MessageEvent) {\n if (!ev || !ev.data) {\n return;\n }\n const { id, type, path } = {\n path: [] as string[],\n ...(ev.data as Message)\n };\n const argumentList = (ev.data.argumentList || []).map(fromWireValue);\n let returnValue;\n try {\n const parent = path.slice(0, -1).reduce((obj, prop) => obj[prop], obj);\n const rawValue = path.reduce((obj, prop) => obj[prop], obj);\n switch (type) {\n case MessageType.GET:\n {\n returnValue = await rawValue;\n }\n break;\n case MessageType.SET:\n {\n parent[path.slice(-1)[0]] = fromWireValue(ev.data.value);\n returnValue = true;\n }\n break;\n case MessageType.APPLY:\n {\n returnValue = await rawValue.apply(parent, argumentList);\n }\n break;\n case MessageType.CONSTRUCT:\n {\n const value = await new rawValue(...argumentList);\n returnValue = proxy(value);\n }\n break;\n case MessageType.ENDPOINT:\n {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port2);\n returnValue = transfer(port1, [port1]);\n }\n break;\n case MessageType.RELEASE:\n {\n returnValue = undefined;\n }\n break;\n }\n } catch (e) {\n returnValue = e;\n throwSet.add(e);\n }\n const [wireValue, transferables] = toWireValue(returnValue);\n ep.postMessage({ ...wireValue, id }, transferables);\n if (type === MessageType.RELEASE) {\n // detach and deactive after sending release response above.\n ep.removeEventListener(\"message\", callback as any);\n closeEndPoint(ep);\n }\n } as any);\n if (ep.start) {\n ep.start();\n }\n}\n\nfunction isMessagePort(endpoint: Endpoint): endpoint is MessagePort {\n return endpoint.constructor.name === \"MessagePort\";\n}\n\nfunction closeEndPoint(endpoint: Endpoint) {\n if (isMessagePort(endpoint)) endpoint.close();\n}\n\nexport function wrap<T>(ep: Endpoint): Remote<T> {\n return createProxy<T>(ep) as any;\n}\n\nfunction throwIfProxyReleased(isReleased: boolean) {\n if (isReleased) {\n throw new Error(\"Proxy has been released and is not useable\");\n }\n}\n\nfunction createProxy<T>(\n ep: Endpoint,\n path: (string | number | symbol)[] = []\n): Remote<T> {\n let isProxyReleased = false;\n const proxy = new Proxy(function() {}, {\n get(_target, prop) {\n throwIfProxyReleased(isProxyReleased);\n if (prop === releaseProxy) {\n return () => {\n return requestResponseMessage(ep, {\n type: MessageType.RELEASE,\n path: path.map(p => p.toString())\n }).then(() => {\n closeEndPoint(ep);\n isProxyReleased = true;\n });\n };\n }\n if (prop === \"then\") {\n if (path.length === 0) {\n return { then: () => proxy };\n }\n const r = requestResponseMessage(ep, {\n type: MessageType.GET,\n path: path.map(p => p.toString())\n }).then(fromWireValue);\n return r.then.bind(r);\n }\n return createProxy(ep, [...path, prop]);\n },\n set(_target, prop, rawValue) {\n throwIfProxyReleased(isProxyReleased);\n // FIXME: ES6 Proxy Handler `set` methods are supposed to return a\n // boolean. To show good will, we return true asynchronously ¯\\_(ツ)_/¯\n const [value, transferables] = toWireValue(rawValue);\n return requestResponseMessage(\n ep,\n {\n type: MessageType.SET,\n path: [...path, prop].map(p => p.toString()),\n value\n },\n transferables\n ).then(fromWireValue) as any;\n },\n apply(_target, _thisArg, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const last = path[path.length - 1];\n if ((last as any) === createEndpoint) {\n return requestResponseMessage(ep, {\n type: MessageType.ENDPOINT\n }).then(fromWireValue);\n }\n // We just pretend that `bind()` didn’t happen.\n if (last === \"bind\") {\n return createProxy(ep, path.slice(0, -1));\n }\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(\n ep,\n {\n type: MessageType.APPLY,\n path: path.map(p => p.toString()),\n argumentList\n },\n transferables\n ).then(fromWireValue);\n },\n construct(_target, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(\n ep,\n {\n type: MessageType.CONSTRUCT,\n path: path.map(p => p.toString()),\n argumentList\n },\n transferables\n ).then(fromWireValue);\n }\n });\n return proxy as any;\n}\n\nfunction myFlat<T>(arr: (T | T[])[]): T[] {\n return Array.prototype.concat.apply([], arr);\n}\n\nfunction processArguments(argumentList: any[]): [WireValue[], Transferable[]] {\n const processed = argumentList.map(toWireValue);\n return [processed.map(v => v[0]), myFlat(processed.map(v => v[1]))];\n}\n\nconst transferCache = new WeakMap<any, Transferable[]>();\nexport function transfer(obj: any, transfers: Transferable[]) {\n transferCache.set(obj, transfers);\n return obj;\n}\n\nexport function proxy<T>(obj: T): T & { [proxyMarker]: true } {\n return Object.assign(obj, { [proxyMarker]: true }) as any;\n}\n\nexport function windowEndpoint(\n w: PostMessageWithOrigin,\n context: EventSource = self\n): Endpoint {\n return {\n postMessage: (msg: any, transferables: Transferable[]) =>\n w.postMessage(msg, \"*\", transferables),\n addEventListener: context.addEventListener.bind(context),\n removeEventListener: context.removeEventListener.bind(context)\n };\n}\n\nfunction toWireValue(value: any): [WireValue, Transferable[]] {\n for (const [name, handler] of transferHandlers) {\n if (handler.canHandle(value)) {\n const [serializedValue, transferables] = handler.serialize(value);\n return [\n {\n type: WireValueType.HANDLER,\n name,\n value: serializedValue\n },\n transferables\n ];\n }\n }\n return [\n {\n type: WireValueType.RAW,\n value\n },\n transferCache.get(value) || []\n ];\n}\n\nfunction fromWireValue(value: WireValue): any {\n switch (value.type) {\n case WireValueType.HANDLER:\n return transferHandlers.get(value.name)!.deserialize(value.value);\n case WireValueType.RAW:\n return value.value;\n }\n}\n\nfunction requestResponseMessage(\n ep: Endpoint,\n msg: Message,\n transfers?: Transferable[]\n): Promise<WireValue> {\n return new Promise(resolve => {\n const id = generateUUID();\n ep.addEventListener(\"message\", function l(ev: MessageEvent) {\n if (!ev.data || !ev.data.id || ev.data.id !== id) {\n return;\n }\n ep.removeEventListener(\"message\", l as any);\n resolve(ev.data);\n } as any);\n if (ep.start) {\n ep.start();\n }\n ep.postMessage({ id, ...msg }, transfers);\n });\n}\n\nfunction generateUUID(): string {\n return new Array(4)\n .fill(0)\n .map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16))\n .join(\"-\");\n}\n"],"names":[],"mappings":"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"} |
@@ -48,3 +48,4 @@ /** | ||
| CONSTRUCT = 3, | ||
| ENDPOINT = 4 | ||
| ENDPOINT = 4, | ||
| RELEASE = 5 | ||
| } | ||
@@ -78,2 +79,7 @@ export interface GetMessage { | ||
| } | ||
| export declare type Message = GetMessage | SetMessage | ApplyMessage | ConstructMessage | EndpointMessage; | ||
| export interface ReleaseMessage { | ||
| id?: MessageID; | ||
| type: MessageType.RELEASE; | ||
| path: string[]; | ||
| } | ||
| export declare type Message = GetMessage | SetMessage | ApplyMessage | ConstructMessage | EndpointMessage | ReleaseMessage; |
@@ -17,2 +17,3 @@ /** | ||
| export declare const createEndpoint: unique symbol; | ||
| export declare const releaseProxy: unique symbol; | ||
| declare type Promisify<T> = T extends { | ||
@@ -19,0 +20,0 @@ [proxyMarker]: boolean; |
+42
-4
@@ -21,2 +21,3 @@ (function (global, factory) { | ||
| const createEndpoint = Symbol("Comlink.endpoint"); | ||
| const releaseProxy = Symbol("Comlink.releaseProxy"); | ||
| const throwSet = new WeakSet(); | ||
@@ -65,3 +66,3 @@ const transferHandlers = new Map([ | ||
| function expose(obj, ep = self) { | ||
| ep.addEventListener("message", (async (ev) => { | ||
| ep.addEventListener("message", async function callback(ev) { | ||
| if (!ev || !ev.data) { | ||
@@ -109,4 +110,7 @@ return; | ||
| break; | ||
| default: | ||
| console.warn("Unrecognized message", ev.data); | ||
| case 5 /* RELEASE */: | ||
| { | ||
| returnValue = undefined; | ||
| } | ||
| break; | ||
| } | ||
@@ -120,3 +124,8 @@ } | ||
| ep.postMessage({ ...wireValue, id }, transferables); | ||
| })); | ||
| if (type === 5 /* RELEASE */) { | ||
| // detach and deactive after sending release response above. | ||
| ep.removeEventListener("message", callback); | ||
| closeEndPoint(ep); | ||
| } | ||
| }); | ||
| if (ep.start) { | ||
@@ -126,8 +135,33 @@ ep.start(); | ||
| } | ||
| function isMessagePort(endpoint) { | ||
| return endpoint.constructor.name === "MessagePort"; | ||
| } | ||
| function closeEndPoint(endpoint) { | ||
| if (isMessagePort(endpoint)) | ||
| endpoint.close(); | ||
| } | ||
| function wrap(ep) { | ||
| return createProxy(ep); | ||
| } | ||
| function throwIfProxyReleased(isReleased) { | ||
| if (isReleased) { | ||
| throw new Error("Proxy has been released and is not useable"); | ||
| } | ||
| } | ||
| function createProxy(ep, path = []) { | ||
| let isProxyReleased = false; | ||
| const proxy = new Proxy(function () { }, { | ||
| get(_target, prop) { | ||
| throwIfProxyReleased(isProxyReleased); | ||
| if (prop === releaseProxy) { | ||
| return () => { | ||
| return requestResponseMessage(ep, { | ||
| type: 5 /* RELEASE */, | ||
| path: path.map(p => p.toString()) | ||
| }).then(() => { | ||
| closeEndPoint(ep); | ||
| isProxyReleased = true; | ||
| }); | ||
| }; | ||
| } | ||
| if (prop === "then") { | ||
@@ -146,2 +180,3 @@ if (path.length === 0) { | ||
| set(_target, prop, rawValue) { | ||
| throwIfProxyReleased(isProxyReleased); | ||
| // FIXME: ES6 Proxy Handler `set` methods are supposed to return a | ||
@@ -157,2 +192,3 @@ // boolean. To show good will, we return true asynchronously ¯\_(ツ)_/¯ | ||
| apply(_target, _thisArg, rawArgumentList) { | ||
| throwIfProxyReleased(isProxyReleased); | ||
| const last = path[path.length - 1]; | ||
@@ -176,2 +212,3 @@ if (last === createEndpoint) { | ||
| construct(_target, rawArgumentList) { | ||
| throwIfProxyReleased(isProxyReleased); | ||
| const [argumentList, transferables] = processArguments(rawArgumentList); | ||
@@ -266,2 +303,3 @@ return requestResponseMessage(ep, { | ||
| exports.proxyMarker = proxyMarker; | ||
| exports.releaseProxy = releaseProxy; | ||
| exports.transfer = transfer; | ||
@@ -268,0 +306,0 @@ exports.transferHandlers = transferHandlers; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"comlink.js","sources":["../../src/comlink.ts"],"sourcesContent":["/**\n * Copyright 2019 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n Endpoint,\n EventSource,\n Message,\n MessageType,\n PostMessageWithOrigin,\n WireValue,\n WireValueType\n} from \"./protocol.js\";\nexport { Endpoint };\n\nexport const proxyMarker = Symbol(\"Comlink.proxy\");\nexport const createEndpoint = Symbol(\"Comlink.endpoint\");\nconst throwSet = new WeakSet();\n\n// prettier-ignore\ntype Promisify<T> = T extends { [proxyMarker]: boolean }\n ? Promise<Remote<T>>\n : T extends Promise<any>\n ? T\n : T extends (...args: infer R1) => infer R2\n ? (...args: R1) => Promisify<R2>\n : Promise<T>;\n\n// prettier-ignore\nexport type Remote<T> =\n (\n T extends (...args: infer R1) => infer R2\n ? (...args: R1) => Promisify<R2>\n : { [K in keyof T]: Promisify<T[K]> }\n ) & (\n T extends { new (...args: infer R1): infer R2 }\n ? { new (...args: R1): Promise<Remote<R2>> }\n : unknown\n );\n\nexport interface TransferHandler {\n canHandle(obj: any): boolean;\n serialize(obj: any): [any, Transferable[]];\n deserialize(obj: any): any;\n}\n\nexport const transferHandlers = new Map<string, TransferHandler>([\n [\n \"proxy\",\n {\n canHandle: obj => obj && obj[proxyMarker],\n serialize(obj) {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port1);\n return [port2, [port2]];\n },\n deserialize: (port: MessagePort) => {\n port.start();\n return wrap(port);\n }\n }\n ],\n [\n \"throw\",\n {\n canHandle: obj => throwSet.has(obj),\n serialize(obj) {\n const isError = obj instanceof Error;\n let serialized = obj;\n if (isError) {\n serialized = {\n isError,\n message: obj.message,\n stack: obj.stack\n };\n }\n return [serialized, []];\n },\n deserialize(obj) {\n if ((obj as any).isError) {\n throw Object.assign(new Error(), obj);\n }\n throw obj;\n }\n }\n ]\n]);\n\nexport function expose(obj: any, ep: Endpoint = self as any) {\n ep.addEventListener(\"message\", (async (ev: MessageEvent) => {\n if (!ev || !ev.data) {\n return;\n }\n const { id, type, path } = {\n path: [] as string[],\n ...(ev.data as Message)\n };\n const argumentList = (ev.data.argumentList || []).map(fromWireValue);\n let returnValue;\n try {\n const parent = path.slice(0, -1).reduce((obj, prop) => obj[prop], obj);\n const rawValue = path.reduce((obj, prop) => obj[prop], obj);\n switch (type) {\n case MessageType.GET:\n {\n returnValue = await rawValue;\n }\n break;\n case MessageType.SET:\n {\n parent[path.slice(-1)[0]] = fromWireValue(ev.data.value);\n returnValue = true;\n }\n break;\n case MessageType.APPLY:\n {\n returnValue = await rawValue.apply(parent, argumentList);\n }\n break;\n case MessageType.CONSTRUCT:\n {\n const value = await new rawValue(...argumentList);\n returnValue = proxy(value);\n }\n break;\n case MessageType.ENDPOINT:\n {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port2);\n returnValue = transfer(port1, [port1]);\n }\n break;\n default:\n console.warn(\"Unrecognized message\", ev.data);\n }\n } catch (e) {\n returnValue = e;\n throwSet.add(e);\n }\n const [wireValue, transferables] = toWireValue(returnValue);\n ep.postMessage({ ...wireValue, id }, transferables);\n }) as any);\n if (ep.start) {\n ep.start();\n }\n}\n\nexport function wrap<T>(ep: Endpoint): Remote<T> {\n return createProxy<T>(ep) as any;\n}\n\nfunction createProxy<T>(\n ep: Endpoint,\n path: (string | number | symbol)[] = []\n): Remote<T> {\n const proxy: Function = new Proxy(function() {}, {\n get(_target, prop) {\n if (prop === \"then\") {\n if (path.length === 0) {\n return { then: () => proxy };\n }\n const r = requestResponseMessage(ep, {\n type: MessageType.GET,\n path: path.map(p => p.toString())\n }).then(fromWireValue);\n return r.then.bind(r);\n }\n return createProxy(ep, [...path, prop]);\n },\n set(_target, prop, rawValue) {\n // FIXME: ES6 Proxy Handler `set` methods are supposed to return a\n // boolean. To show good will, we return true asynchronously ¯\\_(ツ)_/¯\n const [value, transferables] = toWireValue(rawValue);\n return requestResponseMessage(\n ep,\n {\n type: MessageType.SET,\n path: [...path, prop].map(p => p.toString()),\n value\n },\n transferables\n ).then(fromWireValue) as any;\n },\n apply(_target, _thisArg, rawArgumentList) {\n const last = path[path.length - 1];\n if ((last as any) === createEndpoint) {\n return requestResponseMessage(ep, {\n type: MessageType.ENDPOINT\n }).then(fromWireValue);\n }\n // We just pretend that `bind()` didn’t happen.\n if (last === \"bind\") {\n return createProxy(ep, path.slice(0, -1));\n }\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(\n ep,\n {\n type: MessageType.APPLY,\n path: path.map(p => p.toString()),\n argumentList\n },\n transferables\n ).then(fromWireValue);\n },\n construct(_target, rawArgumentList) {\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(\n ep,\n {\n type: MessageType.CONSTRUCT,\n path: path.map(p => p.toString()),\n argumentList\n },\n transferables\n ).then(fromWireValue);\n }\n });\n return proxy as any;\n}\n\nfunction myFlat<T>(arr: (T | T[])[]): T[] {\n return Array.prototype.concat.apply([], arr);\n}\n\nfunction processArguments(argumentList: any[]): [WireValue[], Transferable[]] {\n const processed = argumentList.map(toWireValue);\n return [processed.map(v => v[0]), myFlat(processed.map(v => v[1]))];\n}\n\nconst transferCache = new WeakMap<any, Transferable[]>();\nexport function transfer(obj: any, transfers: Transferable[]) {\n transferCache.set(obj, transfers);\n return obj;\n}\n\nexport function proxy<T>(obj: T): T & { [proxyMarker]: true } {\n return Object.assign(obj, { [proxyMarker]: true }) as any;\n}\n\nexport function windowEndpoint(\n w: PostMessageWithOrigin,\n context: EventSource = self\n): Endpoint {\n return {\n postMessage: (msg: any, transferables: Transferable[]) =>\n w.postMessage(msg, \"*\", transferables),\n addEventListener: context.addEventListener.bind(context),\n removeEventListener: context.removeEventListener.bind(context)\n };\n}\n\nfunction toWireValue(value: any): [WireValue, Transferable[]] {\n for (const [name, handler] of transferHandlers) {\n if (handler.canHandle(value)) {\n const [serializedValue, transferables] = handler.serialize(value);\n return [\n {\n type: WireValueType.HANDLER,\n name,\n value: serializedValue\n },\n transferables\n ];\n }\n }\n return [\n {\n type: WireValueType.RAW,\n value\n },\n transferCache.get(value) || []\n ];\n}\n\nfunction fromWireValue(value: WireValue): any {\n switch (value.type) {\n case WireValueType.HANDLER:\n return transferHandlers.get(value.name)!.deserialize(value.value);\n case WireValueType.RAW:\n return value.value;\n }\n}\n\nfunction requestResponseMessage(\n ep: Endpoint,\n msg: Message,\n transfers?: Transferable[]\n): Promise<WireValue> {\n return new Promise(resolve => {\n const id = generateUUID();\n ep.addEventListener(\"message\", function l(ev: MessageEvent) {\n if (!ev.data || !ev.data.id || ev.data.id !== id) {\n return;\n }\n ep.removeEventListener(\"message\", l as any);\n resolve(ev.data);\n } as any);\n if (ep.start) {\n ep.start();\n }\n ep.postMessage({ id, ...msg }, transfers);\n });\n}\n\nfunction generateUUID(): string {\n return new Array(4)\n .fill(0)\n .map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16))\n .join(\"-\");\n}\n"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"comlink.js","sources":["../../src/comlink.ts"],"sourcesContent":["/**\n * Copyright 2019 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n Endpoint,\n EventSource,\n Message,\n MessageType,\n PostMessageWithOrigin,\n WireValue,\n WireValueType\n} from \"./protocol.js\";\nexport { Endpoint };\n\nexport const proxyMarker = Symbol(\"Comlink.proxy\");\nexport const createEndpoint = Symbol(\"Comlink.endpoint\");\nexport const releaseProxy = Symbol(\"Comlink.releaseProxy\");\nconst throwSet = new WeakSet();\n\n// prettier-ignore\ntype Promisify<T> = T extends { [proxyMarker]: boolean }\n ? Promise<Remote<T>>\n : T extends Promise<any>\n ? T\n : T extends (...args: infer R1) => infer R2\n ? (...args: R1) => Promisify<R2>\n : Promise<T>;\n\n// prettier-ignore\nexport type Remote<T> =\n (\n T extends (...args: infer R1) => infer R2\n ? (...args: R1) => Promisify<R2>\n : { [K in keyof T]: Promisify<T[K]> }\n ) & (\n T extends { new (...args: infer R1): infer R2 }\n ? { new (...args: R1): Promise<Remote<R2>> }\n : unknown\n );\n\nexport interface TransferHandler {\n canHandle(obj: any): boolean;\n serialize(obj: any): [any, Transferable[]];\n deserialize(obj: any): any;\n}\n\nexport const transferHandlers = new Map<string, TransferHandler>([\n [\n \"proxy\",\n {\n canHandle: obj => obj && obj[proxyMarker],\n serialize(obj) {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port1);\n return [port2, [port2]];\n },\n deserialize: (port: MessagePort) => {\n port.start();\n return wrap(port);\n }\n }\n ],\n [\n \"throw\",\n {\n canHandle: obj => throwSet.has(obj),\n serialize(obj) {\n const isError = obj instanceof Error;\n let serialized = obj;\n if (isError) {\n serialized = {\n isError,\n message: obj.message,\n stack: obj.stack\n };\n }\n return [serialized, []];\n },\n deserialize(obj) {\n if ((obj as any).isError) {\n throw Object.assign(new Error(), obj);\n }\n throw obj;\n }\n }\n ]\n]);\n\nexport function expose(obj: any, ep: Endpoint = self as any) {\n ep.addEventListener(\"message\", async function callback(ev: MessageEvent) {\n if (!ev || !ev.data) {\n return;\n }\n const { id, type, path } = {\n path: [] as string[],\n ...(ev.data as Message)\n };\n const argumentList = (ev.data.argumentList || []).map(fromWireValue);\n let returnValue;\n try {\n const parent = path.slice(0, -1).reduce((obj, prop) => obj[prop], obj);\n const rawValue = path.reduce((obj, prop) => obj[prop], obj);\n switch (type) {\n case MessageType.GET:\n {\n returnValue = await rawValue;\n }\n break;\n case MessageType.SET:\n {\n parent[path.slice(-1)[0]] = fromWireValue(ev.data.value);\n returnValue = true;\n }\n break;\n case MessageType.APPLY:\n {\n returnValue = await rawValue.apply(parent, argumentList);\n }\n break;\n case MessageType.CONSTRUCT:\n {\n const value = await new rawValue(...argumentList);\n returnValue = proxy(value);\n }\n break;\n case MessageType.ENDPOINT:\n {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port2);\n returnValue = transfer(port1, [port1]);\n }\n break;\n case MessageType.RELEASE:\n {\n returnValue = undefined;\n }\n break;\n }\n } catch (e) {\n returnValue = e;\n throwSet.add(e);\n }\n const [wireValue, transferables] = toWireValue(returnValue);\n ep.postMessage({ ...wireValue, id }, transferables);\n if (type === MessageType.RELEASE) {\n // detach and deactive after sending release response above.\n ep.removeEventListener(\"message\", callback as any);\n closeEndPoint(ep);\n }\n } as any);\n if (ep.start) {\n ep.start();\n }\n}\n\nfunction isMessagePort(endpoint: Endpoint): endpoint is MessagePort {\n return endpoint.constructor.name === \"MessagePort\";\n}\n\nfunction closeEndPoint(endpoint: Endpoint) {\n if (isMessagePort(endpoint)) endpoint.close();\n}\n\nexport function wrap<T>(ep: Endpoint): Remote<T> {\n return createProxy<T>(ep) as any;\n}\n\nfunction throwIfProxyReleased(isReleased: boolean) {\n if (isReleased) {\n throw new Error(\"Proxy has been released and is not useable\");\n }\n}\n\nfunction createProxy<T>(\n ep: Endpoint,\n path: (string | number | symbol)[] = []\n): Remote<T> {\n let isProxyReleased = false;\n const proxy = new Proxy(function() {}, {\n get(_target, prop) {\n throwIfProxyReleased(isProxyReleased);\n if (prop === releaseProxy) {\n return () => {\n return requestResponseMessage(ep, {\n type: MessageType.RELEASE,\n path: path.map(p => p.toString())\n }).then(() => {\n closeEndPoint(ep);\n isProxyReleased = true;\n });\n };\n }\n if (prop === \"then\") {\n if (path.length === 0) {\n return { then: () => proxy };\n }\n const r = requestResponseMessage(ep, {\n type: MessageType.GET,\n path: path.map(p => p.toString())\n }).then(fromWireValue);\n return r.then.bind(r);\n }\n return createProxy(ep, [...path, prop]);\n },\n set(_target, prop, rawValue) {\n throwIfProxyReleased(isProxyReleased);\n // FIXME: ES6 Proxy Handler `set` methods are supposed to return a\n // boolean. To show good will, we return true asynchronously ¯\\_(ツ)_/¯\n const [value, transferables] = toWireValue(rawValue);\n return requestResponseMessage(\n ep,\n {\n type: MessageType.SET,\n path: [...path, prop].map(p => p.toString()),\n value\n },\n transferables\n ).then(fromWireValue) as any;\n },\n apply(_target, _thisArg, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const last = path[path.length - 1];\n if ((last as any) === createEndpoint) {\n return requestResponseMessage(ep, {\n type: MessageType.ENDPOINT\n }).then(fromWireValue);\n }\n // We just pretend that `bind()` didn’t happen.\n if (last === \"bind\") {\n return createProxy(ep, path.slice(0, -1));\n }\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(\n ep,\n {\n type: MessageType.APPLY,\n path: path.map(p => p.toString()),\n argumentList\n },\n transferables\n ).then(fromWireValue);\n },\n construct(_target, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(\n ep,\n {\n type: MessageType.CONSTRUCT,\n path: path.map(p => p.toString()),\n argumentList\n },\n transferables\n ).then(fromWireValue);\n }\n });\n return proxy as any;\n}\n\nfunction myFlat<T>(arr: (T | T[])[]): T[] {\n return Array.prototype.concat.apply([], arr);\n}\n\nfunction processArguments(argumentList: any[]): [WireValue[], Transferable[]] {\n const processed = argumentList.map(toWireValue);\n return [processed.map(v => v[0]), myFlat(processed.map(v => v[1]))];\n}\n\nconst transferCache = new WeakMap<any, Transferable[]>();\nexport function transfer(obj: any, transfers: Transferable[]) {\n transferCache.set(obj, transfers);\n return obj;\n}\n\nexport function proxy<T>(obj: T): T & { [proxyMarker]: true } {\n return Object.assign(obj, { [proxyMarker]: true }) as any;\n}\n\nexport function windowEndpoint(\n w: PostMessageWithOrigin,\n context: EventSource = self\n): Endpoint {\n return {\n postMessage: (msg: any, transferables: Transferable[]) =>\n w.postMessage(msg, \"*\", transferables),\n addEventListener: context.addEventListener.bind(context),\n removeEventListener: context.removeEventListener.bind(context)\n };\n}\n\nfunction toWireValue(value: any): [WireValue, Transferable[]] {\n for (const [name, handler] of transferHandlers) {\n if (handler.canHandle(value)) {\n const [serializedValue, transferables] = handler.serialize(value);\n return [\n {\n type: WireValueType.HANDLER,\n name,\n value: serializedValue\n },\n transferables\n ];\n }\n }\n return [\n {\n type: WireValueType.RAW,\n value\n },\n transferCache.get(value) || []\n ];\n}\n\nfunction fromWireValue(value: WireValue): any {\n switch (value.type) {\n case WireValueType.HANDLER:\n return transferHandlers.get(value.name)!.deserialize(value.value);\n case WireValueType.RAW:\n return value.value;\n }\n}\n\nfunction requestResponseMessage(\n ep: Endpoint,\n msg: Message,\n transfers?: Transferable[]\n): Promise<WireValue> {\n return new Promise(resolve => {\n const id = generateUUID();\n ep.addEventListener(\"message\", function l(ev: MessageEvent) {\n if (!ev.data || !ev.data.id || ev.data.id !== id) {\n return;\n }\n ep.removeEventListener(\"message\", l as any);\n resolve(ev.data);\n } as any);\n if (ep.start) {\n ep.start();\n }\n ep.postMessage({ id, ...msg }, transfers);\n });\n}\n\nfunction generateUUID(): string {\n return new Array(4)\n .fill(0)\n .map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16))\n .join(\"-\");\n}\n"],"names":[],"mappings":"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"} |
@@ -1,2 +0,2 @@ | ||
| !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).Comlink={})}(this,function(e){"use strict";const t=Symbol("Comlink.proxy"),n=Symbol("Comlink.endpoint"),r=new WeakSet,a=new Map([["proxy",{canHandle:e=>e&&e[t],serialize(e){const{port1:t,port2:n}=new MessageChannel;return s(e,t),[n,[n]]},deserialize:e=>(e.start(),o(e))}],["throw",{canHandle:e=>r.has(e),serialize(e){const t=e instanceof Error;let n=e;return t&&(n={isError:t,message:e.message,stack:e.stack}),[n,[]]},deserialize(e){if(e.isError)throw Object.assign(new Error,e);throw e}}]]);function s(e,t=self){t.addEventListener("message",async n=>{if(!n||!n.data)return;const{id:a,type:o,path:i}={path:[],...n.data},c=(n.data.argumentList||[]).map(l);let f;try{const t=i.slice(0,-1).reduce((e,t)=>e[t],e),a=i.reduce((e,t)=>e[t],e);switch(o){case 0:f=await a;break;case 1:t[i.slice(-1)[0]]=l(n.data.value),f=!0;break;case 2:f=await a.apply(t,c);break;case 3:f=u(await new a(...c));break;case 4:{const{port1:t,port2:n}=new MessageChannel;s(e,n),f=p(t,[t])}break;default:console.warn("Unrecognized message",n.data)}}catch(e){f=e,r.add(e)}const[m,g]=d(f);t.postMessage({...m,id:a},g)}),t.start&&t.start()}function o(e){return function e(t,r=[]){const a=new Proxy(function(){},{get(n,s){if("then"===s){if(0===r.length)return{then:()=>a};const e=f(t,{type:0,path:r.map(e=>e.toString())}).then(l);return e.then.bind(e)}return e(t,[...r,s])},set(e,n,a){const[s,o]=d(a);return f(t,{type:1,path:[...r,n].map(e=>e.toString()),value:s},o).then(l)},apply(a,s,o){const c=r[r.length-1];if(c===n)return f(t,{type:4}).then(l);if("bind"===c)return e(t,r.slice(0,-1));const[p,u]=i(o);return f(t,{type:2,path:r.map(e=>e.toString()),argumentList:p},u).then(l)},construct(e,n){const[a,s]=i(n);return f(t,{type:3,path:r.map(e=>e.toString()),argumentList:a},s).then(l)}});return a}(e)}function i(e){const t=e.map(d);return[t.map(e=>e[0]),(n=t.map(e=>e[1]),Array.prototype.concat.apply([],n))];var n}const c=new WeakMap;function p(e,t){return c.set(e,t),e}function u(e){return Object.assign(e,{[t]:!0})}function d(e){for(const[t,n]of a)if(n.canHandle(e)){const[r,a]=n.serialize(e);return[{type:3,name:t,value:r},a]}return[{type:0,value:e},c.get(e)||[]]}function l(e){switch(e.type){case 3:return a.get(e.name).deserialize(e.value);case 0:return e.value}}function f(e,t,n){return new Promise(r=>{const a=new Array(4).fill(0).map(()=>Math.floor(Math.random()*Number.MAX_SAFE_INTEGER).toString(16)).join("-");e.addEventListener("message",function t(n){n.data&&n.data.id&&n.data.id===a&&(e.removeEventListener("message",t),r(n.data))}),e.start&&e.start(),e.postMessage({id:a,...t},n)})}e.createEndpoint=n,e.expose=s,e.proxy=u,e.proxyMarker=t,e.transfer=p,e.transferHandlers=a,e.windowEndpoint=function(e,t=self){return{postMessage:(t,n)=>e.postMessage(t,"*",n),addEventListener:t.addEventListener.bind(t),removeEventListener:t.removeEventListener.bind(t)}},e.wrap=o,Object.defineProperty(e,"__esModule",{value:!0})}); | ||
| !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).Comlink={})}(this,(function(e){"use strict";const t=Symbol("Comlink.proxy"),n=Symbol("Comlink.endpoint"),r=Symbol("Comlink.releaseProxy"),a=new WeakSet,s=new Map([["proxy",{canHandle:e=>e&&e[t],serialize(e){const{port1:t,port2:n}=new MessageChannel;return o(e,t),[n,[n]]},deserialize:e=>(e.start(),c(e))}],["throw",{canHandle:e=>a.has(e),serialize(e){const t=e instanceof Error;let n=e;return t&&(n={isError:t,message:e.message,stack:e.stack}),[n,[]]},deserialize(e){if(e.isError)throw Object.assign(new Error,e);throw e}}]]);function o(e,t=self){t.addEventListener("message",(async function n(r){if(!r||!r.data)return;const{id:s,type:c,path:u}={path:[],...r.data},p=(r.data.argumentList||[]).map(y);let d;try{const t=u.slice(0,-1).reduce((e,t)=>e[t],e),n=u.reduce((e,t)=>e[t],e);switch(c){case 0:d=await n;break;case 1:t[u.slice(-1)[0]]=y(r.data.value),d=!0;break;case 2:d=await n.apply(t,p);break;case 3:d=f(await new n(...p));break;case 4:{const{port1:t,port2:n}=new MessageChannel;o(e,n),d=l(t,[t])}break;case 5:d=void 0}}catch(e){d=e,a.add(e)}const[h,g]=m(d);t.postMessage({...h,id:s},g),5===c&&(t.removeEventListener("message",n),i(t))})),t.start&&t.start()}function i(e){(function(e){return"MessagePort"===e.constructor.name})(e)&&e.close()}function c(e){return function e(t,a=[]){let s=!1;const o=new Proxy((function(){}),{get(n,c){if(u(s),c===r)return()=>h(t,{type:5,path:a.map(e=>e.toString())}).then(()=>{i(t),s=!0});if("then"===c){if(0===a.length)return{then:()=>o};const e=h(t,{type:0,path:a.map(e=>e.toString())}).then(y);return e.then.bind(e)}return e(t,[...a,c])},set(e,n,r){u(s);const[o,i]=m(r);return h(t,{type:1,path:[...a,n].map(e=>e.toString()),value:o},i).then(y)},apply(r,o,i){u(s);const c=a[a.length-1];if(c===n)return h(t,{type:4}).then(y);if("bind"===c)return e(t,a.slice(0,-1));const[d,l]=p(i);return h(t,{type:2,path:a.map(e=>e.toString()),argumentList:d},l).then(y)},construct(e,n){u(s);const[r,o]=p(n);return h(t,{type:3,path:a.map(e=>e.toString()),argumentList:r},o).then(y)}});return o}(e)}function u(e){if(e)throw new Error("Proxy has been released and is not useable")}function p(e){const t=e.map(m);return[t.map(e=>e[0]),(n=t.map(e=>e[1]),Array.prototype.concat.apply([],n))];var n}const d=new WeakMap;function l(e,t){return d.set(e,t),e}function f(e){return Object.assign(e,{[t]:!0})}function m(e){for(const[t,n]of s)if(n.canHandle(e)){const[r,a]=n.serialize(e);return[{type:3,name:t,value:r},a]}return[{type:0,value:e},d.get(e)||[]]}function y(e){switch(e.type){case 3:return s.get(e.name).deserialize(e.value);case 0:return e.value}}function h(e,t,n){return new Promise(r=>{const a=new Array(4).fill(0).map(()=>Math.floor(Math.random()*Number.MAX_SAFE_INTEGER).toString(16)).join("-");e.addEventListener("message",(function t(n){n.data&&n.data.id&&n.data.id===a&&(e.removeEventListener("message",t),r(n.data))})),e.start&&e.start(),e.postMessage({id:a,...t},n)})}e.createEndpoint=n,e.expose=o,e.proxy=f,e.proxyMarker=t,e.releaseProxy=r,e.transfer=l,e.transferHandlers=s,e.windowEndpoint=function(e,t=self){return{postMessage:(t,n)=>e.postMessage(t,"*",n),addEventListener:t.addEventListener.bind(t),removeEventListener:t.removeEventListener.bind(t)}},e.wrap=c,Object.defineProperty(e,"__esModule",{value:!0})})); | ||
| //# sourceMappingURL=comlink.min.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"comlink.min.js","sources":["../../src/comlink.ts"],"sourcesContent":["/**\n * Copyright 2019 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n Endpoint,\n EventSource,\n Message,\n MessageType,\n PostMessageWithOrigin,\n WireValue,\n WireValueType\n} from \"./protocol.js\";\nexport { Endpoint };\n\nexport const proxyMarker = Symbol(\"Comlink.proxy\");\nexport const createEndpoint = Symbol(\"Comlink.endpoint\");\nconst throwSet = new WeakSet();\n\n// prettier-ignore\ntype Promisify<T> = T extends { [proxyMarker]: boolean }\n ? Promise<Remote<T>>\n : T extends Promise<any>\n ? T\n : T extends (...args: infer R1) => infer R2\n ? (...args: R1) => Promisify<R2>\n : Promise<T>;\n\n// prettier-ignore\nexport type Remote<T> =\n (\n T extends (...args: infer R1) => infer R2\n ? (...args: R1) => Promisify<R2>\n : { [K in keyof T]: Promisify<T[K]> }\n ) & (\n T extends { new (...args: infer R1): infer R2 }\n ? { new (...args: R1): Promise<Remote<R2>> }\n : unknown\n );\n\nexport interface TransferHandler {\n canHandle(obj: any): boolean;\n serialize(obj: any): [any, Transferable[]];\n deserialize(obj: any): any;\n}\n\nexport const transferHandlers = new Map<string, TransferHandler>([\n [\n \"proxy\",\n {\n canHandle: obj => obj && obj[proxyMarker],\n serialize(obj) {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port1);\n return [port2, [port2]];\n },\n deserialize: (port: MessagePort) => {\n port.start();\n return wrap(port);\n }\n }\n ],\n [\n \"throw\",\n {\n canHandle: obj => throwSet.has(obj),\n serialize(obj) {\n const isError = obj instanceof Error;\n let serialized = obj;\n if (isError) {\n serialized = {\n isError,\n message: obj.message,\n stack: obj.stack\n };\n }\n return [serialized, []];\n },\n deserialize(obj) {\n if ((obj as any).isError) {\n throw Object.assign(new Error(), obj);\n }\n throw obj;\n }\n }\n ]\n]);\n\nexport function expose(obj: any, ep: Endpoint = self as any) {\n ep.addEventListener(\"message\", (async (ev: MessageEvent) => {\n if (!ev || !ev.data) {\n return;\n }\n const { id, type, path } = {\n path: [] as string[],\n ...(ev.data as Message)\n };\n const argumentList = (ev.data.argumentList || []).map(fromWireValue);\n let returnValue;\n try {\n const parent = path.slice(0, -1).reduce((obj, prop) => obj[prop], obj);\n const rawValue = path.reduce((obj, prop) => obj[prop], obj);\n switch (type) {\n case MessageType.GET:\n {\n returnValue = await rawValue;\n }\n break;\n case MessageType.SET:\n {\n parent[path.slice(-1)[0]] = fromWireValue(ev.data.value);\n returnValue = true;\n }\n break;\n case MessageType.APPLY:\n {\n returnValue = await rawValue.apply(parent, argumentList);\n }\n break;\n case MessageType.CONSTRUCT:\n {\n const value = await new rawValue(...argumentList);\n returnValue = proxy(value);\n }\n break;\n case MessageType.ENDPOINT:\n {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port2);\n returnValue = transfer(port1, [port1]);\n }\n break;\n default:\n console.warn(\"Unrecognized message\", ev.data);\n }\n } catch (e) {\n returnValue = e;\n throwSet.add(e);\n }\n const [wireValue, transferables] = toWireValue(returnValue);\n ep.postMessage({ ...wireValue, id }, transferables);\n }) as any);\n if (ep.start) {\n ep.start();\n }\n}\n\nexport function wrap<T>(ep: Endpoint): Remote<T> {\n return createProxy<T>(ep) as any;\n}\n\nfunction createProxy<T>(\n ep: Endpoint,\n path: (string | number | symbol)[] = []\n): Remote<T> {\n const proxy: Function = new Proxy(function() {}, {\n get(_target, prop) {\n if (prop === \"then\") {\n if (path.length === 0) {\n return { then: () => proxy };\n }\n const r = requestResponseMessage(ep, {\n type: MessageType.GET,\n path: path.map(p => p.toString())\n }).then(fromWireValue);\n return r.then.bind(r);\n }\n return createProxy(ep, [...path, prop]);\n },\n set(_target, prop, rawValue) {\n // FIXME: ES6 Proxy Handler `set` methods are supposed to return a\n // boolean. To show good will, we return true asynchronously ¯\\_(ツ)_/¯\n const [value, transferables] = toWireValue(rawValue);\n return requestResponseMessage(\n ep,\n {\n type: MessageType.SET,\n path: [...path, prop].map(p => p.toString()),\n value\n },\n transferables\n ).then(fromWireValue) as any;\n },\n apply(_target, _thisArg, rawArgumentList) {\n const last = path[path.length - 1];\n if ((last as any) === createEndpoint) {\n return requestResponseMessage(ep, {\n type: MessageType.ENDPOINT\n }).then(fromWireValue);\n }\n // We just pretend that `bind()` didn’t happen.\n if (last === \"bind\") {\n return createProxy(ep, path.slice(0, -1));\n }\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(\n ep,\n {\n type: MessageType.APPLY,\n path: path.map(p => p.toString()),\n argumentList\n },\n transferables\n ).then(fromWireValue);\n },\n construct(_target, rawArgumentList) {\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(\n ep,\n {\n type: MessageType.CONSTRUCT,\n path: path.map(p => p.toString()),\n argumentList\n },\n transferables\n ).then(fromWireValue);\n }\n });\n return proxy as any;\n}\n\nfunction myFlat<T>(arr: (T | T[])[]): T[] {\n return Array.prototype.concat.apply([], arr);\n}\n\nfunction processArguments(argumentList: any[]): [WireValue[], Transferable[]] {\n const processed = argumentList.map(toWireValue);\n return [processed.map(v => v[0]), myFlat(processed.map(v => v[1]))];\n}\n\nconst transferCache = new WeakMap<any, Transferable[]>();\nexport function transfer(obj: any, transfers: Transferable[]) {\n transferCache.set(obj, transfers);\n return obj;\n}\n\nexport function proxy<T>(obj: T): T & { [proxyMarker]: true } {\n return Object.assign(obj, { [proxyMarker]: true }) as any;\n}\n\nexport function windowEndpoint(\n w: PostMessageWithOrigin,\n context: EventSource = self\n): Endpoint {\n return {\n postMessage: (msg: any, transferables: Transferable[]) =>\n w.postMessage(msg, \"*\", transferables),\n addEventListener: context.addEventListener.bind(context),\n removeEventListener: context.removeEventListener.bind(context)\n };\n}\n\nfunction toWireValue(value: any): [WireValue, Transferable[]] {\n for (const [name, handler] of transferHandlers) {\n if (handler.canHandle(value)) {\n const [serializedValue, transferables] = handler.serialize(value);\n return [\n {\n type: WireValueType.HANDLER,\n name,\n value: serializedValue\n },\n transferables\n ];\n }\n }\n return [\n {\n type: WireValueType.RAW,\n value\n },\n transferCache.get(value) || []\n ];\n}\n\nfunction fromWireValue(value: WireValue): any {\n switch (value.type) {\n case WireValueType.HANDLER:\n return transferHandlers.get(value.name)!.deserialize(value.value);\n case WireValueType.RAW:\n return value.value;\n }\n}\n\nfunction requestResponseMessage(\n ep: Endpoint,\n msg: Message,\n transfers?: Transferable[]\n): Promise<WireValue> {\n return new Promise(resolve => {\n const id = generateUUID();\n ep.addEventListener(\"message\", function l(ev: MessageEvent) {\n if (!ev.data || !ev.data.id || ev.data.id !== id) {\n return;\n }\n ep.removeEventListener(\"message\", l as any);\n resolve(ev.data);\n } as any);\n if (ep.start) {\n ep.start();\n }\n ep.postMessage({ id, ...msg }, transfers);\n });\n}\n\nfunction generateUUID(): string {\n return new Array(4)\n .fill(0)\n .map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16))\n .join(\"-\");\n}\n"],"names":["proxyMarker","Symbol","createEndpoint","throwSet","WeakSet","transferHandlers","Map","canHandle","obj","[object Object]","port1","port2","MessageChannel","expose","deserialize","port","start","wrap","has","isError","Error","serialized","message","stack","Object","assign","ep","self","addEventListener","ev","data","id","type","path","argumentList","map","fromWireValue","returnValue","parent","slice","reduce","prop","rawValue","value","apply","proxy","transfer","console","warn","e","add","wireValue","transferables","toWireValue","postMessage","createProxy","Proxy","_target","length","then","r","requestResponseMessage","p","toString","bind","_thisArg","rawArgumentList","last","processArguments","processed","v","arr","Array","prototype","concat","transferCache","WeakMap","transfers","set","name","handler","serializedValue","serialize","get","msg","Promise","resolve","fill","Math","floor","random","Number","MAX_SAFE_INTEGER","join","l","removeEventListener","w","context"],"mappings":"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"} | ||
| {"version":3,"file":"comlink.min.js","sources":["../../src/comlink.ts"],"sourcesContent":["/**\n * Copyright 2019 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n Endpoint,\n EventSource,\n Message,\n MessageType,\n PostMessageWithOrigin,\n WireValue,\n WireValueType\n} from \"./protocol.js\";\nexport { Endpoint };\n\nexport const proxyMarker = Symbol(\"Comlink.proxy\");\nexport const createEndpoint = Symbol(\"Comlink.endpoint\");\nexport const releaseProxy = Symbol(\"Comlink.releaseProxy\");\nconst throwSet = new WeakSet();\n\n// prettier-ignore\ntype Promisify<T> = T extends { [proxyMarker]: boolean }\n ? Promise<Remote<T>>\n : T extends Promise<any>\n ? T\n : T extends (...args: infer R1) => infer R2\n ? (...args: R1) => Promisify<R2>\n : Promise<T>;\n\n// prettier-ignore\nexport type Remote<T> =\n (\n T extends (...args: infer R1) => infer R2\n ? (...args: R1) => Promisify<R2>\n : { [K in keyof T]: Promisify<T[K]> }\n ) & (\n T extends { new (...args: infer R1): infer R2 }\n ? { new (...args: R1): Promise<Remote<R2>> }\n : unknown\n );\n\nexport interface TransferHandler {\n canHandle(obj: any): boolean;\n serialize(obj: any): [any, Transferable[]];\n deserialize(obj: any): any;\n}\n\nexport const transferHandlers = new Map<string, TransferHandler>([\n [\n \"proxy\",\n {\n canHandle: obj => obj && obj[proxyMarker],\n serialize(obj) {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port1);\n return [port2, [port2]];\n },\n deserialize: (port: MessagePort) => {\n port.start();\n return wrap(port);\n }\n }\n ],\n [\n \"throw\",\n {\n canHandle: obj => throwSet.has(obj),\n serialize(obj) {\n const isError = obj instanceof Error;\n let serialized = obj;\n if (isError) {\n serialized = {\n isError,\n message: obj.message,\n stack: obj.stack\n };\n }\n return [serialized, []];\n },\n deserialize(obj) {\n if ((obj as any).isError) {\n throw Object.assign(new Error(), obj);\n }\n throw obj;\n }\n }\n ]\n]);\n\nexport function expose(obj: any, ep: Endpoint = self as any) {\n ep.addEventListener(\"message\", async function callback(ev: MessageEvent) {\n if (!ev || !ev.data) {\n return;\n }\n const { id, type, path } = {\n path: [] as string[],\n ...(ev.data as Message)\n };\n const argumentList = (ev.data.argumentList || []).map(fromWireValue);\n let returnValue;\n try {\n const parent = path.slice(0, -1).reduce((obj, prop) => obj[prop], obj);\n const rawValue = path.reduce((obj, prop) => obj[prop], obj);\n switch (type) {\n case MessageType.GET:\n {\n returnValue = await rawValue;\n }\n break;\n case MessageType.SET:\n {\n parent[path.slice(-1)[0]] = fromWireValue(ev.data.value);\n returnValue = true;\n }\n break;\n case MessageType.APPLY:\n {\n returnValue = await rawValue.apply(parent, argumentList);\n }\n break;\n case MessageType.CONSTRUCT:\n {\n const value = await new rawValue(...argumentList);\n returnValue = proxy(value);\n }\n break;\n case MessageType.ENDPOINT:\n {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port2);\n returnValue = transfer(port1, [port1]);\n }\n break;\n case MessageType.RELEASE:\n {\n returnValue = undefined;\n }\n break;\n }\n } catch (e) {\n returnValue = e;\n throwSet.add(e);\n }\n const [wireValue, transferables] = toWireValue(returnValue);\n ep.postMessage({ ...wireValue, id }, transferables);\n if (type === MessageType.RELEASE) {\n // detach and deactive after sending release response above.\n ep.removeEventListener(\"message\", callback as any);\n closeEndPoint(ep);\n }\n } as any);\n if (ep.start) {\n ep.start();\n }\n}\n\nfunction isMessagePort(endpoint: Endpoint): endpoint is MessagePort {\n return endpoint.constructor.name === \"MessagePort\";\n}\n\nfunction closeEndPoint(endpoint: Endpoint) {\n if (isMessagePort(endpoint)) endpoint.close();\n}\n\nexport function wrap<T>(ep: Endpoint): Remote<T> {\n return createProxy<T>(ep) as any;\n}\n\nfunction throwIfProxyReleased(isReleased: boolean) {\n if (isReleased) {\n throw new Error(\"Proxy has been released and is not useable\");\n }\n}\n\nfunction createProxy<T>(\n ep: Endpoint,\n path: (string | number | symbol)[] = []\n): Remote<T> {\n let isProxyReleased = false;\n const proxy = new Proxy(function() {}, {\n get(_target, prop) {\n throwIfProxyReleased(isProxyReleased);\n if (prop === releaseProxy) {\n return () => {\n return requestResponseMessage(ep, {\n type: MessageType.RELEASE,\n path: path.map(p => p.toString())\n }).then(() => {\n closeEndPoint(ep);\n isProxyReleased = true;\n });\n };\n }\n if (prop === \"then\") {\n if (path.length === 0) {\n return { then: () => proxy };\n }\n const r = requestResponseMessage(ep, {\n type: MessageType.GET,\n path: path.map(p => p.toString())\n }).then(fromWireValue);\n return r.then.bind(r);\n }\n return createProxy(ep, [...path, prop]);\n },\n set(_target, prop, rawValue) {\n throwIfProxyReleased(isProxyReleased);\n // FIXME: ES6 Proxy Handler `set` methods are supposed to return a\n // boolean. To show good will, we return true asynchronously ¯\\_(ツ)_/¯\n const [value, transferables] = toWireValue(rawValue);\n return requestResponseMessage(\n ep,\n {\n type: MessageType.SET,\n path: [...path, prop].map(p => p.toString()),\n value\n },\n transferables\n ).then(fromWireValue) as any;\n },\n apply(_target, _thisArg, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const last = path[path.length - 1];\n if ((last as any) === createEndpoint) {\n return requestResponseMessage(ep, {\n type: MessageType.ENDPOINT\n }).then(fromWireValue);\n }\n // We just pretend that `bind()` didn’t happen.\n if (last === \"bind\") {\n return createProxy(ep, path.slice(0, -1));\n }\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(\n ep,\n {\n type: MessageType.APPLY,\n path: path.map(p => p.toString()),\n argumentList\n },\n transferables\n ).then(fromWireValue);\n },\n construct(_target, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(\n ep,\n {\n type: MessageType.CONSTRUCT,\n path: path.map(p => p.toString()),\n argumentList\n },\n transferables\n ).then(fromWireValue);\n }\n });\n return proxy as any;\n}\n\nfunction myFlat<T>(arr: (T | T[])[]): T[] {\n return Array.prototype.concat.apply([], arr);\n}\n\nfunction processArguments(argumentList: any[]): [WireValue[], Transferable[]] {\n const processed = argumentList.map(toWireValue);\n return [processed.map(v => v[0]), myFlat(processed.map(v => v[1]))];\n}\n\nconst transferCache = new WeakMap<any, Transferable[]>();\nexport function transfer(obj: any, transfers: Transferable[]) {\n transferCache.set(obj, transfers);\n return obj;\n}\n\nexport function proxy<T>(obj: T): T & { [proxyMarker]: true } {\n return Object.assign(obj, { [proxyMarker]: true }) as any;\n}\n\nexport function windowEndpoint(\n w: PostMessageWithOrigin,\n context: EventSource = self\n): Endpoint {\n return {\n postMessage: (msg: any, transferables: Transferable[]) =>\n w.postMessage(msg, \"*\", transferables),\n addEventListener: context.addEventListener.bind(context),\n removeEventListener: context.removeEventListener.bind(context)\n };\n}\n\nfunction toWireValue(value: any): [WireValue, Transferable[]] {\n for (const [name, handler] of transferHandlers) {\n if (handler.canHandle(value)) {\n const [serializedValue, transferables] = handler.serialize(value);\n return [\n {\n type: WireValueType.HANDLER,\n name,\n value: serializedValue\n },\n transferables\n ];\n }\n }\n return [\n {\n type: WireValueType.RAW,\n value\n },\n transferCache.get(value) || []\n ];\n}\n\nfunction fromWireValue(value: WireValue): any {\n switch (value.type) {\n case WireValueType.HANDLER:\n return transferHandlers.get(value.name)!.deserialize(value.value);\n case WireValueType.RAW:\n return value.value;\n }\n}\n\nfunction requestResponseMessage(\n ep: Endpoint,\n msg: Message,\n transfers?: Transferable[]\n): Promise<WireValue> {\n return new Promise(resolve => {\n const id = generateUUID();\n ep.addEventListener(\"message\", function l(ev: MessageEvent) {\n if (!ev.data || !ev.data.id || ev.data.id !== id) {\n return;\n }\n ep.removeEventListener(\"message\", l as any);\n resolve(ev.data);\n } as any);\n if (ep.start) {\n ep.start();\n }\n ep.postMessage({ id, ...msg }, transfers);\n });\n}\n\nfunction generateUUID(): string {\n return new Array(4)\n .fill(0)\n .map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16))\n .join(\"-\");\n}\n"],"names":["proxyMarker","Symbol","createEndpoint","releaseProxy","throwSet","WeakSet","transferHandlers","Map","canHandle","obj","[object Object]","port1","port2","MessageChannel","expose","deserialize","port","start","wrap","has","isError","Error","serialized","message","stack","Object","assign","ep","self","addEventListener","async","callback","ev","data","id","type","path","argumentList","map","fromWireValue","returnValue","parent","slice","reduce","prop","rawValue","value","apply","proxy","transfer","undefined","e","add","wireValue","transferables","toWireValue","postMessage","removeEventListener","closeEndPoint","endpoint","constructor","name","isMessagePort","close","createProxy","isProxyReleased","Proxy","_target","throwIfProxyReleased","requestResponseMessage","p","toString","then","length","r","bind","_thisArg","rawArgumentList","last","processArguments","isReleased","processed","v","arr","Array","prototype","concat","transferCache","WeakMap","transfers","set","handler","serializedValue","serialize","get","msg","Promise","resolve","fill","Math","floor","random","Number","MAX_SAFE_INTEGER","join","l","w","context"],"mappings":"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"} |
@@ -1,2 +0,2 @@ | ||
| !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).Comlink=t()}(this,function(){"use strict";return function(e){const t=new WeakMap;return{postMessage:e.postMessage.bind(e),addEventListener:(n,s)=>{const o=e=>{"handleEvent"in s?s.handleEvent({data:e}):s({data:e})};e.on("message",o),t.set(s,o)},removeEventListener:(n,s)=>{const o=t.get(s);o&&(e.off("message",o),t.delete(s))},start:e.start&&e.start.bind(e)}}}); | ||
| !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).Comlink=t()}(this,(function(){"use strict";return function(e){const t=new WeakMap;return{postMessage:e.postMessage.bind(e),addEventListener:(n,s)=>{const o=e=>{"handleEvent"in s?s.handleEvent({data:e}):s({data:e})};e.on("message",o),t.set(s,o)},removeEventListener:(n,s)=>{const o=t.get(s);o&&(e.off("message",o),t.delete(s))},start:e.start&&e.start.bind(e)}}})); | ||
| //# sourceMappingURL=node-adapter.min.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"node-adapter.min.js","sources":["../../src/node-adapter.ts"],"sourcesContent":["/**\n * Copyright 2019 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Endpoint } from \"./protocol.js\";\n\nexport interface NodeEndpoint {\n postMessage(message: any, transfer?: any[]): void;\n on(\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: {}\n ): void;\n off(\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: {}\n ): void;\n start?: () => void;\n}\n\nexport default function nodeEndpoint(nep: NodeEndpoint): Endpoint {\n const listeners = new WeakMap();\n return {\n postMessage: nep.postMessage.bind(nep),\n addEventListener: (_, eh) => {\n const l = (data: any) => {\n if (\"handleEvent\" in eh) {\n eh.handleEvent({ data } as MessageEvent);\n } else {\n eh({ data } as MessageEvent);\n }\n };\n nep.on(\"message\", l);\n listeners.set(eh, l);\n },\n removeEventListener: (_, eh) => {\n const l = listeners.get(eh);\n if (!l) {\n return;\n }\n nep.off(\"message\", l);\n listeners.delete(eh);\n },\n start: nep.start && nep.start.bind(nep)\n };\n}\n"],"names":["nep","listeners","WeakMap","postMessage","bind","addEventListener","_","eh","l","data","handleEvent","on","set","removeEventListener","get","off","delete","start"],"mappings":"6MA8BqCA,GACnC,MAAMC,EAAY,IAAIC,QACtB,MAAO,CACLC,YAAaH,EAAIG,YAAYC,KAAKJ,GAClCK,iBAAkB,CAACC,EAAGC,KACpB,MAAMC,EAAKC,IACL,gBAAiBF,EACnBA,EAAGG,YAAY,CAAED,KAAAA,IAEjBF,EAAG,CAAEE,KAAAA,KAGTT,EAAIW,GAAG,UAAWH,GAClBP,EAAUW,IAAIL,EAAIC,IAEpBK,oBAAqB,CAACP,EAAGC,KACvB,MAAMC,EAAIP,EAAUa,IAAIP,GACnBC,IAGLR,EAAIe,IAAI,UAAWP,GACnBP,EAAUe,OAAOT,KAEnBU,MAAOjB,EAAIiB,OAASjB,EAAIiB,MAAMb,KAAKJ"} | ||
| {"version":3,"file":"node-adapter.min.js","sources":["../../src/node-adapter.ts"],"sourcesContent":["/**\n * Copyright 2019 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Endpoint } from \"./protocol.js\";\n\nexport interface NodeEndpoint {\n postMessage(message: any, transfer?: any[]): void;\n on(\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: {}\n ): void;\n off(\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: {}\n ): void;\n start?: () => void;\n}\n\nexport default function nodeEndpoint(nep: NodeEndpoint): Endpoint {\n const listeners = new WeakMap();\n return {\n postMessage: nep.postMessage.bind(nep),\n addEventListener: (_, eh) => {\n const l = (data: any) => {\n if (\"handleEvent\" in eh) {\n eh.handleEvent({ data } as MessageEvent);\n } else {\n eh({ data } as MessageEvent);\n }\n };\n nep.on(\"message\", l);\n listeners.set(eh, l);\n },\n removeEventListener: (_, eh) => {\n const l = listeners.get(eh);\n if (!l) {\n return;\n }\n nep.off(\"message\", l);\n listeners.delete(eh);\n },\n start: nep.start && nep.start.bind(nep)\n };\n}\n"],"names":["nep","listeners","WeakMap","postMessage","bind","addEventListener","_","eh","l","data","handleEvent","on","set","removeEventListener","get","off","delete","start"],"mappings":"8MA8BqCA,GACnC,MAAMC,EAAY,IAAIC,QACtB,MAAO,CACLC,YAAaH,EAAIG,YAAYC,KAAKJ,GAClCK,iBAAkB,CAACC,EAAGC,KACpB,MAAMC,EAAKC,IACL,gBAAiBF,EACnBA,EAAGG,YAAY,CAAED,KAAAA,IAEjBF,EAAG,CAAEE,KAAAA,KAGTT,EAAIW,GAAG,UAAWH,GAClBP,EAAUW,IAAIL,EAAIC,IAEpBK,oBAAqB,CAACP,EAAGC,KACvB,MAAMC,EAAIP,EAAUa,IAAIP,GACnBC,IAGLR,EAAIe,IAAI,UAAWP,GACnBP,EAAUe,OAAOT,KAEnBU,MAAOjB,EAAIiB,OAASjB,EAAIiB,MAAMb,KAAKJ"} |
@@ -48,3 +48,4 @@ /** | ||
| CONSTRUCT = 3, | ||
| ENDPOINT = 4 | ||
| ENDPOINT = 4, | ||
| RELEASE = 5 | ||
| } | ||
@@ -78,2 +79,7 @@ export interface GetMessage { | ||
| } | ||
| export declare type Message = GetMessage | SetMessage | ApplyMessage | ConstructMessage | EndpointMessage; | ||
| export interface ReleaseMessage { | ||
| id?: MessageID; | ||
| type: MessageType.RELEASE; | ||
| path: string[]; | ||
| } | ||
| export declare type Message = GetMessage | SetMessage | ApplyMessage | ConstructMessage | EndpointMessage | ReleaseMessage; |
+1
-1
@@ -1,2 +0,2 @@ | ||
| FROM selenium/node-chrome:latest@sha256:c7230a03f91ccc771636d688cf9288de70ba8db49d065040871ded2e149f06e1 | ||
| FROM selenium/node-chrome:latest@sha256:17f4829220384811bbe2d0a50c1c3f517159969c2aef3087defce9246deb38d9 | ||
@@ -3,0 +3,0 @@ USER root |
+11
-11
| { | ||
| "name": "comlink", | ||
| "version": "4.0.2", | ||
| "version": "4.0.3", | ||
| "description": "Comlink makes WebWorkers enjoyable", | ||
@@ -34,20 +34,20 @@ "main": "dist/umd/comlink.js", | ||
| "conditional-type-checks": "1.0.1", | ||
| "husky": "3.0.1", | ||
| "karma": "4.2.0", | ||
| "husky": "3.0.7", | ||
| "karma": "4.3.0", | ||
| "karma-chai": "0.1.0", | ||
| "karma-chrome-launcher": "3.0.0", | ||
| "karma-chrome-launcher": "3.1.0", | ||
| "karma-detect-browsers": "2.3.3", | ||
| "karma-firefox-launcher": "1.1.0", | ||
| "karma-firefox-launcher": "1.2.0", | ||
| "karma-mocha": "1.3.0", | ||
| "karma-safari-launcher": "1.0.0", | ||
| "karma-safaritechpreview-launcher": "2.0.2", | ||
| "mocha": "6.2.0", | ||
| "mocha": "6.2.1", | ||
| "prettier": "1.18.2", | ||
| "rimraf": "2.6.3", | ||
| "rollup": "1.17.0", | ||
| "rollup-plugin-terser": "5.1.1", | ||
| "rollup-plugin-typescript2": "0.22.0", | ||
| "typescript": "3.5.3" | ||
| "rimraf": "3.0.0", | ||
| "rollup": "1.22.0", | ||
| "rollup-plugin-terser": "5.1.2", | ||
| "rollup-plugin-typescript2": "0.24.3", | ||
| "typescript": "3.6.3" | ||
| }, | ||
| "dependencies": {} | ||
| } |
+83
-1
@@ -32,2 +32,69 @@ # Comlink | ||
| ## Examples | ||
| ### [Running a simple function](https://github.com/GoogleChromeLabs/comlink/tree/master/docs/examples/01-simple-example) | ||
| **main.js** | ||
| ```javascript | ||
| import * as Comlink from "https://unpkg.com/comlink@alpha/dist/esm/comlink.mjs"; | ||
| async function init() { | ||
| const worker = new Worker("worker.js"); | ||
| // WebWorkers use `postMessage` and therefore work with Comlink. | ||
| const obj = Comlink.wrap(worker); | ||
| alert(`Counter: ${await obj.counter}`); | ||
| await obj.inc(); | ||
| alert(`Counter: ${await obj.counter}`); | ||
| } | ||
| init(); | ||
| ``` | ||
| **worker.js** | ||
| ```javascript | ||
| importScripts("https://unpkg.com/comlink@alpha/dist/umd/comlink.js"); | ||
| // importScripts("../../../dist/umd/comlink.js"); | ||
| const obj = { | ||
| counter: 0, | ||
| inc() { | ||
| this.counter++; | ||
| } | ||
| }; | ||
| Comlink.expose(obj); | ||
| ``` | ||
| ### [Callbacks](https://github.com/torch2424/comlink/tree/master/docs/examples/02-callback-example) | ||
| **main.js** | ||
| ```javascript | ||
| import * as Comlink from "https://unpkg.com/comlink@alpha/dist/esm/comlink.mjs"; | ||
| // import * as Comlink from "../../../dist/esm/comlink.mjs"; | ||
| function callback(value) { | ||
| alert(`Result: ${value}`); | ||
| } | ||
| async function init() { | ||
| const remoteFunction = Comlink.wrap(new Worker("worker.js")); | ||
| await remoteFunction(Comlink.proxy(callback)); | ||
| } | ||
| init(); | ||
| ``` | ||
| **worker.js** | ||
| ```javascript | ||
| importScripts("https://unpkg.com/comlink@alpha/dist/umd/comlink.js"); | ||
| // importScripts("../../../dist/umd/comlink.js"); | ||
| async function remoteFunction(cb) { | ||
| await cb("A string from a worker"); | ||
| } | ||
| Comlink.expose(remoteFunction); | ||
| ``` | ||
| **For additional examples, please see the [docs/examples](./docs/examples) directory in the project.** | ||
| ## API | ||
@@ -39,3 +106,3 @@ | ||
| `wrap` wraps the _other_ end of the message channel and returns a proxy. The proxy will have all properties and functions of the exposed value, but access and invocations are inherintly asynchronous. This means that a function that returns a number will now return _a promise_ for a number. **As a rule of thumb: If you are using the proxy, put `await` in front of it.** Exceptions will be caught and re-thrown on the other side. | ||
| `wrap` wraps the _other_ end of the message channel and returns a proxy. The proxy will have all properties and functions of the exposed value, but access and invocations are inherently asynchronous. This means that a function that returns a number will now return _a promise_ for a number. **As a rule of thumb: If you are using the proxy, put `await` in front of it.** Exceptions will be caught and re-thrown on the other side. | ||
@@ -90,2 +157,13 @@ ### `Comlink.transfer(value, transferables)` and `Comlink.proxy(value)` | ||
| ### `Comlink.releaseProxy` | ||
| Every proxy created by Comlink has the `[releaseProxy]` method. | ||
| Calling it will detach the proxy and the exposed object from the message channel, allowing both ends to be garbage collected. | ||
| ```js | ||
| const proxy = Comlink.wrap(port); | ||
| // ... use the proxy ... | ||
| proxy[Comlink.releaseProxy](); | ||
| ``` | ||
| ### `Comlink.createEndpoint` | ||
@@ -120,4 +198,8 @@ | ||
| ## Additional Resources | ||
| - [Simplify Web Worker code with Comlink](https://davidea.st/articles/comlink-simple-web-worker) | ||
| --- | ||
| License Apache-2.0 |
+44
-5
@@ -27,2 +27,3 @@ /** | ||
| export const createEndpoint = Symbol("Comlink.endpoint"); | ||
| export const releaseProxy = Symbol("Comlink.releaseProxy"); | ||
| const throwSet = new WeakSet(); | ||
@@ -100,3 +101,3 @@ | ||
| export function expose(obj: any, ep: Endpoint = self as any) { | ||
| ep.addEventListener("message", (async (ev: MessageEvent) => { | ||
| ep.addEventListener("message", async function callback(ev: MessageEvent) { | ||
| if (!ev || !ev.data) { | ||
@@ -144,4 +145,7 @@ return; | ||
| break; | ||
| default: | ||
| console.warn("Unrecognized message", ev.data); | ||
| case MessageType.RELEASE: | ||
| { | ||
| returnValue = undefined; | ||
| } | ||
| break; | ||
| } | ||
@@ -154,3 +158,8 @@ } catch (e) { | ||
| ep.postMessage({ ...wireValue, id }, transferables); | ||
| }) as any); | ||
| if (type === MessageType.RELEASE) { | ||
| // detach and deactive after sending release response above. | ||
| ep.removeEventListener("message", callback as any); | ||
| closeEndPoint(ep); | ||
| } | ||
| } as any); | ||
| if (ep.start) { | ||
@@ -161,2 +170,10 @@ ep.start(); | ||
| function isMessagePort(endpoint: Endpoint): endpoint is MessagePort { | ||
| return endpoint.constructor.name === "MessagePort"; | ||
| } | ||
| function closeEndPoint(endpoint: Endpoint) { | ||
| if (isMessagePort(endpoint)) endpoint.close(); | ||
| } | ||
| export function wrap<T>(ep: Endpoint): Remote<T> { | ||
@@ -166,2 +183,8 @@ return createProxy<T>(ep) as any; | ||
| function throwIfProxyReleased(isReleased: boolean) { | ||
| if (isReleased) { | ||
| throw new Error("Proxy has been released and is not useable"); | ||
| } | ||
| } | ||
| function createProxy<T>( | ||
@@ -171,4 +194,17 @@ ep: Endpoint, | ||
| ): Remote<T> { | ||
| const proxy: Function = new Proxy(function() {}, { | ||
| let isProxyReleased = false; | ||
| const proxy = new Proxy(function() {}, { | ||
| get(_target, prop) { | ||
| throwIfProxyReleased(isProxyReleased); | ||
| if (prop === releaseProxy) { | ||
| return () => { | ||
| return requestResponseMessage(ep, { | ||
| type: MessageType.RELEASE, | ||
| path: path.map(p => p.toString()) | ||
| }).then(() => { | ||
| closeEndPoint(ep); | ||
| isProxyReleased = true; | ||
| }); | ||
| }; | ||
| } | ||
| if (prop === "then") { | ||
@@ -187,2 +223,3 @@ if (path.length === 0) { | ||
| set(_target, prop, rawValue) { | ||
| throwIfProxyReleased(isProxyReleased); | ||
| // FIXME: ES6 Proxy Handler `set` methods are supposed to return a | ||
@@ -202,2 +239,3 @@ // boolean. To show good will, we return true asynchronously ¯\_(ツ)_/¯ | ||
| apply(_target, _thisArg, rawArgumentList) { | ||
| throwIfProxyReleased(isProxyReleased); | ||
| const last = path[path.length - 1]; | ||
@@ -225,2 +263,3 @@ if ((last as any) === createEndpoint) { | ||
| construct(_target, rawArgumentList) { | ||
| throwIfProxyReleased(isProxyReleased); | ||
| const [argumentList, transferables] = processArguments(rawArgumentList); | ||
@@ -227,0 +266,0 @@ return requestResponseMessage( |
+10
-2
@@ -69,3 +69,4 @@ /** | ||
| CONSTRUCT, | ||
| ENDPOINT | ||
| ENDPOINT, | ||
| RELEASE | ||
| } | ||
@@ -105,2 +106,8 @@ | ||
| export interface ReleaseMessage { | ||
| id?: MessageID; | ||
| type: MessageType.RELEASE; | ||
| path: string[]; | ||
| } | ||
| export type Message = | ||
@@ -111,2 +118,3 @@ | GetMessage | ||
| | ConstructMessage | ||
| | EndpointMessage; | ||
| | EndpointMessage | ||
| | ReleaseMessage; |
@@ -499,2 +499,10 @@ /** | ||
| }); | ||
| it("released proxy should no longer be useable and throw an exception", async function() { | ||
| const thing = Comlink.wrap(this.port1); | ||
| Comlink.expose(SampleClass, this.port2); | ||
| const instance = await new thing(); | ||
| await instance[Comlink.releaseProxy](); | ||
| expect(() => instance.method()).to.throw(); | ||
| }); | ||
| }); | ||
@@ -501,0 +509,0 @@ |
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 2 instances in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 2 instances in 1 package
201725
8.34%2377
6.35%202
68.33%