penpal 7.0.4 → 7.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +6 -0
- package/dist/penpal.cjs +40 -19
- package/dist/penpal.cjs.map +1 -1
- package/dist/penpal.d.cts +1 -1
- package/dist/penpal.d.ts +1 -1
- package/dist/penpal.js +40 -19
- package/dist/penpal.js.map +1 -1
- package/dist/penpal.min.js +1 -1
- package/dist/penpal.min.js.map +1 -1
- package/dist/penpal.mjs +40 -19
- package/dist/penpal.mjs.map +1 -1
- package/package.json +1 -1
package/LICENSE
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
The MIT License (MIT)
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2016, Aaron Hardy
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2016, Aaron Hardy
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -21,6 +21,8 @@
|
|
|
21
21
|
|
|
22
22
|
</div>
|
|
23
23
|
|
|
24
|
+
Migration instructions for each major release can be found on the corresponding GitHub release tag. If you are migrating to v7, [see the v7 release tag for migration instructions](https://github.com/Aaronius/penpal/releases/tag/v7.0.0).
|
|
25
|
+
|
|
24
26
|
## Installation
|
|
25
27
|
|
|
26
28
|
### Using npm
|
|
@@ -430,6 +432,10 @@ self.addEventListener('message', async (event) => {
|
|
|
430
432
|
|
|
431
433
|
</details>
|
|
432
434
|
|
|
435
|
+
## Running Examples
|
|
436
|
+
|
|
437
|
+
If you'd like to see running examples of the different types of usage, check out the [penpal-sandbox](https://github.com/Aaronius/penpal-sandbox) repository.
|
|
438
|
+
|
|
433
439
|
## Destroying the Connection
|
|
434
440
|
|
|
435
441
|
At any point in time, call `connection.destroy()` to destroy the connection so that event listeners can be removed and objects can be properly garbage collected.
|
package/dist/penpal.cjs
CHANGED
|
@@ -323,16 +323,6 @@ var getPromiseWithResolvers = () => {
|
|
|
323
323
|
};
|
|
324
324
|
var getPromiseWithResolvers_default = getPromiseWithResolvers;
|
|
325
325
|
|
|
326
|
-
// src/PenpalBugError.ts
|
|
327
|
-
var PenpalBugError = class extends Error {
|
|
328
|
-
constructor(message) {
|
|
329
|
-
super(
|
|
330
|
-
`You've hit a bug in Penpal. Please file an issue with the following information: ${message}`
|
|
331
|
-
);
|
|
332
|
-
}
|
|
333
|
-
};
|
|
334
|
-
var PenpalBugError_default = PenpalBugError;
|
|
335
|
-
|
|
336
326
|
// src/backwardCompatibility.ts
|
|
337
327
|
var DEPRECATED_PENPAL_PARTICIPANT_ID = "deprecated-penpal";
|
|
338
328
|
var isDeprecatedMessage = (data) => {
|
|
@@ -340,9 +330,17 @@ var isDeprecatedMessage = (data) => {
|
|
|
340
330
|
};
|
|
341
331
|
var upgradeMethodPath = (methodPath) => methodPath.split(".");
|
|
342
332
|
var downgradeMethodPath = (methodPath) => methodPath.join(".");
|
|
333
|
+
var stringifyUnknownMessage = (message) => {
|
|
334
|
+
try {
|
|
335
|
+
return JSON.stringify(message);
|
|
336
|
+
} catch (_) {
|
|
337
|
+
return String(message);
|
|
338
|
+
}
|
|
339
|
+
};
|
|
343
340
|
var getUnexpectedMessageError = (message) => {
|
|
344
|
-
return new
|
|
345
|
-
|
|
341
|
+
return new PenpalError_default(
|
|
342
|
+
"TRANSMISSION_FAILED",
|
|
343
|
+
`Unexpected message to translate: ${stringifyUnknownMessage(message)}`
|
|
346
344
|
);
|
|
347
345
|
};
|
|
348
346
|
var upgradeMessage = (message) => {
|
|
@@ -715,7 +713,10 @@ var WindowMessenger = class {
|
|
|
715
713
|
});
|
|
716
714
|
return;
|
|
717
715
|
}
|
|
718
|
-
throw new
|
|
716
|
+
throw new PenpalError_default(
|
|
717
|
+
"TRANSMISSION_FAILED",
|
|
718
|
+
"Cannot send message because the MessagePort is not connected"
|
|
719
|
+
);
|
|
719
720
|
};
|
|
720
721
|
addMessageHandler = (callback) => {
|
|
721
722
|
this.#messageCallbacks.add(callback);
|
|
@@ -738,7 +739,10 @@ var WindowMessenger = class {
|
|
|
738
739
|
return "*";
|
|
739
740
|
}
|
|
740
741
|
if (!this.#concreteRemoteOrigin) {
|
|
741
|
-
throw new
|
|
742
|
+
throw new PenpalError_default(
|
|
743
|
+
"TRANSMISSION_FAILED",
|
|
744
|
+
"Cannot send message because the remote origin is not established"
|
|
745
|
+
);
|
|
742
746
|
}
|
|
743
747
|
return this.#concreteRemoteOrigin === "null" && this.#allowedOrigins.includes("*") ? "*" : this.#concreteRemoteOrigin;
|
|
744
748
|
};
|
|
@@ -761,7 +765,14 @@ var WindowMessenger = class {
|
|
|
761
765
|
"Please upgrade the child window to the latest version of Penpal."
|
|
762
766
|
);
|
|
763
767
|
this.#isChildUsingDeprecatedProtocol = true;
|
|
764
|
-
|
|
768
|
+
try {
|
|
769
|
+
data = upgradeMessage(data);
|
|
770
|
+
} catch (error) {
|
|
771
|
+
this.#log?.(
|
|
772
|
+
`Failed to translate deprecated message: ${error.message}`
|
|
773
|
+
);
|
|
774
|
+
return;
|
|
775
|
+
}
|
|
765
776
|
}
|
|
766
777
|
if (!this.#validateReceivedMessage?.(data)) {
|
|
767
778
|
return;
|
|
@@ -781,7 +792,8 @@ var WindowMessenger = class {
|
|
|
781
792
|
!this.#isChildUsingDeprecatedProtocol) {
|
|
782
793
|
this.#port = ports[0];
|
|
783
794
|
if (!this.#port) {
|
|
784
|
-
|
|
795
|
+
this.#log?.("Ignoring ACK2 because it did not include a MessagePort");
|
|
796
|
+
return;
|
|
785
797
|
}
|
|
786
798
|
this.#port.addEventListener("message", this.#handleMessageFromPort);
|
|
787
799
|
this.#port.start();
|
|
@@ -804,6 +816,7 @@ var WindowMessenger_default = WindowMessenger;
|
|
|
804
816
|
// src/messengers/WorkerMessenger.ts
|
|
805
817
|
var WorkerMessenger = class {
|
|
806
818
|
#worker;
|
|
819
|
+
#log;
|
|
807
820
|
#validateReceivedMessage;
|
|
808
821
|
#messageCallbacks = /* @__PURE__ */ new Set();
|
|
809
822
|
#port;
|
|
@@ -813,7 +826,11 @@ var WorkerMessenger = class {
|
|
|
813
826
|
}
|
|
814
827
|
this.#worker = worker;
|
|
815
828
|
}
|
|
816
|
-
initialize = ({
|
|
829
|
+
initialize = ({
|
|
830
|
+
log,
|
|
831
|
+
validateReceivedMessage
|
|
832
|
+
}) => {
|
|
833
|
+
this.#log = log;
|
|
817
834
|
this.#validateReceivedMessage = validateReceivedMessage;
|
|
818
835
|
this.#worker.addEventListener("message", this.#handleMessage);
|
|
819
836
|
};
|
|
@@ -838,7 +855,10 @@ var WorkerMessenger = class {
|
|
|
838
855
|
});
|
|
839
856
|
return;
|
|
840
857
|
}
|
|
841
|
-
throw new
|
|
858
|
+
throw new PenpalError_default(
|
|
859
|
+
"TRANSMISSION_FAILED",
|
|
860
|
+
"Cannot send message because the MessagePort is not connected"
|
|
861
|
+
);
|
|
842
862
|
};
|
|
843
863
|
addMessageHandler = (callback) => {
|
|
844
864
|
this.#messageCallbacks.add(callback);
|
|
@@ -866,7 +886,8 @@ var WorkerMessenger = class {
|
|
|
866
886
|
if (isAck2Message(data)) {
|
|
867
887
|
this.#port = ports[0];
|
|
868
888
|
if (!this.#port) {
|
|
869
|
-
|
|
889
|
+
this.#log?.("Ignoring ACK2 because it did not include a MessagePort");
|
|
890
|
+
return;
|
|
870
891
|
}
|
|
871
892
|
this.#port.addEventListener("message", this.#handleMessage);
|
|
872
893
|
this.#port.start();
|
package/dist/penpal.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/PenpalError.ts","../src/errorSerialization.ts","../src/Reply.ts","../src/namespace.ts","../src/guards.ts","../src/methodSerialization.ts","../src/connectCallHandler.ts","../src/generateId.ts","../src/CallOptions.ts","../src/connectRemoteProxy.ts","../src/getPromiseWithResolvers.ts","../src/PenpalBugError.ts","../src/backwardCompatibility.ts","../src/shakeHands.ts","../src/once.ts","../src/connect.ts","../src/messengers/WindowMessenger.ts","../src/messengers/WorkerMessenger.ts","../src/messengers/PortMessenger.ts","../src/ErrorCodeObj.ts","../src/debug.ts"],"names":["brand"],"mappings":"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","file":"penpal.cjs","sourcesContent":["import { ErrorCode } from './types.js';\n\nclass PenpalError extends Error {\n public code: ErrorCode;\n\n constructor(code: ErrorCode, message: string) {\n super(message);\n this.name = 'PenpalError';\n this.code = code;\n }\n}\n\nexport default PenpalError;\n","import { SerializedError } from './types.js';\nimport PenpalError from './PenpalError.js';\n\n/**\n * Converts an error object into a plain object.\n */\nexport const serializeError = (error: Error): SerializedError => ({\n name: error.name,\n message: error.message,\n stack: error.stack,\n penpalCode: error instanceof PenpalError ? error.code : undefined,\n});\n\n/**\n * Converts a plain object into an error object.\n */\nexport const deserializeError = ({\n name,\n message,\n stack,\n penpalCode,\n}: SerializedError): Error => {\n const deserializedError = penpalCode\n ? new PenpalError(penpalCode, message)\n : new Error(message);\n\n deserializedError.name = name;\n deserializedError.stack = stack;\n\n return deserializedError;\n};\n","const brand: unique symbol = Symbol('Reply');\n\nclass Reply<T = unknown> {\n readonly value: T;\n readonly transferables?: Transferable[];\n\n // Allows TypeScript to distinguish between an actual instance of this\n // class versus an object that looks structurally similar.\n // eslint-disable-next-line no-unused-private-class-members\n #brand = brand;\n\n constructor(\n value: T,\n options?: {\n transferables?: Transferable[];\n }\n ) {\n this.value = value;\n this.transferables = options?.transferables;\n }\n}\n\nexport default Reply;\n","export default 'penpal' as const;\n","import namespace from './namespace.js';\nimport {\n Ack2Message,\n CallMessage,\n Message,\n ReplyMessage,\n Ack1Message,\n SynMessage,\n DestroyMessage,\n} from './types.js';\n\nexport const isObject = (\n value: unknown\n): value is Record<string | number | symbol, unknown> => {\n return typeof value === 'object' && value !== null;\n};\n\nexport const isFunction = (value: unknown) => {\n return typeof value === 'function';\n};\n\nexport const isMessage = (data: unknown): data is Message => {\n return isObject(data) && data.namespace === namespace;\n};\n\nexport const isSynMessage = (message: Message): message is SynMessage => {\n return message.type === 'SYN';\n};\n\nexport const isAck1Message = (message: Message): message is Ack1Message => {\n return message.type === 'ACK1';\n};\n\nexport const isAck2Message = (message: Message): message is Ack2Message => {\n return message.type === 'ACK2';\n};\n\nexport const isCallMessage = (message: Message): message is CallMessage => {\n return message.type === 'CALL';\n};\n\nexport const isReplyMessage = (message: Message): message is ReplyMessage => {\n return message.type === 'REPLY';\n};\n\nexport const isDestroyMessage = (\n message: Message\n): message is DestroyMessage => {\n return message.type === 'DESTROY';\n};\n","import { MethodPath, Methods } from './types.js';\nimport { isFunction, isObject } from './guards.js';\n\n// TODO: Used for backward-compatibility. Remove in next major version.\n/**\n * Given an object of (nested) keys to functions, extract paths to each function.\n *\n * @example\n * Given this Method object:\n * {\n * one: {\n * two: () => {}\n * }\n * three: () => {}\n * }\n *\n * the extracted MethodPath[] would be:\n * [\n * ['one', 'two'],\n * ['three']\n * ]\n */\nexport const extractMethodPathsFromMethods = (\n methods: Methods,\n currentPath: MethodPath = []\n) => {\n const methodPaths: MethodPath[] = [];\n\n for (const key of Object.keys(methods)) {\n const value = methods[key];\n\n if (isFunction(value)) {\n methodPaths.push([...currentPath, key]);\n } else if (isObject(value)) {\n methodPaths.push(\n ...extractMethodPathsFromMethods(value, [...currentPath, key])\n );\n }\n }\n\n return methodPaths;\n};\n\nexport const getMethodAtMethodPath = (\n methodPath: MethodPath,\n methods: Methods\n) => {\n const result = methodPath.reduce<Methods | Function | undefined>(\n (acc, pathSegment) => {\n return isObject(acc) ? acc[pathSegment] : undefined;\n },\n methods\n );\n\n return isFunction(result) ? result : undefined;\n};\n\nexport const formatMethodPath = (methodPath: MethodPath) => {\n return methodPath.join('.');\n};\n","import { serializeError } from './errorSerialization.js';\nimport { Message, ReplyMessage, Methods, Log } from './types.js';\nimport Reply from './Reply.js';\nimport Messenger from './messengers/Messenger.js';\nimport PenpalError from './PenpalError.js';\nimport {\n formatMethodPath,\n getMethodAtMethodPath,\n} from './methodSerialization.js';\nimport { isCallMessage } from './guards.js';\nimport namespace from './namespace.js';\n\nconst createErrorReplyMessage = (\n channel: string | undefined,\n callId: string,\n error: unknown\n): ReplyMessage => ({\n namespace,\n channel,\n type: 'REPLY',\n callId,\n isError: true,\n ...(error instanceof Error\n ? { value: serializeError(error), isSerializedErrorInstance: true }\n : { value: error }),\n});\n\n/**\n * Listens for \"call\" messages from the remote, executes the corresponding method,\n * and responds with the return value or error.\n */\nconst connectCallHandler = (\n messenger: Messenger,\n methods: Methods,\n channel: string | undefined,\n log: Log | undefined\n) => {\n let isDestroyed = false;\n\n const handleMessage = async (message: Message) => {\n if (isDestroyed) {\n // It's possible to throw an error here, but it would only be catchable\n // using window.onerror since we're in an asynchronously-called function.\n // There is no method call the consumer is making that they could wrap in\n // a try-catch. Even if the consumer were to catch the error somehow,\n // the value of doing so is questionable.\n return;\n }\n\n if (!isCallMessage(message)) {\n return;\n }\n\n log?.(`Received ${formatMethodPath(message.methodPath)}() call`, message);\n\n const { methodPath, args, id: callId } = message;\n let replyMessage: ReplyMessage;\n let transferables: Transferable[] | undefined;\n\n try {\n const method = getMethodAtMethodPath(methodPath, methods);\n\n if (!method) {\n throw new PenpalError(\n 'METHOD_NOT_FOUND',\n `Method \\`${formatMethodPath(methodPath)}\\` is not found.`\n );\n }\n\n let value: unknown = await method(...args);\n\n if (value instanceof Reply) {\n transferables = value.transferables;\n value = await value.value;\n }\n\n replyMessage = {\n namespace,\n channel,\n type: 'REPLY',\n callId,\n value,\n };\n } catch (error) {\n replyMessage = createErrorReplyMessage(channel, callId, error);\n }\n\n // Although we checked this at the beginning of the function, we need to\n // check it again because we've made async calls, and the connection may\n // have been destroyed in the meantime.\n if (isDestroyed) {\n return;\n }\n\n try {\n log?.(`Sending ${formatMethodPath(methodPath)}() reply`, replyMessage);\n messenger.sendMessage(replyMessage, transferables);\n } catch (error) {\n // If a consumer attempts to send an object that's not\n // cloneable (e.g., window), we want to ensure the receiver's promise\n // gets rejected.\n if ((error as Error).name === 'DataCloneError') {\n replyMessage = createErrorReplyMessage(channel, callId, error as Error);\n log?.(`Sending ${formatMethodPath(methodPath)}() reply`, replyMessage);\n messenger.sendMessage(replyMessage);\n }\n throw error;\n }\n };\n\n messenger.addMessageHandler(handleMessage);\n\n return () => {\n isDestroyed = true;\n messenger.removeMessageHandler(handleMessage);\n };\n};\n\nexport default connectCallHandler;\n","/**\n * @return A unique ID\n */\n// crypto.randomUUID is not available in insecure contexts.\nexport default crypto.randomUUID?.bind(crypto) ??\n (() =>\n new Array(4)\n .fill(0)\n .map(() =>\n Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16)\n )\n .join('-'));\n","const brand: unique symbol = Symbol('CallOptions');\n\nclass CallOptions {\n readonly transferables?: Transferable[];\n readonly timeout?: number;\n\n // Allows TypeScript to distinguish between an actual instance of this\n // class versus an object that looks structurally similar.\n // eslint-disable-next-line no-unused-private-class-members\n #brand = brand;\n\n constructor(options?: { transferables?: Transferable[]; timeout?: number }) {\n this.transferables = options?.transferables;\n this.timeout = options?.timeout;\n }\n}\n\nexport default CallOptions;\n","import generateId from './generateId.js';\nimport { deserializeError } from './errorSerialization.js';\nimport { formatMethodPath } from './methodSerialization.js';\nimport {\n Message,\n RemoteProxy,\n Methods,\n MethodPath,\n CallMessage,\n Log,\n} from './types.js';\nimport CallOptions from './CallOptions.js';\nimport Messenger from './messengers/Messenger.js';\nimport PenpalError from './PenpalError.js';\nimport { isReplyMessage } from './guards.js';\nimport namespace from './namespace.js';\n\ntype ReplyHandler = {\n methodPath: MethodPath;\n resolve: (value: unknown) => void;\n reject: (reason: unknown) => void;\n timeoutId?: number;\n};\n\nconst methodsToTreatAsNative = new Set(['apply', 'call', 'bind']);\n\nconst createRemoteProxy = (\n callback: (path: MethodPath, args: unknown[]) => void,\n log?: Log,\n path: MethodPath = []\n): Methods => {\n return new Proxy(\n path.length\n ? () => {\n // Intentionally empty\n }\n : Object.create(null),\n {\n get(target, prop: string) {\n // If a promise is resolved with this proxy object, the JavaScript\n // runtime will look for a `then` property on this object to determine\n // if it should be treated as a promise (to support promise chaining).\n // If we don't return undefined here, the JavaScript runtime will treat\n // this object as a promise and attempt to call `then`, which will\n // then send a call message to the remote. This is not what we want.\n if (prop === 'then') {\n return;\n }\n\n // Because we're using a proxy and because Penpal supports developers\n // exposing nested methods, we have a predicament. If a developer\n // calls, for example, remote.auth.apply(), are they\n // attempting to call a nested apply() method that a developer has\n // explicitly exposed from the remote? Could they instead be attempting\n // to call Function.prototype.apply() on the remote.auth() method?\n // Without the remote telling the local Penpal which methods the\n // developer has exposed, it has no way of knowing (and the main reason\n // we use a proxy is so that Penpal doesn't have to communicate which\n // methods are exposed). So, we treat certain methods as native methods\n // and return the native method rather than a proxy. The downside of\n // this is that if a developer has explicitly exposed a nested method\n // with the same name as one of these native method names, the developer\n // will be unable to call the exposed remote method because they will\n // be calling the method on the Function prototype instead.\n if (path.length && methodsToTreatAsNative.has(prop)) {\n return Reflect.get(target, prop);\n }\n\n return createRemoteProxy(callback, log, [...path, prop]);\n },\n apply(target, _thisArg, args) {\n return callback(path, args);\n },\n }\n );\n};\n\nconst getDestroyedConnectionMethodCallError = (methodPath: MethodPath) => {\n return new PenpalError(\n 'CONNECTION_DESTROYED',\n `Method call ${formatMethodPath(\n methodPath\n )}() failed due to destroyed connection`\n );\n};\n\n/**\n * Creates a proxy. When methods are called on the proxy, a \"call\" message will\n * be sent to the remote, the remote's corresponding method will be\n * executed, and the method's return value will be returned via a message.\n */\nconst connectRemoteProxy = <TMethods extends Methods>(\n messenger: Messenger,\n channel: string | undefined,\n log: Log | undefined\n) => {\n let isDestroyed = false;\n const replyHandlers = new Map<string, ReplyHandler>();\n\n const handleMessage = (message: Message) => {\n if (!isReplyMessage(message)) {\n return;\n }\n\n const { callId, value, isError, isSerializedErrorInstance } = message;\n const replyHandler = replyHandlers.get(callId);\n\n if (!replyHandler) {\n return;\n }\n\n replyHandlers.delete(callId);\n log?.(\n `Received ${formatMethodPath(replyHandler.methodPath)}() call`,\n message\n );\n\n if (isError) {\n replyHandler.reject(\n isSerializedErrorInstance ? deserializeError(value) : value\n );\n } else {\n replyHandler.resolve(value);\n }\n };\n\n messenger.addMessageHandler(handleMessage);\n\n const remoteProxy = createRemoteProxy((methodPath, args) => {\n if (isDestroyed) {\n throw getDestroyedConnectionMethodCallError(methodPath);\n }\n\n const callId = generateId();\n const lastArg = args[args.length - 1];\n const lastArgIsOptions = lastArg instanceof CallOptions;\n const { timeout, transferables } = lastArgIsOptions ? lastArg : {};\n const argsWithoutOptions = lastArgIsOptions ? args.slice(0, -1) : args;\n\n return new Promise((resolve, reject) => {\n // We reference `window.setTimeout` instead of just `setTimeout`\n // so that the TypeScript engine doesn't\n // get confused when running tests. Something within\n // Karma + @rollup/plugin-typescript leaks node types into source\n // files when running tests. Node's setTimeout has a return type of\n // Timeout rather than number, resulting in a build error when\n // running tests if we don't disambiguate the browser setTimeout\n // from node's setTimeout. There may be a better way to configure\n // Karma + Rollup + Typescript to avoid node type leakage.\n const timeoutId =\n timeout !== undefined\n ? window.setTimeout(() => {\n replyHandlers.delete(callId);\n reject(\n new PenpalError(\n 'METHOD_CALL_TIMEOUT',\n `Method call ${formatMethodPath(\n methodPath\n )}() timed out after ${timeout}ms`\n )\n );\n }, timeout)\n : undefined;\n\n replyHandlers.set(callId, { methodPath, resolve, reject, timeoutId });\n\n try {\n const callMessage: CallMessage = {\n namespace,\n channel,\n type: 'CALL',\n id: callId,\n methodPath,\n args: argsWithoutOptions,\n };\n log?.(`Sending ${formatMethodPath(methodPath)}() call`, callMessage);\n messenger.sendMessage(callMessage, transferables);\n } catch (error) {\n reject(\n new PenpalError('TRANSMISSION_FAILED', (error as Error).message)\n );\n }\n });\n }, log) as RemoteProxy<TMethods>;\n\n const destroy = () => {\n isDestroyed = true;\n messenger.removeMessageHandler(handleMessage);\n\n for (const { methodPath, reject, timeoutId } of replyHandlers.values()) {\n clearTimeout(timeoutId);\n reject(getDestroyedConnectionMethodCallError(methodPath));\n }\n\n replyHandlers.clear();\n };\n\n return {\n remoteProxy,\n destroy,\n };\n};\n\nexport default connectRemoteProxy;\n","// Just use the native Promise.withResolvers() once it gains a bit more\n// adoption. Safari was the last major browser to support it, which happened\n// on March 5, 2024 in Safari 17.4.\nconst getPromiseWithResolvers = <ResolvedValueType, RejectedValueType>() => {\n let resolve: (value: ResolvedValueType) => void;\n let reject: (error: RejectedValueType) => void;\n\n const promise = new Promise<ResolvedValueType>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n return {\n promise,\n resolve: resolve!,\n reject: reject!,\n };\n};\n\nexport default getPromiseWithResolvers;\n","/**\n * Error class that is thrown when we've reached a situation that we believe to\n * be a bug in Penpal and not anything the consumer has done.\n */\nclass PenpalBugError extends Error {\n constructor(message: string) {\n super(\n `You've hit a bug in Penpal. Please file an issue with the following information: ${message}`\n );\n }\n}\n\nexport default PenpalBugError;\n","import { Message, MethodPath } from './types.js';\nimport namespace from './namespace.js';\nimport {\n isCallMessage,\n isReplyMessage,\n isAck1Message,\n isObject,\n} from './guards.js';\nimport PenpalBugError from './PenpalBugError.js';\n\nexport const DEPRECATED_PENPAL_PARTICIPANT_ID = 'deprecated-penpal';\n\n// TODO: This file is used for backward-compatibility. Remove in next major version.\n\nenum DeprecatedMessageType {\n Call = 'call',\n Reply = 'reply',\n Syn = 'syn',\n SynAck = 'synAck',\n Ack = 'ack',\n}\n\nenum DeprecatedResolution {\n Fulfilled = 'fulfilled',\n Rejected = 'rejected',\n}\n\ntype DeprecatedSynMessage = {\n penpal: DeprecatedMessageType.Syn;\n};\n\ntype DeprecatedSynAckMessage = {\n penpal: DeprecatedMessageType.SynAck;\n methodNames: string[];\n};\n\ntype DeprecatedAckMessage = {\n penpal: DeprecatedMessageType.Ack;\n methodNames: string[];\n};\n\ntype DeprecatedCallMessage = {\n penpal: DeprecatedMessageType.Call;\n id: number;\n methodName: string;\n args: unknown[];\n};\n\ntype DeprecatedSerializedError = {\n name: string;\n message: string;\n stack?: string;\n};\n\ntype DeprecatedReplyMessage = {\n penpal: DeprecatedMessageType.Reply;\n id: number;\n} & (\n | {\n resolution: DeprecatedResolution.Fulfilled;\n returnValue: unknown;\n returnValueIsError?: false;\n }\n | {\n resolution: DeprecatedResolution.Rejected;\n returnValue: unknown;\n returnValueIsError?: false;\n }\n | {\n resolution: DeprecatedResolution.Rejected;\n returnValue: DeprecatedSerializedError;\n returnValueIsError: true;\n }\n);\n\nexport type DeprecatedMessage =\n | DeprecatedSynMessage\n | DeprecatedSynAckMessage\n | DeprecatedAckMessage\n | DeprecatedCallMessage\n | DeprecatedReplyMessage;\n\nexport const isDeprecatedMessage = (\n data: unknown\n): data is DeprecatedMessage => {\n return isObject(data) && 'penpal' in data;\n};\n\nconst upgradeMethodPath = (methodPath: string): MethodPath =>\n methodPath.split('.');\nconst downgradeMethodPath = (methodPath: MethodPath) => methodPath.join('.');\n\nconst getUnexpectedMessageError = (message: unknown) => {\n return new PenpalBugError(\n `Unexpected message to translate: ${JSON.stringify(message)}`\n );\n};\n\nexport const upgradeMessage = (message: DeprecatedMessage): Message => {\n if (message.penpal === DeprecatedMessageType.Syn) {\n return {\n namespace,\n channel: undefined,\n type: 'SYN',\n participantId: DEPRECATED_PENPAL_PARTICIPANT_ID,\n };\n }\n\n if (message.penpal === DeprecatedMessageType.Ack) {\n return {\n namespace,\n channel: undefined,\n type: 'ACK2',\n };\n }\n\n if (message.penpal === DeprecatedMessageType.Call) {\n return {\n namespace,\n channel: undefined,\n type: 'CALL',\n // Actually converting the ID to a string would break communication.\n id: (message.id as unknown) as string,\n methodPath: upgradeMethodPath(message.methodName),\n args: message.args,\n };\n }\n\n if (message.penpal === DeprecatedMessageType.Reply) {\n if (message.resolution === DeprecatedResolution.Fulfilled) {\n return {\n namespace,\n channel: undefined,\n type: 'REPLY',\n // Actually converting the ID to a string would break communication.\n callId: (message.id as unknown) as string,\n value: message.returnValue,\n };\n } else {\n return {\n namespace,\n channel: undefined,\n type: 'REPLY',\n // Actually converting the ID to a string would break communication.\n callId: (message.id as unknown) as string,\n isError: true,\n ...(message.returnValueIsError\n ? {\n value: message.returnValue,\n isSerializedErrorInstance: true,\n }\n : {\n value: message.returnValue,\n }),\n };\n }\n }\n\n throw getUnexpectedMessageError(message);\n};\n\nexport const downgradeMessage = (message: Message): DeprecatedMessage => {\n if (isAck1Message(message)) {\n return {\n penpal: DeprecatedMessageType.SynAck,\n methodNames: message.methodPaths.map(downgradeMethodPath),\n };\n }\n\n if (isCallMessage(message)) {\n return {\n penpal: DeprecatedMessageType.Call,\n // Actually converting the ID to a number would break communication.\n id: (message.id as unknown) as number,\n methodName: downgradeMethodPath(message.methodPath),\n args: message.args,\n };\n }\n\n if (isReplyMessage(message)) {\n if (message.isError) {\n return {\n penpal: DeprecatedMessageType.Reply,\n // Actually converting the ID to a number would break communication.\n id: (message.callId as unknown) as number,\n resolution: DeprecatedResolution.Rejected,\n ...(message.isSerializedErrorInstance\n ? {\n returnValue: message.value,\n returnValueIsError: true,\n }\n : { returnValue: message.value }),\n };\n } else {\n return {\n penpal: DeprecatedMessageType.Reply,\n // Actually converting the ID to a number would break communication.\n id: (message.callId as unknown) as number,\n resolution: DeprecatedResolution.Fulfilled,\n returnValue: message.value,\n };\n }\n }\n\n throw getUnexpectedMessageError(message);\n};\n","import Messenger from './messengers/Messenger.js';\nimport {\n Ack2Message,\n Methods,\n Message,\n RemoteProxy,\n Ack1Message,\n SynMessage,\n Log,\n} from './types.js';\nimport PenpalError from './PenpalError.js';\nimport connectCallHandler from './connectCallHandler.js';\nimport connectRemoteProxy from './connectRemoteProxy.js';\nimport { isAck2Message, isAck1Message, isSynMessage } from './guards.js';\nimport getPromiseWithResolvers from './getPromiseWithResolvers.js';\nimport { extractMethodPathsFromMethods } from './methodSerialization.js';\nimport generateId from './generateId.js';\nimport { DEPRECATED_PENPAL_PARTICIPANT_ID } from './backwardCompatibility.js';\nimport namespace from './namespace.js';\n\ntype Options = {\n messenger: Messenger;\n methods: Methods;\n timeout: number | undefined;\n channel: string | undefined;\n log: Log | undefined;\n};\n\ntype HandshakeResult<TMethods extends Methods> = {\n remoteProxy: RemoteProxy<TMethods>;\n destroy: () => void;\n};\n\n/**\n * Attempts to establish communication with the remote via a handshake protocol.\n * The handshake protocol fulfills a few requirements:\n *\n * 1. One participant in the handshake may not be available when the other\n * participant starts the handshake. For example, a document inside an iframe\n * may not be loaded when the parent window starts a handshake.\n * 2. While #1 could be solved by having the consumer of Penpal specify which\n * participant should initiate the handshake, we'd rather avoid this\n * unnecessary cognitive load.\n * 3. While #1 could be solved by having the consumer of Penpal specify which\n * participant is the \"parent\" or \"child\" and then having Penpal assume\n * the child should initiate the handshake, we'd rather avoid parent-child\n * terminology since Penpal can support communication between two\n * participants where neither would be considered a parent nor child. It may\n * also be too presumptive that the child should always initiate the\n * handshake.\n * 4. For robustness, each participant must know that the other participant is\n * receiving its messages for the handshake to be considered complete.\n * 5. The handshake should support a participant attempting to\n * re-establish the connection. This can occur, for example, if an end user\n * were to right-click within an iframe and click reload.\n * 6. The handshake should allow a Messenger to easily attach something to\n * a handshake message from one participant to the other unidirectionally\n * (rather than from both participants to each other).\n * This is important when a participant needs to be in charge of, for\n * example, creating a MessageChannel and sending one MessagePort from the\n * MessagePort pair to the other participant. If both participants attempted\n * to do this it could lead to confusion.\n * 7. The handshake ideally shouldn't require sending handshake messages on an\n * interval (retrying until the other participant is ready to receive them).\n * Intervals can increase compute resources if the interval is too short\n * or increase latency if the interval is too long. While we could make this\n * configurable, it's additional mental load for the consumer. Additionally,\n * setInterval and setTimeout are not available within some contexts\n * (like AudioWorklet), where a consumer may like to use Penpal.\n *\n * To accomplish these requirements, the handshake protocol is as follows:\n * 1. Each participant generates a random participant ID.\n * 2. As soon as possible, each participant sends a SYN message containing its\n * participant ID to the other participant.\n * 3. When the SYN messages were sent, one of the participants may not have\n * been ready to receive the SYN message from the other. At least one\n * of the participants was ready, however, and should have received a SYN\n * message from the other participant. Each participant that did receive\n * a SYN message knows for sure that the other participant is now ready\n * to receive a SYN message, so it will send another SYN message in case\n * the other participant did not receive the first SYN message. This\n * ultimately results in each participant sending two SYN messages.\n * 4. Each participant now should have received at least one SYN message from\n * the other participant. Each participant compares their own ID with the\n * other participant's ID. Whichever participant has the higher ID\n * (using a simple string comparison) is considered the handshake leader\n * and will send an ACK1 message to the other participant.\n * 5. At this point, the handshake leader does not know whether the other\n * participant is actually receiving messages. The participant receiving\n * the ACK1 message will respond with an ACK2, informing the handshake\n * leader that it is indeed receiving messages.\n * 6. At this point, both participants know the other is receiving messages\n * and the handshake is complete.\n */\nconst shakeHands = <TMethods extends Methods>({\n messenger,\n methods,\n timeout,\n channel,\n log,\n}: Options): Promise<HandshakeResult<TMethods>> => {\n const participantId = generateId();\n let remoteParticipantId: string;\n const destroyHandlers: (() => void)[] = [];\n let isComplete = false;\n\n const methodPaths = extractMethodPathsFromMethods(methods);\n\n const { promise, resolve, reject } = getPromiseWithResolvers<\n HandshakeResult<TMethods>,\n PenpalError\n >();\n\n const timeoutId =\n timeout !== undefined\n ? setTimeout(() => {\n reject(\n new PenpalError(\n 'CONNECTION_TIMEOUT',\n `Connection timed out after ${timeout}ms`\n )\n );\n }, timeout)\n : undefined;\n\n const destroy = () => {\n for (const destroyHandler of destroyHandlers) {\n destroyHandler();\n }\n };\n\n const connectCallHandlerAndMethodProxies = () => {\n if (isComplete) {\n // If we get here, it means the remote is attempting to re-connect. While\n // that's supported, we don't need to run the rest of this function again.\n return;\n }\n\n destroyHandlers.push(connectCallHandler(messenger, methods, channel, log));\n\n const { remoteProxy, destroy: destroyMethodProxies } = connectRemoteProxy<\n TMethods\n >(messenger, channel, log);\n\n destroyHandlers.push(destroyMethodProxies);\n\n clearTimeout(timeoutId);\n isComplete = true;\n\n resolve({\n remoteProxy,\n destroy: destroy,\n });\n };\n\n const sendSynMessage = () => {\n const synMessage: SynMessage = {\n namespace,\n type: 'SYN',\n channel,\n participantId: participantId,\n };\n log?.(`Sending handshake SYN`, synMessage);\n\n try {\n messenger.sendMessage(synMessage);\n } catch (error) {\n reject(new PenpalError('TRANSMISSION_FAILED', (error as Error).message));\n }\n };\n\n const handleSynMessage = (message: SynMessage) => {\n log?.(`Received handshake SYN`, message);\n\n if (\n message.participantId === remoteParticipantId &&\n // TODO: Used for backward-compatibility. Remove in next major version.\n remoteParticipantId !== DEPRECATED_PENPAL_PARTICIPANT_ID\n ) {\n return;\n }\n\n remoteParticipantId = message.participantId;\n\n // We send another SYN message in case the other participant was not ready\n // when we sent the first SYN message.\n sendSynMessage();\n\n const isHandshakeLeader =\n participantId > remoteParticipantId ||\n // TODO: Used for backward-compatibility. Remove in next major version.\n remoteParticipantId === DEPRECATED_PENPAL_PARTICIPANT_ID;\n\n if (!isHandshakeLeader) {\n return;\n }\n\n const ack1Message: Ack1Message = {\n namespace,\n channel,\n type: 'ACK1',\n methodPaths,\n };\n log?.(`Sending handshake ACK1`, ack1Message);\n\n try {\n messenger.sendMessage(ack1Message);\n } catch (error) {\n reject(new PenpalError('TRANSMISSION_FAILED', (error as Error).message));\n return;\n }\n };\n\n const handleAck1Message = (message: Ack1Message) => {\n log?.(`Received handshake ACK1`, message);\n const ack2Message: Ack2Message = {\n namespace,\n channel,\n type: 'ACK2',\n };\n log?.(`Sending handshake ACK2`, ack2Message);\n\n try {\n messenger.sendMessage(ack2Message);\n } catch (error) {\n reject(new PenpalError('TRANSMISSION_FAILED', (error as Error).message));\n return;\n }\n\n connectCallHandlerAndMethodProxies();\n };\n\n const handleAck2Message = (message: Ack2Message) => {\n log?.(`Received handshake ACK2`, message);\n connectCallHandlerAndMethodProxies();\n };\n\n const handleMessage = (message: Message) => {\n if (isSynMessage(message)) {\n handleSynMessage(message);\n }\n\n if (isAck1Message(message)) {\n handleAck1Message(message);\n }\n\n if (isAck2Message(message)) {\n handleAck2Message(message);\n }\n };\n\n messenger.addMessageHandler(handleMessage);\n destroyHandlers.push(() => messenger.removeMessageHandler(handleMessage));\n\n sendSynMessage();\n\n return promise;\n};\n\nexport default shakeHands;\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst once = <T extends (...args: any[]) => any>(\n fn: T\n): ((...args: Parameters<T>) => ReturnType<T>) => {\n let isCalled = false;\n let result: ReturnType<T>;\n\n return (...args: Parameters<T>): ReturnType<T> => {\n if (!isCalled) {\n isCalled = true;\n result = fn(...args);\n }\n return result;\n };\n};\n\nexport default once;\n","import { DestroyMessage, Connection, Log, Message, Methods } from './types.js';\nimport PenpalError from './PenpalError.js';\nimport Messenger from './messengers/Messenger.js';\nimport shakeHands from './shakeHands.js';\nimport { isDestroyMessage, isMessage } from './guards.js';\nimport once from './once.js';\nimport namespace from './namespace.js';\n\ntype Options = {\n /**\n * Messenger in charge of handling communication with the remote.\n */\n messenger: Messenger;\n /**\n * Methods that may be called by the remote.\n */\n methods?: Methods;\n /**\n * The amount of time, in milliseconds, Penpal should wait\n * for a connection to be established before rejecting the connection promise.\n */\n timeout?: number;\n /**\n * A string identifier that disambiguates communication when establishing\n * multiple, parallel connections between two participants (e.g., two windows,\n * a window and a worker).\n */\n channel?: string;\n /**\n * A function for logging debug messages. Debug messages will only be\n * logged when this is defined.\n */\n log?: Log;\n};\n\nconst usedMessengers = new WeakSet<Messenger>();\n\n/**\n * Attempts to establish communication with the remote.\n */\nconst connect = <TMethods extends Methods>({\n messenger,\n methods = {},\n timeout,\n channel,\n log,\n}: Options): Connection<TMethods> => {\n if (!messenger) {\n throw new PenpalError('INVALID_ARGUMENT', 'messenger must be defined');\n }\n\n if (usedMessengers.has(messenger)) {\n throw new PenpalError(\n 'INVALID_ARGUMENT',\n 'A messenger can only be used for a single connection'\n );\n }\n\n usedMessengers.add(messenger);\n\n const connectionDestroyedHandlers: (() => void)[] = [messenger.destroy];\n\n const destroyConnection = once((notifyOtherParticipant: boolean) => {\n if (notifyOtherParticipant) {\n const destroyMessage: DestroyMessage = {\n namespace,\n channel,\n type: 'DESTROY',\n };\n\n try {\n messenger.sendMessage(destroyMessage);\n } catch (_) {\n // We do our best to notify the other participant of the connection, but\n // if there's an error in doing so (e.g., maybe the handshake hasn't\n // completed and a messenger can't send the message), it's probably not\n // worth bothering the consumer with an error.\n }\n }\n\n for (const connectionDestroyedHandler of connectionDestroyedHandlers) {\n connectionDestroyedHandler();\n }\n\n log?.('Connection destroyed');\n });\n\n const validateReceivedMessage = (data: unknown): data is Message => {\n return isMessage(data) && data.channel === channel;\n };\n\n const promise = (async () => {\n try {\n messenger.initialize({ log, validateReceivedMessage });\n messenger.addMessageHandler((message) => {\n if (isDestroyMessage(message)) {\n destroyConnection(false);\n }\n });\n\n const { remoteProxy, destroy } = await shakeHands<TMethods>({\n messenger,\n methods,\n timeout,\n channel,\n log,\n });\n connectionDestroyedHandlers.push(destroy);\n return remoteProxy;\n } catch (error) {\n destroyConnection(true);\n throw error as PenpalError;\n }\n })();\n\n return {\n promise,\n // Why we don't reject the connection promise when consumer calls destroy():\n // https://github.com/Aaronius/penpal/issues/51\n destroy: () => {\n destroyConnection(true);\n },\n };\n};\n\nexport default connect;\n","import { Log, Message } from '../types.js';\nimport Messenger, {\n InitializeMessengerOptions,\n MessageHandler,\n} from './Messenger.js';\nimport {\n downgradeMessage,\n isDeprecatedMessage,\n upgradeMessage,\n} from '../backwardCompatibility.js';\nimport { isAck2Message, isAck1Message, isSynMessage } from '../guards.js';\nimport PenpalError from '../PenpalError.js';\nimport PenpalBugError from '../PenpalBugError.js';\n\ntype Options = {\n /**\n * The window with which the current window will communicate.\n */\n remoteWindow: Window;\n /**\n * An array of strings or regular expressions defining to which origins\n * communication will be allowed. If not provided, communication will be\n * restricted to the origin of the current page. You may specify an allowed\n * origin of `*` to not restrict communication, but beware the risks of\n * doing so.\n */\n allowedOrigins?: (string | RegExp)[];\n};\n\n/**\n * Handles the details of communicating with a child window.\n */\nclass WindowMessenger implements Messenger {\n readonly #remoteWindow: Window;\n readonly #allowedOrigins: [string | RegExp, ...(string | RegExp)[]];\n #log?: Log;\n #validateReceivedMessage?: (data: unknown) => data is Message;\n #concreteRemoteOrigin?: string;\n #messageCallbacks = new Set<(message: Message) => void>();\n #port?: MessagePort;\n // TODO: Used for backward-compatibility. Remove in next major version.\n #isChildUsingDeprecatedProtocol = false;\n\n constructor({ remoteWindow, allowedOrigins }: Options) {\n if (!remoteWindow) {\n throw new PenpalError('INVALID_ARGUMENT', 'remoteWindow must be defined');\n }\n\n this.#remoteWindow = remoteWindow;\n this.#allowedOrigins = allowedOrigins?.length\n ? (allowedOrigins as [string | RegExp, ...(string | RegExp)[]])\n : [window.origin];\n }\n\n initialize = ({\n log,\n validateReceivedMessage,\n }: InitializeMessengerOptions) => {\n this.#log = log;\n this.#validateReceivedMessage = validateReceivedMessage;\n window.addEventListener('message', this.#handleMessageFromRemoteWindow);\n };\n\n sendMessage = (message: Message, transferables?: Transferable[]): void => {\n if (isSynMessage(message)) {\n const originForSending = this.#getOriginForSendingMessage(message);\n this.#remoteWindow.postMessage(message, {\n targetOrigin: originForSending,\n transfer: transferables,\n });\n return;\n }\n\n if (\n isAck1Message(message) ||\n // If the child is using a previous version of Penpal, we need to\n // downgrade the message and send it through the window rather than\n // the port because older versions of Penpal don't use MessagePorts.\n this.#isChildUsingDeprecatedProtocol\n ) {\n const payload = this.#isChildUsingDeprecatedProtocol\n ? downgradeMessage(message)\n : message;\n const originForSending = this.#getOriginForSendingMessage(message);\n this.#remoteWindow.postMessage(payload, {\n targetOrigin: originForSending,\n transfer: transferables,\n });\n return;\n }\n\n if (isAck2Message(message)) {\n const { port1, port2 } = new MessageChannel();\n this.#port = port1;\n port1.addEventListener('message', this.#handleMessageFromPort);\n port1.start();\n const transferablesToSend = [port2, ...(transferables || [])];\n const originForSending = this.#getOriginForSendingMessage(message);\n this.#remoteWindow.postMessage(message, {\n targetOrigin: originForSending,\n transfer: transferablesToSend,\n });\n return;\n }\n\n if (this.#port) {\n this.#port.postMessage(message, {\n transfer: transferables,\n });\n return;\n }\n\n throw new PenpalBugError('Port is undefined');\n };\n\n addMessageHandler = (callback: MessageHandler): void => {\n this.#messageCallbacks.add(callback);\n };\n\n removeMessageHandler = (callback: MessageHandler): void => {\n this.#messageCallbacks.delete(callback);\n };\n\n destroy = () => {\n window.removeEventListener('message', this.#handleMessageFromRemoteWindow);\n this.#destroyPort();\n this.#messageCallbacks.clear();\n };\n\n #isAllowedOrigin = (origin: string) => {\n return this.#allowedOrigins.some((allowedOrigin) =>\n allowedOrigin instanceof RegExp\n ? allowedOrigin.test(origin)\n : allowedOrigin === origin || allowedOrigin === '*'\n );\n };\n\n #getOriginForSendingMessage = (message: Message) => {\n // It's safe to send the SYN message to any origin because it doesn't contain\n // anything sensitive. When Penpal receives a SYN message, the origin on\n // the message (which we call the concrete origin) is validated against the\n // configured allowed origins. All subsequent messages will be sent to the\n // concrete origin.\n // If you decide to change this, consider https://github.com/Aaronius/penpal/issues/103\n if (isSynMessage(message)) {\n return '*';\n }\n\n if (!this.#concreteRemoteOrigin) {\n throw new PenpalBugError('Concrete remote origin not set');\n }\n\n // If the concrete remote origin (the origin we received from the remote\n // on a prior message) is 'null', it means the remote is within\n // an \"opaque origin\". The only way to post a message to an\n // opaque origin is by using '*'. This does carry some security risk,\n // so we only do this if the consumer has specifically defined '*' as\n // an allowed origin. Opaque origins occur, for example, when\n // loading an HTML document directly from the filesystem (not a\n // web server) or through a data URI.\n return this.#concreteRemoteOrigin === 'null' &&\n this.#allowedOrigins.includes('*')\n ? '*'\n : this.#concreteRemoteOrigin;\n };\n\n #destroyPort = () => {\n this.#port?.removeEventListener('message', this.#handleMessageFromPort);\n this.#port?.close();\n this.#port = undefined;\n };\n\n #handleMessageFromRemoteWindow = ({\n source,\n origin,\n ports,\n data,\n }: MessageEvent): void => {\n if (source !== this.#remoteWindow) {\n return;\n }\n\n // TODO: Used for backward-compatibility. Remove in next major version.\n if (isDeprecatedMessage(data)) {\n this.#log?.(\n 'Please upgrade the child window to the latest version of Penpal.'\n );\n this.#isChildUsingDeprecatedProtocol = true;\n data = upgradeMessage(data);\n }\n\n if (!this.#validateReceivedMessage?.(data)) {\n return;\n }\n\n if (!this.#isAllowedOrigin(origin)) {\n this.#log?.(\n `Received a message from origin \\`${origin}\\` which did not match ` +\n `allowed origins \\`[${this.#allowedOrigins.join(', ')}]\\``\n );\n return;\n }\n\n if (isSynMessage(data)) {\n // If we receive a SYN message and already have a port, it means\n // the child is re-connecting, in which case we'll receive a new port.\n // For this reason, we always make sure we destroy the existing port.\n this.#destroyPort();\n this.#concreteRemoteOrigin = origin;\n }\n\n if (\n isAck2Message(data) &&\n // Previous versions of Penpal don't use MessagePorts and do all\n // communication through the window.\n !this.#isChildUsingDeprecatedProtocol\n ) {\n this.#port = ports[0];\n\n if (!this.#port) {\n throw new PenpalBugError('No port received on ACK2');\n }\n\n this.#port.addEventListener('message', this.#handleMessageFromPort);\n this.#port.start();\n }\n\n for (const callback of this.#messageCallbacks) {\n callback(data);\n }\n };\n\n #handleMessageFromPort = ({ data }: MessageEvent): void => {\n // Unlike in _handleMessageFromWindow, we don't need to check if\n // the message is from a deprecated version of Penpal because older versions\n // of Penpal don't use MessagePorts.\n if (!this.#validateReceivedMessage?.(data)) {\n return;\n }\n\n for (const callback of this.#messageCallbacks) {\n callback(data);\n }\n };\n}\n\nexport default WindowMessenger;\n","import { Message } from '../types.js';\nimport Messenger, {\n InitializeMessengerOptions,\n MessageHandler,\n} from './Messenger.js';\nimport { isAck2Message, isAck1Message, isSynMessage } from '../guards.js';\nimport PenpalError from '../PenpalError.js';\nimport PenpalBugError from '../PenpalBugError.js';\n\n// This is needed to resolve some conflict errors. There may be a better way.\ntype MessageTarget = Pick<\n Worker,\n 'postMessage' | 'addEventListener' | 'removeEventListener'\n>;\n\ntype Options = {\n /**\n * The web worker receiving/sending communication from/to the parent window.\n * If this messenger is being used within the worker, `worker` should\n * typically be set to `self`.\n */\n worker: Worker | DedicatedWorkerGlobalScope;\n};\n\n/**\n * Handles the details of communicating with a child web worker.\n */\nclass WorkerMessenger implements Messenger {\n #worker: MessageTarget;\n #validateReceivedMessage?: (data: unknown) => data is Message;\n #messageCallbacks = new Set<MessageHandler>();\n #port?: MessagePort;\n\n constructor({ worker }: Options) {\n if (!worker) {\n throw new PenpalError('INVALID_ARGUMENT', 'worker must be defined');\n }\n\n this.#worker = worker;\n }\n\n initialize = ({ validateReceivedMessage }: InitializeMessengerOptions) => {\n this.#validateReceivedMessage = validateReceivedMessage;\n this.#worker.addEventListener('message', this.#handleMessage);\n };\n\n sendMessage = (message: Message, transferables?: Transferable[]): void => {\n if (isSynMessage(message) || isAck1Message(message)) {\n this.#worker.postMessage(message, { transfer: transferables });\n return;\n }\n\n if (isAck2Message(message)) {\n const { port1, port2 } = new MessageChannel();\n this.#port = port1;\n port1.addEventListener('message', this.#handleMessage);\n port1.start();\n\n this.#worker.postMessage(message, {\n transfer: [port2, ...(transferables || [])],\n });\n return;\n }\n\n if (this.#port) {\n this.#port.postMessage(message, {\n transfer: transferables,\n });\n return;\n }\n\n throw new PenpalBugError('Port is undefined');\n };\n\n addMessageHandler = (callback: MessageHandler): void => {\n this.#messageCallbacks.add(callback);\n };\n\n removeMessageHandler = (callback: MessageHandler): void => {\n this.#messageCallbacks.delete(callback);\n };\n\n destroy = () => {\n this.#worker.removeEventListener('message', this.#handleMessage);\n this.#destroyPort();\n this.#messageCallbacks.clear();\n };\n\n #destroyPort = () => {\n this.#port?.removeEventListener('message', this.#handleMessage);\n this.#port?.close();\n this.#port = undefined;\n };\n\n #handleMessage = ({ ports, data }: MessageEvent): void => {\n if (!this.#validateReceivedMessage?.(data)) {\n return;\n }\n\n if (isSynMessage(data)) {\n // If we receive a SYN message and already have a port, it means\n // the child is re-connecting, in which case we'll receive a new port.\n // For this reason, we always make sure we destroy the existing port.\n this.#destroyPort();\n }\n\n if (isAck2Message(data)) {\n this.#port = ports[0];\n\n if (!this.#port) {\n throw new PenpalBugError('No port received on ACK2');\n }\n\n this.#port.addEventListener('message', this.#handleMessage);\n this.#port.start();\n }\n\n for (const callback of this.#messageCallbacks) {\n callback(data);\n }\n };\n}\n\nexport default WorkerMessenger;\n","import { Message } from '../types.js';\nimport Messenger, {\n InitializeMessengerOptions,\n MessageHandler,\n} from './Messenger.js';\nimport PenpalError from '../PenpalError.js';\n\ntype Options = {\n /**\n * The port used to communicate to the other port of the port pair.\n */\n port: MessagePort;\n};\n\n/**\n * Handles the details of communicating on a MessagePort.\n */\nclass PortMessenger implements Messenger {\n #port: MessagePort;\n #validateReceivedMessage?: (data: unknown) => data is Message;\n #messageCallbacks = new Set<MessageHandler>();\n\n constructor({ port }: Options) {\n if (!port) {\n throw new PenpalError('INVALID_ARGUMENT', 'port must be defined');\n }\n\n this.#port = port;\n }\n\n initialize = ({ validateReceivedMessage }: InitializeMessengerOptions) => {\n this.#validateReceivedMessage = validateReceivedMessage;\n this.#port.addEventListener('message', this.#handleMessage);\n this.#port.start();\n };\n\n sendMessage = (message: Message, transferables?: Transferable[]): void => {\n this.#port?.postMessage(message, {\n transfer: transferables,\n });\n };\n\n addMessageHandler = (callback: MessageHandler): void => {\n this.#messageCallbacks.add(callback);\n };\n\n removeMessageHandler = (callback: MessageHandler): void => {\n this.#messageCallbacks.delete(callback);\n };\n\n destroy = () => {\n this.#port.removeEventListener('message', this.#handleMessage);\n this.#port.close();\n this.#messageCallbacks.clear();\n };\n\n #handleMessage = ({ data }: MessageEvent): void => {\n if (!this.#validateReceivedMessage?.(data)) {\n return;\n }\n\n for (const callback of this.#messageCallbacks) {\n callback(data);\n }\n };\n}\n\nexport default PortMessenger;\n","// Not intended to be used internally. Can be useful externally\n// in projects not using TypeScript. It has the `Obj` suffix to disambiguate\n// it from the ErrorCode string union.\nconst ErrorCodeObj = {\n ConnectionDestroyed: 'CONNECTION_DESTROYED',\n ConnectionTimeout: 'CONNECTION_TIMEOUT',\n InvalidArgument: 'INVALID_ARGUMENT',\n MethodCallTimeout: 'METHOD_CALL_TIMEOUT',\n MethodNotFound: 'METHOD_NOT_FOUND',\n TransmissionFailed: 'TRANSMISSION_FAILED',\n} as const;\n\nexport default ErrorCodeObj;\n","import { Log } from './types.js';\n\nconst debug = (prefix?: string): Log => {\n return (...args: unknown[]) => {\n console.log(`✍️ %c${prefix}%c`, 'font-weight: bold;', '', ...args);\n };\n};\n\nexport default debug;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/PenpalError.ts","../src/errorSerialization.ts","../src/Reply.ts","../src/namespace.ts","../src/guards.ts","../src/methodSerialization.ts","../src/connectCallHandler.ts","../src/generateId.ts","../src/CallOptions.ts","../src/connectRemoteProxy.ts","../src/getPromiseWithResolvers.ts","../src/backwardCompatibility.ts","../src/shakeHands.ts","../src/once.ts","../src/connect.ts","../src/messengers/WindowMessenger.ts","../src/messengers/WorkerMessenger.ts","../src/messengers/PortMessenger.ts","../src/ErrorCodeObj.ts","../src/debug.ts"],"names":["brand"],"mappings":"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","file":"penpal.cjs","sourcesContent":["import { ErrorCode } from './types.js';\n\nclass PenpalError extends Error {\n public code: ErrorCode;\n\n constructor(code: ErrorCode, message: string) {\n super(message);\n this.name = 'PenpalError';\n this.code = code;\n }\n}\n\nexport default PenpalError;\n","import { SerializedError } from './types.js';\nimport PenpalError from './PenpalError.js';\n\n/**\n * Converts an error object into a plain object.\n */\nexport const serializeError = (error: Error): SerializedError => ({\n name: error.name,\n message: error.message,\n stack: error.stack,\n penpalCode: error instanceof PenpalError ? error.code : undefined,\n});\n\n/**\n * Converts a plain object into an error object.\n */\nexport const deserializeError = ({\n name,\n message,\n stack,\n penpalCode,\n}: SerializedError): Error => {\n const deserializedError = penpalCode\n ? new PenpalError(penpalCode, message)\n : new Error(message);\n\n deserializedError.name = name;\n deserializedError.stack = stack;\n\n return deserializedError;\n};\n","const brand: unique symbol = Symbol('Reply');\n\nclass Reply<T = unknown> {\n readonly value: T;\n readonly transferables?: Transferable[];\n\n // Allows TypeScript to distinguish between an actual instance of this\n // class versus an object that looks structurally similar.\n // eslint-disable-next-line no-unused-private-class-members\n #brand = brand;\n\n constructor(\n value: T,\n options?: {\n transferables?: Transferable[];\n }\n ) {\n this.value = value;\n this.transferables = options?.transferables;\n }\n}\n\nexport default Reply;\n","export default 'penpal' as const;\n","import namespace from './namespace.js';\nimport {\n Ack2Message,\n CallMessage,\n Message,\n ReplyMessage,\n Ack1Message,\n SynMessage,\n DestroyMessage,\n} from './types.js';\n\nexport const isObject = (\n value: unknown\n): value is Record<string | number | symbol, unknown> => {\n return typeof value === 'object' && value !== null;\n};\n\nexport const isFunction = (value: unknown) => {\n return typeof value === 'function';\n};\n\nexport const isMessage = (data: unknown): data is Message => {\n return isObject(data) && data.namespace === namespace;\n};\n\nexport const isSynMessage = (message: Message): message is SynMessage => {\n return message.type === 'SYN';\n};\n\nexport const isAck1Message = (message: Message): message is Ack1Message => {\n return message.type === 'ACK1';\n};\n\nexport const isAck2Message = (message: Message): message is Ack2Message => {\n return message.type === 'ACK2';\n};\n\nexport const isCallMessage = (message: Message): message is CallMessage => {\n return message.type === 'CALL';\n};\n\nexport const isReplyMessage = (message: Message): message is ReplyMessage => {\n return message.type === 'REPLY';\n};\n\nexport const isDestroyMessage = (\n message: Message\n): message is DestroyMessage => {\n return message.type === 'DESTROY';\n};\n","import { MethodPath, Methods } from './types.js';\nimport { isFunction, isObject } from './guards.js';\n\n// TODO: Used for backward-compatibility. Remove in next major version.\n/**\n * Given an object of (nested) keys to functions, extract paths to each function.\n *\n * @example\n * Given this Method object:\n * {\n * one: {\n * two: () => {}\n * }\n * three: () => {}\n * }\n *\n * the extracted MethodPath[] would be:\n * [\n * ['one', 'two'],\n * ['three']\n * ]\n */\nexport const extractMethodPathsFromMethods = (\n methods: Methods,\n currentPath: MethodPath = []\n) => {\n const methodPaths: MethodPath[] = [];\n\n for (const key of Object.keys(methods)) {\n const value = methods[key];\n\n if (isFunction(value)) {\n methodPaths.push([...currentPath, key]);\n } else if (isObject(value)) {\n methodPaths.push(\n ...extractMethodPathsFromMethods(value, [...currentPath, key])\n );\n }\n }\n\n return methodPaths;\n};\n\nexport const getMethodAtMethodPath = (\n methodPath: MethodPath,\n methods: Methods\n) => {\n const result = methodPath.reduce<Methods | Function | undefined>(\n (acc, pathSegment) => {\n return isObject(acc) ? acc[pathSegment] : undefined;\n },\n methods\n );\n\n return isFunction(result) ? result : undefined;\n};\n\nexport const formatMethodPath = (methodPath: MethodPath) => {\n return methodPath.join('.');\n};\n","import { serializeError } from './errorSerialization.js';\nimport { Message, ReplyMessage, Methods, Log } from './types.js';\nimport Reply from './Reply.js';\nimport Messenger from './messengers/Messenger.js';\nimport PenpalError from './PenpalError.js';\nimport {\n formatMethodPath,\n getMethodAtMethodPath,\n} from './methodSerialization.js';\nimport { isCallMessage } from './guards.js';\nimport namespace from './namespace.js';\n\nconst createErrorReplyMessage = (\n channel: string | undefined,\n callId: string,\n error: unknown\n): ReplyMessage => ({\n namespace,\n channel,\n type: 'REPLY',\n callId,\n isError: true,\n ...(error instanceof Error\n ? { value: serializeError(error), isSerializedErrorInstance: true }\n : { value: error }),\n});\n\n/**\n * Listens for \"call\" messages from the remote, executes the corresponding method,\n * and responds with the return value or error.\n */\nconst connectCallHandler = (\n messenger: Messenger,\n methods: Methods,\n channel: string | undefined,\n log: Log | undefined\n) => {\n let isDestroyed = false;\n\n const handleMessage = async (message: Message) => {\n if (isDestroyed) {\n // It's possible to throw an error here, but it would only be catchable\n // using window.onerror since we're in an asynchronously-called function.\n // There is no method call the consumer is making that they could wrap in\n // a try-catch. Even if the consumer were to catch the error somehow,\n // the value of doing so is questionable.\n return;\n }\n\n if (!isCallMessage(message)) {\n return;\n }\n\n log?.(`Received ${formatMethodPath(message.methodPath)}() call`, message);\n\n const { methodPath, args, id: callId } = message;\n let replyMessage: ReplyMessage;\n let transferables: Transferable[] | undefined;\n\n try {\n const method = getMethodAtMethodPath(methodPath, methods);\n\n if (!method) {\n throw new PenpalError(\n 'METHOD_NOT_FOUND',\n `Method \\`${formatMethodPath(methodPath)}\\` is not found.`\n );\n }\n\n let value: unknown = await method(...args);\n\n if (value instanceof Reply) {\n transferables = value.transferables;\n value = await value.value;\n }\n\n replyMessage = {\n namespace,\n channel,\n type: 'REPLY',\n callId,\n value,\n };\n } catch (error) {\n replyMessage = createErrorReplyMessage(channel, callId, error);\n }\n\n // Although we checked this at the beginning of the function, we need to\n // check it again because we've made async calls, and the connection may\n // have been destroyed in the meantime.\n if (isDestroyed) {\n return;\n }\n\n try {\n log?.(`Sending ${formatMethodPath(methodPath)}() reply`, replyMessage);\n messenger.sendMessage(replyMessage, transferables);\n } catch (error) {\n // If a consumer attempts to send an object that's not\n // cloneable (e.g., window), we want to ensure the receiver's promise\n // gets rejected.\n if ((error as Error).name === 'DataCloneError') {\n replyMessage = createErrorReplyMessage(channel, callId, error as Error);\n log?.(`Sending ${formatMethodPath(methodPath)}() reply`, replyMessage);\n messenger.sendMessage(replyMessage);\n }\n throw error;\n }\n };\n\n messenger.addMessageHandler(handleMessage);\n\n return () => {\n isDestroyed = true;\n messenger.removeMessageHandler(handleMessage);\n };\n};\n\nexport default connectCallHandler;\n","/**\n * @return A unique ID\n */\n// crypto.randomUUID is not available in insecure contexts.\nexport default crypto.randomUUID?.bind(crypto) ??\n (() =>\n new Array(4)\n .fill(0)\n .map(() =>\n Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16)\n )\n .join('-'));\n","const brand: unique symbol = Symbol('CallOptions');\n\nclass CallOptions {\n readonly transferables?: Transferable[];\n readonly timeout?: number;\n\n // Allows TypeScript to distinguish between an actual instance of this\n // class versus an object that looks structurally similar.\n // eslint-disable-next-line no-unused-private-class-members\n #brand = brand;\n\n constructor(options?: { transferables?: Transferable[]; timeout?: number }) {\n this.transferables = options?.transferables;\n this.timeout = options?.timeout;\n }\n}\n\nexport default CallOptions;\n","import generateId from './generateId.js';\nimport { deserializeError } from './errorSerialization.js';\nimport { formatMethodPath } from './methodSerialization.js';\nimport {\n Message,\n RemoteProxy,\n Methods,\n MethodPath,\n CallMessage,\n Log,\n} from './types.js';\nimport CallOptions from './CallOptions.js';\nimport Messenger from './messengers/Messenger.js';\nimport PenpalError from './PenpalError.js';\nimport { isReplyMessage } from './guards.js';\nimport namespace from './namespace.js';\n\ntype ReplyHandler = {\n methodPath: MethodPath;\n resolve: (value: unknown) => void;\n reject: (reason: unknown) => void;\n timeoutId?: number;\n};\n\nconst methodsToTreatAsNative = new Set(['apply', 'call', 'bind']);\n\nconst createRemoteProxy = (\n callback: (path: MethodPath, args: unknown[]) => void,\n log?: Log,\n path: MethodPath = []\n): Methods => {\n return new Proxy(\n path.length\n ? () => {\n // Intentionally empty\n }\n : Object.create(null),\n {\n get(target, prop: string) {\n // If a promise is resolved with this proxy object, the JavaScript\n // runtime will look for a `then` property on this object to determine\n // if it should be treated as a promise (to support promise chaining).\n // If we don't return undefined here, the JavaScript runtime will treat\n // this object as a promise and attempt to call `then`, which will\n // then send a call message to the remote. This is not what we want.\n if (prop === 'then') {\n return;\n }\n\n // Because we're using a proxy and because Penpal supports developers\n // exposing nested methods, we have a predicament. If a developer\n // calls, for example, remote.auth.apply(), are they\n // attempting to call a nested apply() method that a developer has\n // explicitly exposed from the remote? Could they instead be attempting\n // to call Function.prototype.apply() on the remote.auth() method?\n // Without the remote telling the local Penpal which methods the\n // developer has exposed, it has no way of knowing (and the main reason\n // we use a proxy is so that Penpal doesn't have to communicate which\n // methods are exposed). So, we treat certain methods as native methods\n // and return the native method rather than a proxy. The downside of\n // this is that if a developer has explicitly exposed a nested method\n // with the same name as one of these native method names, the developer\n // will be unable to call the exposed remote method because they will\n // be calling the method on the Function prototype instead.\n if (path.length && methodsToTreatAsNative.has(prop)) {\n return Reflect.get(target, prop);\n }\n\n return createRemoteProxy(callback, log, [...path, prop]);\n },\n apply(target, _thisArg, args) {\n return callback(path, args);\n },\n }\n );\n};\n\nconst getDestroyedConnectionMethodCallError = (methodPath: MethodPath) => {\n return new PenpalError(\n 'CONNECTION_DESTROYED',\n `Method call ${formatMethodPath(\n methodPath\n )}() failed due to destroyed connection`\n );\n};\n\n/**\n * Creates a proxy. When methods are called on the proxy, a \"call\" message will\n * be sent to the remote, the remote's corresponding method will be\n * executed, and the method's return value will be returned via a message.\n */\nconst connectRemoteProxy = <TMethods extends Methods>(\n messenger: Messenger,\n channel: string | undefined,\n log: Log | undefined\n) => {\n let isDestroyed = false;\n const replyHandlers = new Map<string, ReplyHandler>();\n\n const handleMessage = (message: Message) => {\n if (!isReplyMessage(message)) {\n return;\n }\n\n const { callId, value, isError, isSerializedErrorInstance } = message;\n const replyHandler = replyHandlers.get(callId);\n\n if (!replyHandler) {\n return;\n }\n\n replyHandlers.delete(callId);\n log?.(\n `Received ${formatMethodPath(replyHandler.methodPath)}() call`,\n message\n );\n\n if (isError) {\n replyHandler.reject(\n isSerializedErrorInstance ? deserializeError(value) : value\n );\n } else {\n replyHandler.resolve(value);\n }\n };\n\n messenger.addMessageHandler(handleMessage);\n\n const remoteProxy = createRemoteProxy((methodPath, args) => {\n if (isDestroyed) {\n throw getDestroyedConnectionMethodCallError(methodPath);\n }\n\n const callId = generateId();\n const lastArg = args[args.length - 1];\n const lastArgIsOptions = lastArg instanceof CallOptions;\n const { timeout, transferables } = lastArgIsOptions ? lastArg : {};\n const argsWithoutOptions = lastArgIsOptions ? args.slice(0, -1) : args;\n\n return new Promise((resolve, reject) => {\n // We reference `window.setTimeout` instead of just `setTimeout`\n // so that the TypeScript engine doesn't\n // get confused when running tests. Something within\n // Karma + @rollup/plugin-typescript leaks node types into source\n // files when running tests. Node's setTimeout has a return type of\n // Timeout rather than number, resulting in a build error when\n // running tests if we don't disambiguate the browser setTimeout\n // from node's setTimeout. There may be a better way to configure\n // Karma + Rollup + Typescript to avoid node type leakage.\n const timeoutId =\n timeout !== undefined\n ? window.setTimeout(() => {\n replyHandlers.delete(callId);\n reject(\n new PenpalError(\n 'METHOD_CALL_TIMEOUT',\n `Method call ${formatMethodPath(\n methodPath\n )}() timed out after ${timeout}ms`\n )\n );\n }, timeout)\n : undefined;\n\n replyHandlers.set(callId, { methodPath, resolve, reject, timeoutId });\n\n try {\n const callMessage: CallMessage = {\n namespace,\n channel,\n type: 'CALL',\n id: callId,\n methodPath,\n args: argsWithoutOptions,\n };\n log?.(`Sending ${formatMethodPath(methodPath)}() call`, callMessage);\n messenger.sendMessage(callMessage, transferables);\n } catch (error) {\n reject(\n new PenpalError('TRANSMISSION_FAILED', (error as Error).message)\n );\n }\n });\n }, log) as RemoteProxy<TMethods>;\n\n const destroy = () => {\n isDestroyed = true;\n messenger.removeMessageHandler(handleMessage);\n\n for (const { methodPath, reject, timeoutId } of replyHandlers.values()) {\n clearTimeout(timeoutId);\n reject(getDestroyedConnectionMethodCallError(methodPath));\n }\n\n replyHandlers.clear();\n };\n\n return {\n remoteProxy,\n destroy,\n };\n};\n\nexport default connectRemoteProxy;\n","// Just use the native Promise.withResolvers() once it gains a bit more\n// adoption. Safari was the last major browser to support it, which happened\n// on March 5, 2024 in Safari 17.4.\nconst getPromiseWithResolvers = <ResolvedValueType, RejectedValueType>() => {\n let resolve: (value: ResolvedValueType) => void;\n let reject: (error: RejectedValueType) => void;\n\n const promise = new Promise<ResolvedValueType>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n return {\n promise,\n resolve: resolve!,\n reject: reject!,\n };\n};\n\nexport default getPromiseWithResolvers;\n","import { Message, MethodPath } from './types.js';\nimport namespace from './namespace.js';\nimport {\n isCallMessage,\n isReplyMessage,\n isAck1Message,\n isObject,\n} from './guards.js';\nimport PenpalError from './PenpalError.js';\n\nexport const DEPRECATED_PENPAL_PARTICIPANT_ID = 'deprecated-penpal';\n\n// TODO: This file is used for backward-compatibility. Remove in next major version.\n\nenum DeprecatedMessageType {\n Call = 'call',\n Reply = 'reply',\n Syn = 'syn',\n SynAck = 'synAck',\n Ack = 'ack',\n}\n\nenum DeprecatedResolution {\n Fulfilled = 'fulfilled',\n Rejected = 'rejected',\n}\n\ntype DeprecatedSynMessage = {\n penpal: DeprecatedMessageType.Syn;\n};\n\ntype DeprecatedSynAckMessage = {\n penpal: DeprecatedMessageType.SynAck;\n methodNames: string[];\n};\n\ntype DeprecatedAckMessage = {\n penpal: DeprecatedMessageType.Ack;\n methodNames: string[];\n};\n\ntype DeprecatedCallMessage = {\n penpal: DeprecatedMessageType.Call;\n id: number;\n methodName: string;\n args: unknown[];\n};\n\ntype DeprecatedSerializedError = {\n name: string;\n message: string;\n stack?: string;\n};\n\ntype DeprecatedReplyMessage = {\n penpal: DeprecatedMessageType.Reply;\n id: number;\n} & (\n | {\n resolution: DeprecatedResolution.Fulfilled;\n returnValue: unknown;\n returnValueIsError?: false;\n }\n | {\n resolution: DeprecatedResolution.Rejected;\n returnValue: unknown;\n returnValueIsError?: false;\n }\n | {\n resolution: DeprecatedResolution.Rejected;\n returnValue: DeprecatedSerializedError;\n returnValueIsError: true;\n }\n);\n\nexport type DeprecatedMessage =\n | DeprecatedSynMessage\n | DeprecatedSynAckMessage\n | DeprecatedAckMessage\n | DeprecatedCallMessage\n | DeprecatedReplyMessage;\n\nexport const isDeprecatedMessage = (\n data: unknown\n): data is DeprecatedMessage => {\n return isObject(data) && 'penpal' in data;\n};\n\nconst upgradeMethodPath = (methodPath: string): MethodPath =>\n methodPath.split('.');\nconst downgradeMethodPath = (methodPath: MethodPath) => methodPath.join('.');\n\nconst stringifyUnknownMessage = (message: unknown) => {\n try {\n return JSON.stringify(message);\n } catch (_) {\n return String(message);\n }\n};\n\nconst getUnexpectedMessageError = (message: unknown) => {\n return new PenpalError(\n 'TRANSMISSION_FAILED',\n `Unexpected message to translate: ${stringifyUnknownMessage(message)}`\n );\n};\n\nexport const upgradeMessage = (message: DeprecatedMessage): Message => {\n if (message.penpal === DeprecatedMessageType.Syn) {\n return {\n namespace,\n channel: undefined,\n type: 'SYN',\n participantId: DEPRECATED_PENPAL_PARTICIPANT_ID,\n };\n }\n\n if (message.penpal === DeprecatedMessageType.Ack) {\n return {\n namespace,\n channel: undefined,\n type: 'ACK2',\n };\n }\n\n if (message.penpal === DeprecatedMessageType.Call) {\n return {\n namespace,\n channel: undefined,\n type: 'CALL',\n // Actually converting the ID to a string would break communication.\n id: (message.id as unknown) as string,\n methodPath: upgradeMethodPath(message.methodName),\n args: message.args,\n };\n }\n\n if (message.penpal === DeprecatedMessageType.Reply) {\n if (message.resolution === DeprecatedResolution.Fulfilled) {\n return {\n namespace,\n channel: undefined,\n type: 'REPLY',\n // Actually converting the ID to a string would break communication.\n callId: (message.id as unknown) as string,\n value: message.returnValue,\n };\n } else {\n return {\n namespace,\n channel: undefined,\n type: 'REPLY',\n // Actually converting the ID to a string would break communication.\n callId: (message.id as unknown) as string,\n isError: true,\n ...(message.returnValueIsError\n ? {\n value: message.returnValue,\n isSerializedErrorInstance: true,\n }\n : {\n value: message.returnValue,\n }),\n };\n }\n }\n\n throw getUnexpectedMessageError(message);\n};\n\nexport const downgradeMessage = (message: Message): DeprecatedMessage => {\n if (isAck1Message(message)) {\n return {\n penpal: DeprecatedMessageType.SynAck,\n methodNames: message.methodPaths.map(downgradeMethodPath),\n };\n }\n\n if (isCallMessage(message)) {\n return {\n penpal: DeprecatedMessageType.Call,\n // Actually converting the ID to a number would break communication.\n id: (message.id as unknown) as number,\n methodName: downgradeMethodPath(message.methodPath),\n args: message.args,\n };\n }\n\n if (isReplyMessage(message)) {\n if (message.isError) {\n return {\n penpal: DeprecatedMessageType.Reply,\n // Actually converting the ID to a number would break communication.\n id: (message.callId as unknown) as number,\n resolution: DeprecatedResolution.Rejected,\n ...(message.isSerializedErrorInstance\n ? {\n returnValue: message.value,\n returnValueIsError: true,\n }\n : { returnValue: message.value }),\n };\n } else {\n return {\n penpal: DeprecatedMessageType.Reply,\n // Actually converting the ID to a number would break communication.\n id: (message.callId as unknown) as number,\n resolution: DeprecatedResolution.Fulfilled,\n returnValue: message.value,\n };\n }\n }\n\n throw getUnexpectedMessageError(message);\n};\n","import Messenger from './messengers/Messenger.js';\nimport {\n Ack2Message,\n Methods,\n Message,\n RemoteProxy,\n Ack1Message,\n SynMessage,\n Log,\n} from './types.js';\nimport PenpalError from './PenpalError.js';\nimport connectCallHandler from './connectCallHandler.js';\nimport connectRemoteProxy from './connectRemoteProxy.js';\nimport { isAck2Message, isAck1Message, isSynMessage } from './guards.js';\nimport getPromiseWithResolvers from './getPromiseWithResolvers.js';\nimport { extractMethodPathsFromMethods } from './methodSerialization.js';\nimport generateId from './generateId.js';\nimport { DEPRECATED_PENPAL_PARTICIPANT_ID } from './backwardCompatibility.js';\nimport namespace from './namespace.js';\n\ntype Options = {\n messenger: Messenger;\n methods: Methods;\n timeout: number | undefined;\n channel: string | undefined;\n log: Log | undefined;\n};\n\ntype HandshakeResult<TMethods extends Methods> = {\n remoteProxy: RemoteProxy<TMethods>;\n destroy: () => void;\n};\n\n/**\n * Attempts to establish communication with the remote via a handshake protocol.\n * The handshake protocol fulfills a few requirements:\n *\n * 1. One participant in the handshake may not be available when the other\n * participant starts the handshake. For example, a document inside an iframe\n * may not be loaded when the parent window starts a handshake.\n * 2. While #1 could be solved by having the consumer of Penpal specify which\n * participant should initiate the handshake, we'd rather avoid this\n * unnecessary cognitive load.\n * 3. While #1 could be solved by having the consumer of Penpal specify which\n * participant is the \"parent\" or \"child\" and then having Penpal assume\n * the child should initiate the handshake, we'd rather avoid parent-child\n * terminology since Penpal can support communication between two\n * participants where neither would be considered a parent nor child. It may\n * also be too presumptive that the child should always initiate the\n * handshake.\n * 4. For robustness, each participant must know that the other participant is\n * receiving its messages for the handshake to be considered complete.\n * 5. The handshake should support a participant attempting to\n * re-establish the connection. This can occur, for example, if an end user\n * were to right-click within an iframe and click reload.\n * 6. The handshake should allow a Messenger to easily attach something to\n * a handshake message from one participant to the other unidirectionally\n * (rather than from both participants to each other).\n * This is important when a participant needs to be in charge of, for\n * example, creating a MessageChannel and sending one MessagePort from the\n * MessagePort pair to the other participant. If both participants attempted\n * to do this it could lead to confusion.\n * 7. The handshake ideally shouldn't require sending handshake messages on an\n * interval (retrying until the other participant is ready to receive them).\n * Intervals can increase compute resources if the interval is too short\n * or increase latency if the interval is too long. While we could make this\n * configurable, it's additional mental load for the consumer. Additionally,\n * setInterval and setTimeout are not available within some contexts\n * (like AudioWorklet), where a consumer may like to use Penpal.\n *\n * To accomplish these requirements, the handshake protocol is as follows:\n * 1. Each participant generates a random participant ID.\n * 2. As soon as possible, each participant sends a SYN message containing its\n * participant ID to the other participant.\n * 3. When the SYN messages were sent, one of the participants may not have\n * been ready to receive the SYN message from the other. At least one\n * of the participants was ready, however, and should have received a SYN\n * message from the other participant. Each participant that did receive\n * a SYN message knows for sure that the other participant is now ready\n * to receive a SYN message, so it will send another SYN message in case\n * the other participant did not receive the first SYN message. This\n * ultimately results in each participant sending two SYN messages.\n * 4. Each participant now should have received at least one SYN message from\n * the other participant. Each participant compares their own ID with the\n * other participant's ID. Whichever participant has the higher ID\n * (using a simple string comparison) is considered the handshake leader\n * and will send an ACK1 message to the other participant.\n * 5. At this point, the handshake leader does not know whether the other\n * participant is actually receiving messages. The participant receiving\n * the ACK1 message will respond with an ACK2, informing the handshake\n * leader that it is indeed receiving messages.\n * 6. At this point, both participants know the other is receiving messages\n * and the handshake is complete.\n */\nconst shakeHands = <TMethods extends Methods>({\n messenger,\n methods,\n timeout,\n channel,\n log,\n}: Options): Promise<HandshakeResult<TMethods>> => {\n const participantId = generateId();\n let remoteParticipantId: string;\n const destroyHandlers: (() => void)[] = [];\n let isComplete = false;\n\n const methodPaths = extractMethodPathsFromMethods(methods);\n\n const { promise, resolve, reject } = getPromiseWithResolvers<\n HandshakeResult<TMethods>,\n PenpalError\n >();\n\n const timeoutId =\n timeout !== undefined\n ? setTimeout(() => {\n reject(\n new PenpalError(\n 'CONNECTION_TIMEOUT',\n `Connection timed out after ${timeout}ms`\n )\n );\n }, timeout)\n : undefined;\n\n const destroy = () => {\n for (const destroyHandler of destroyHandlers) {\n destroyHandler();\n }\n };\n\n const connectCallHandlerAndMethodProxies = () => {\n if (isComplete) {\n // If we get here, it means the remote is attempting to re-connect. While\n // that's supported, we don't need to run the rest of this function again.\n return;\n }\n\n destroyHandlers.push(connectCallHandler(messenger, methods, channel, log));\n\n const { remoteProxy, destroy: destroyMethodProxies } = connectRemoteProxy<\n TMethods\n >(messenger, channel, log);\n\n destroyHandlers.push(destroyMethodProxies);\n\n clearTimeout(timeoutId);\n isComplete = true;\n\n resolve({\n remoteProxy,\n destroy: destroy,\n });\n };\n\n const sendSynMessage = () => {\n const synMessage: SynMessage = {\n namespace,\n type: 'SYN',\n channel,\n participantId: participantId,\n };\n log?.(`Sending handshake SYN`, synMessage);\n\n try {\n messenger.sendMessage(synMessage);\n } catch (error) {\n reject(new PenpalError('TRANSMISSION_FAILED', (error as Error).message));\n }\n };\n\n const handleSynMessage = (message: SynMessage) => {\n log?.(`Received handshake SYN`, message);\n\n if (\n message.participantId === remoteParticipantId &&\n // TODO: Used for backward-compatibility. Remove in next major version.\n remoteParticipantId !== DEPRECATED_PENPAL_PARTICIPANT_ID\n ) {\n return;\n }\n\n remoteParticipantId = message.participantId;\n\n // We send another SYN message in case the other participant was not ready\n // when we sent the first SYN message.\n sendSynMessage();\n\n const isHandshakeLeader =\n participantId > remoteParticipantId ||\n // TODO: Used for backward-compatibility. Remove in next major version.\n remoteParticipantId === DEPRECATED_PENPAL_PARTICIPANT_ID;\n\n if (!isHandshakeLeader) {\n return;\n }\n\n const ack1Message: Ack1Message = {\n namespace,\n channel,\n type: 'ACK1',\n methodPaths,\n };\n log?.(`Sending handshake ACK1`, ack1Message);\n\n try {\n messenger.sendMessage(ack1Message);\n } catch (error) {\n reject(new PenpalError('TRANSMISSION_FAILED', (error as Error).message));\n return;\n }\n };\n\n const handleAck1Message = (message: Ack1Message) => {\n log?.(`Received handshake ACK1`, message);\n const ack2Message: Ack2Message = {\n namespace,\n channel,\n type: 'ACK2',\n };\n log?.(`Sending handshake ACK2`, ack2Message);\n\n try {\n messenger.sendMessage(ack2Message);\n } catch (error) {\n reject(new PenpalError('TRANSMISSION_FAILED', (error as Error).message));\n return;\n }\n\n connectCallHandlerAndMethodProxies();\n };\n\n const handleAck2Message = (message: Ack2Message) => {\n log?.(`Received handshake ACK2`, message);\n connectCallHandlerAndMethodProxies();\n };\n\n const handleMessage = (message: Message) => {\n if (isSynMessage(message)) {\n handleSynMessage(message);\n }\n\n if (isAck1Message(message)) {\n handleAck1Message(message);\n }\n\n if (isAck2Message(message)) {\n handleAck2Message(message);\n }\n };\n\n messenger.addMessageHandler(handleMessage);\n destroyHandlers.push(() => messenger.removeMessageHandler(handleMessage));\n\n sendSynMessage();\n\n return promise;\n};\n\nexport default shakeHands;\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst once = <T extends (...args: any[]) => any>(\n fn: T\n): ((...args: Parameters<T>) => ReturnType<T>) => {\n let isCalled = false;\n let result: ReturnType<T>;\n\n return (...args: Parameters<T>): ReturnType<T> => {\n if (!isCalled) {\n isCalled = true;\n result = fn(...args);\n }\n return result;\n };\n};\n\nexport default once;\n","import { DestroyMessage, Connection, Log, Message, Methods } from './types.js';\nimport PenpalError from './PenpalError.js';\nimport Messenger from './messengers/Messenger.js';\nimport shakeHands from './shakeHands.js';\nimport { isDestroyMessage, isMessage } from './guards.js';\nimport once from './once.js';\nimport namespace from './namespace.js';\n\ntype Options = {\n /**\n * Messenger in charge of handling communication with the remote.\n */\n messenger: Messenger;\n /**\n * Methods that may be called by the remote.\n */\n methods?: Methods;\n /**\n * The amount of time, in milliseconds, Penpal should wait\n * for a connection to be established before rejecting the connection promise.\n */\n timeout?: number;\n /**\n * A string identifier that disambiguates communication when establishing\n * multiple, parallel connections between two participants (e.g., two windows,\n * a window and a worker).\n */\n channel?: string;\n /**\n * A function for logging debug messages. Debug messages will only be\n * logged when this is defined.\n */\n log?: Log;\n};\n\nconst usedMessengers = new WeakSet<Messenger>();\n\n/**\n * Attempts to establish communication with the remote.\n */\nconst connect = <TMethods extends Methods>({\n messenger,\n methods = {},\n timeout,\n channel,\n log,\n}: Options): Connection<TMethods> => {\n if (!messenger) {\n throw new PenpalError('INVALID_ARGUMENT', 'messenger must be defined');\n }\n\n if (usedMessengers.has(messenger)) {\n throw new PenpalError(\n 'INVALID_ARGUMENT',\n 'A messenger can only be used for a single connection'\n );\n }\n\n usedMessengers.add(messenger);\n\n const connectionDestroyedHandlers: (() => void)[] = [messenger.destroy];\n\n const destroyConnection = once((notifyOtherParticipant: boolean) => {\n if (notifyOtherParticipant) {\n const destroyMessage: DestroyMessage = {\n namespace,\n channel,\n type: 'DESTROY',\n };\n\n try {\n messenger.sendMessage(destroyMessage);\n } catch (_) {\n // We do our best to notify the other participant of the connection, but\n // if there's an error in doing so (e.g., maybe the handshake hasn't\n // completed and a messenger can't send the message), it's probably not\n // worth bothering the consumer with an error.\n }\n }\n\n for (const connectionDestroyedHandler of connectionDestroyedHandlers) {\n connectionDestroyedHandler();\n }\n\n log?.('Connection destroyed');\n });\n\n const validateReceivedMessage = (data: unknown): data is Message => {\n return isMessage(data) && data.channel === channel;\n };\n\n const promise = (async () => {\n try {\n messenger.initialize({ log, validateReceivedMessage });\n messenger.addMessageHandler((message) => {\n if (isDestroyMessage(message)) {\n destroyConnection(false);\n }\n });\n\n const { remoteProxy, destroy } = await shakeHands<TMethods>({\n messenger,\n methods,\n timeout,\n channel,\n log,\n });\n connectionDestroyedHandlers.push(destroy);\n return remoteProxy;\n } catch (error) {\n destroyConnection(true);\n throw error as PenpalError;\n }\n })();\n\n return {\n promise,\n // Why we don't reject the connection promise when consumer calls destroy():\n // https://github.com/Aaronius/penpal/issues/51\n destroy: () => {\n destroyConnection(true);\n },\n };\n};\n\nexport default connect;\n","import { Log, Message } from '../types.js';\nimport Messenger, {\n InitializeMessengerOptions,\n MessageHandler,\n} from './Messenger.js';\nimport {\n downgradeMessage,\n isDeprecatedMessage,\n upgradeMessage,\n} from '../backwardCompatibility.js';\nimport { isAck2Message, isAck1Message, isSynMessage } from '../guards.js';\nimport PenpalError from '../PenpalError.js';\n\ntype Options = {\n /**\n * The window with which the current window will communicate.\n */\n remoteWindow: Window;\n /**\n * An array of strings or regular expressions defining to which origins\n * communication will be allowed. If not provided, communication will be\n * restricted to the origin of the current page. You may specify an allowed\n * origin of `*` to not restrict communication, but beware the risks of\n * doing so.\n */\n allowedOrigins?: (string | RegExp)[];\n};\n\n/**\n * Handles the details of communicating with a child window.\n */\nclass WindowMessenger implements Messenger {\n readonly #remoteWindow: Window;\n readonly #allowedOrigins: [string | RegExp, ...(string | RegExp)[]];\n #log?: Log;\n #validateReceivedMessage?: (data: unknown) => data is Message;\n #concreteRemoteOrigin?: string;\n #messageCallbacks = new Set<(message: Message) => void>();\n #port?: MessagePort;\n // TODO: Used for backward-compatibility. Remove in next major version.\n #isChildUsingDeprecatedProtocol = false;\n\n constructor({ remoteWindow, allowedOrigins }: Options) {\n if (!remoteWindow) {\n throw new PenpalError('INVALID_ARGUMENT', 'remoteWindow must be defined');\n }\n\n this.#remoteWindow = remoteWindow;\n this.#allowedOrigins = allowedOrigins?.length\n ? (allowedOrigins as [string | RegExp, ...(string | RegExp)[]])\n : [window.origin];\n }\n\n initialize = ({\n log,\n validateReceivedMessage,\n }: InitializeMessengerOptions) => {\n this.#log = log;\n this.#validateReceivedMessage = validateReceivedMessage;\n window.addEventListener('message', this.#handleMessageFromRemoteWindow);\n };\n\n sendMessage = (message: Message, transferables?: Transferable[]): void => {\n if (isSynMessage(message)) {\n const originForSending = this.#getOriginForSendingMessage(message);\n this.#remoteWindow.postMessage(message, {\n targetOrigin: originForSending,\n transfer: transferables,\n });\n return;\n }\n\n if (\n isAck1Message(message) ||\n // If the child is using a previous version of Penpal, we need to\n // downgrade the message and send it through the window rather than\n // the port because older versions of Penpal don't use MessagePorts.\n this.#isChildUsingDeprecatedProtocol\n ) {\n const payload = this.#isChildUsingDeprecatedProtocol\n ? downgradeMessage(message)\n : message;\n const originForSending = this.#getOriginForSendingMessage(message);\n this.#remoteWindow.postMessage(payload, {\n targetOrigin: originForSending,\n transfer: transferables,\n });\n return;\n }\n\n if (isAck2Message(message)) {\n const { port1, port2 } = new MessageChannel();\n this.#port = port1;\n port1.addEventListener('message', this.#handleMessageFromPort);\n port1.start();\n const transferablesToSend = [port2, ...(transferables || [])];\n const originForSending = this.#getOriginForSendingMessage(message);\n this.#remoteWindow.postMessage(message, {\n targetOrigin: originForSending,\n transfer: transferablesToSend,\n });\n return;\n }\n\n if (this.#port) {\n this.#port.postMessage(message, {\n transfer: transferables,\n });\n return;\n }\n\n throw new PenpalError(\n 'TRANSMISSION_FAILED',\n 'Cannot send message because the MessagePort is not connected'\n );\n };\n\n addMessageHandler = (callback: MessageHandler): void => {\n this.#messageCallbacks.add(callback);\n };\n\n removeMessageHandler = (callback: MessageHandler): void => {\n this.#messageCallbacks.delete(callback);\n };\n\n destroy = () => {\n window.removeEventListener('message', this.#handleMessageFromRemoteWindow);\n this.#destroyPort();\n this.#messageCallbacks.clear();\n };\n\n #isAllowedOrigin = (origin: string) => {\n return this.#allowedOrigins.some((allowedOrigin) =>\n allowedOrigin instanceof RegExp\n ? allowedOrigin.test(origin)\n : allowedOrigin === origin || allowedOrigin === '*'\n );\n };\n\n #getOriginForSendingMessage = (message: Message) => {\n // It's safe to send the SYN message to any origin because it doesn't contain\n // anything sensitive. When Penpal receives a SYN message, the origin on\n // the message (which we call the concrete origin) is validated against the\n // configured allowed origins. All subsequent messages will be sent to the\n // concrete origin.\n // If you decide to change this, consider https://github.com/Aaronius/penpal/issues/103\n if (isSynMessage(message)) {\n return '*';\n }\n\n if (!this.#concreteRemoteOrigin) {\n throw new PenpalError(\n 'TRANSMISSION_FAILED',\n 'Cannot send message because the remote origin is not established'\n );\n }\n\n // If the concrete remote origin (the origin we received from the remote\n // on a prior message) is 'null', it means the remote is within\n // an \"opaque origin\". The only way to post a message to an\n // opaque origin is by using '*'. This does carry some security risk,\n // so we only do this if the consumer has specifically defined '*' as\n // an allowed origin. Opaque origins occur, for example, when\n // loading an HTML document directly from the filesystem (not a\n // web server) or through a data URI.\n return this.#concreteRemoteOrigin === 'null' &&\n this.#allowedOrigins.includes('*')\n ? '*'\n : this.#concreteRemoteOrigin;\n };\n\n #destroyPort = () => {\n this.#port?.removeEventListener('message', this.#handleMessageFromPort);\n this.#port?.close();\n this.#port = undefined;\n };\n\n #handleMessageFromRemoteWindow = ({\n source,\n origin,\n ports,\n data,\n }: MessageEvent): void => {\n if (source !== this.#remoteWindow) {\n return;\n }\n\n // TODO: Used for backward-compatibility. Remove in next major version.\n if (isDeprecatedMessage(data)) {\n this.#log?.(\n 'Please upgrade the child window to the latest version of Penpal.'\n );\n this.#isChildUsingDeprecatedProtocol = true;\n try {\n data = upgradeMessage(data);\n } catch (error) {\n this.#log?.(\n `Failed to translate deprecated message: ${(error as Error).message}`\n );\n return;\n }\n }\n\n if (!this.#validateReceivedMessage?.(data)) {\n return;\n }\n\n if (!this.#isAllowedOrigin(origin)) {\n this.#log?.(\n `Received a message from origin \\`${origin}\\` which did not match ` +\n `allowed origins \\`[${this.#allowedOrigins.join(', ')}]\\``\n );\n return;\n }\n\n if (isSynMessage(data)) {\n // If we receive a SYN message and already have a port, it means\n // the child is re-connecting, in which case we'll receive a new port.\n // For this reason, we always make sure we destroy the existing port.\n this.#destroyPort();\n this.#concreteRemoteOrigin = origin;\n }\n\n if (\n isAck2Message(data) &&\n // Previous versions of Penpal don't use MessagePorts and do all\n // communication through the window.\n !this.#isChildUsingDeprecatedProtocol\n ) {\n this.#port = ports[0];\n\n if (!this.#port) {\n this.#log?.('Ignoring ACK2 because it did not include a MessagePort');\n return;\n }\n\n this.#port.addEventListener('message', this.#handleMessageFromPort);\n this.#port.start();\n }\n\n for (const callback of this.#messageCallbacks) {\n callback(data);\n }\n };\n\n #handleMessageFromPort = ({ data }: MessageEvent): void => {\n // Unlike in _handleMessageFromWindow, we don't need to check if\n // the message is from a deprecated version of Penpal because older versions\n // of Penpal don't use MessagePorts.\n if (!this.#validateReceivedMessage?.(data)) {\n return;\n }\n\n for (const callback of this.#messageCallbacks) {\n callback(data);\n }\n };\n}\n\nexport default WindowMessenger;\n","import { Log, Message } from '../types.js';\nimport Messenger, {\n InitializeMessengerOptions,\n MessageHandler,\n} from './Messenger.js';\nimport { isAck2Message, isAck1Message, isSynMessage } from '../guards.js';\nimport PenpalError from '../PenpalError.js';\n\n// This is needed to resolve some conflict errors. There may be a better way.\ntype MessageTarget = Pick<\n Worker,\n 'postMessage' | 'addEventListener' | 'removeEventListener'\n>;\n\ntype Options = {\n /**\n * The web worker receiving/sending communication from/to the parent window.\n * If this messenger is being used within the worker, `worker` should\n * typically be set to `self`.\n */\n worker: Worker | DedicatedWorkerGlobalScope;\n};\n\n/**\n * Handles the details of communicating with a child web worker.\n */\nclass WorkerMessenger implements Messenger {\n #worker: MessageTarget;\n #log?: Log;\n #validateReceivedMessage?: (data: unknown) => data is Message;\n #messageCallbacks = new Set<MessageHandler>();\n #port?: MessagePort;\n\n constructor({ worker }: Options) {\n if (!worker) {\n throw new PenpalError('INVALID_ARGUMENT', 'worker must be defined');\n }\n\n this.#worker = worker;\n }\n\n initialize = ({\n log,\n validateReceivedMessage,\n }: InitializeMessengerOptions) => {\n this.#log = log;\n this.#validateReceivedMessage = validateReceivedMessage;\n this.#worker.addEventListener('message', this.#handleMessage);\n };\n\n sendMessage = (message: Message, transferables?: Transferable[]): void => {\n if (isSynMessage(message) || isAck1Message(message)) {\n this.#worker.postMessage(message, { transfer: transferables });\n return;\n }\n\n if (isAck2Message(message)) {\n const { port1, port2 } = new MessageChannel();\n this.#port = port1;\n port1.addEventListener('message', this.#handleMessage);\n port1.start();\n\n this.#worker.postMessage(message, {\n transfer: [port2, ...(transferables || [])],\n });\n return;\n }\n\n if (this.#port) {\n this.#port.postMessage(message, {\n transfer: transferables,\n });\n return;\n }\n\n throw new PenpalError(\n 'TRANSMISSION_FAILED',\n 'Cannot send message because the MessagePort is not connected'\n );\n };\n\n addMessageHandler = (callback: MessageHandler): void => {\n this.#messageCallbacks.add(callback);\n };\n\n removeMessageHandler = (callback: MessageHandler): void => {\n this.#messageCallbacks.delete(callback);\n };\n\n destroy = () => {\n this.#worker.removeEventListener('message', this.#handleMessage);\n this.#destroyPort();\n this.#messageCallbacks.clear();\n };\n\n #destroyPort = () => {\n this.#port?.removeEventListener('message', this.#handleMessage);\n this.#port?.close();\n this.#port = undefined;\n };\n\n #handleMessage = ({ ports, data }: MessageEvent): void => {\n if (!this.#validateReceivedMessage?.(data)) {\n return;\n }\n\n if (isSynMessage(data)) {\n // If we receive a SYN message and already have a port, it means\n // the child is re-connecting, in which case we'll receive a new port.\n // For this reason, we always make sure we destroy the existing port.\n this.#destroyPort();\n }\n\n if (isAck2Message(data)) {\n this.#port = ports[0];\n\n if (!this.#port) {\n this.#log?.('Ignoring ACK2 because it did not include a MessagePort');\n return;\n }\n\n this.#port.addEventListener('message', this.#handleMessage);\n this.#port.start();\n }\n\n for (const callback of this.#messageCallbacks) {\n callback(data);\n }\n };\n}\n\nexport default WorkerMessenger;\n","import { Message } from '../types.js';\nimport Messenger, {\n InitializeMessengerOptions,\n MessageHandler,\n} from './Messenger.js';\nimport PenpalError from '../PenpalError.js';\n\ntype Options = {\n /**\n * The port used to communicate to the other port of the port pair.\n */\n port: MessagePort;\n};\n\n/**\n * Handles the details of communicating on a MessagePort.\n */\nclass PortMessenger implements Messenger {\n #port: MessagePort;\n #validateReceivedMessage?: (data: unknown) => data is Message;\n #messageCallbacks = new Set<MessageHandler>();\n\n constructor({ port }: Options) {\n if (!port) {\n throw new PenpalError('INVALID_ARGUMENT', 'port must be defined');\n }\n\n this.#port = port;\n }\n\n initialize = ({ validateReceivedMessage }: InitializeMessengerOptions) => {\n this.#validateReceivedMessage = validateReceivedMessage;\n this.#port.addEventListener('message', this.#handleMessage);\n this.#port.start();\n };\n\n sendMessage = (message: Message, transferables?: Transferable[]): void => {\n this.#port?.postMessage(message, {\n transfer: transferables,\n });\n };\n\n addMessageHandler = (callback: MessageHandler): void => {\n this.#messageCallbacks.add(callback);\n };\n\n removeMessageHandler = (callback: MessageHandler): void => {\n this.#messageCallbacks.delete(callback);\n };\n\n destroy = () => {\n this.#port.removeEventListener('message', this.#handleMessage);\n this.#port.close();\n this.#messageCallbacks.clear();\n };\n\n #handleMessage = ({ data }: MessageEvent): void => {\n if (!this.#validateReceivedMessage?.(data)) {\n return;\n }\n\n for (const callback of this.#messageCallbacks) {\n callback(data);\n }\n };\n}\n\nexport default PortMessenger;\n","// Not intended to be used internally. Can be useful externally\n// in projects not using TypeScript. It has the `Obj` suffix to disambiguate\n// it from the ErrorCode string union.\nconst ErrorCodeObj = {\n ConnectionDestroyed: 'CONNECTION_DESTROYED',\n ConnectionTimeout: 'CONNECTION_TIMEOUT',\n InvalidArgument: 'INVALID_ARGUMENT',\n MethodCallTimeout: 'METHOD_CALL_TIMEOUT',\n MethodNotFound: 'METHOD_NOT_FOUND',\n TransmissionFailed: 'TRANSMISSION_FAILED',\n} as const;\n\nexport default ErrorCodeObj;\n","import { Log } from './types.js';\n\nconst debug = (prefix?: string): Log => {\n return (...args: unknown[]) => {\n console.log(`✍️ %c${prefix}%c`, 'font-weight: bold;', '', ...args);\n };\n};\n\nexport default debug;\n"]}
|
package/dist/penpal.d.cts
CHANGED
|
@@ -198,7 +198,7 @@ type Options$1 = {
|
|
|
198
198
|
declare class WorkerMessenger implements Messenger {
|
|
199
199
|
#private;
|
|
200
200
|
constructor({ worker }: Options$1);
|
|
201
|
-
initialize: ({ validateReceivedMessage }: InitializeMessengerOptions) => void;
|
|
201
|
+
initialize: ({ log, validateReceivedMessage, }: InitializeMessengerOptions) => void;
|
|
202
202
|
sendMessage: (message: Message, transferables?: Transferable[]) => void;
|
|
203
203
|
addMessageHandler: (callback: MessageHandler) => void;
|
|
204
204
|
removeMessageHandler: (callback: MessageHandler) => void;
|
package/dist/penpal.d.ts
CHANGED
|
@@ -198,7 +198,7 @@ type Options$1 = {
|
|
|
198
198
|
declare class WorkerMessenger implements Messenger {
|
|
199
199
|
#private;
|
|
200
200
|
constructor({ worker }: Options$1);
|
|
201
|
-
initialize: ({ validateReceivedMessage }: InitializeMessengerOptions) => void;
|
|
201
|
+
initialize: ({ log, validateReceivedMessage, }: InitializeMessengerOptions) => void;
|
|
202
202
|
sendMessage: (message: Message, transferables?: Transferable[]) => void;
|
|
203
203
|
addMessageHandler: (callback: MessageHandler) => void;
|
|
204
204
|
removeMessageHandler: (callback: MessageHandler) => void;
|