@gd-kirie/ipc 0.6.1 → 0.6.3
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/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"mappings":";KAKY,eAAA;AAAA,KACA,oBAAA;AAAA,UAEK,aAAA;EACf,EAAA,EAAI,eAAA;EACJ,OAAA,EAAS,oBAAA;AAAA;AAAA,UAGM,YAAA;EACf,QAAA,EAAU,aAAA;AAAA;AAAA,UAGF,mBAAA;EACR,WAAA,CAAY,OAAA,EAAS,WAAA;EACrB,SAAA,IAAa,KAAA,EAAO,YAAA;AAAA;AAAA,UAGZ,sBAAA;EACR,WAAA,CAAY,OAAA;AAAA;AAAA,UAUJ,cAAA;EACR,eAAA;IACE,KAAA,GAAQ,sBAAA;EAAA;AAAA;AAAA;YAKA,MAAA;IACR,KAAA,GAAQ,YAAA;IACR,gBAAA,GAAmB,mBAAA;IACnB,kBAAA,GAAqB,mBAAA;IACrB,gBAAA,GAAmB,mBAAA;IACnB,MAAA,GAAS,cAAA;IACT,cAAA,CAAe,OAAA;IACf,oBAAA,CAAqB,OAAA,EAAS,WAAA;IAC9B,WAAA,CAAY,OAAA,EAAS,SAAA;IACrB,YAAA,GAAe,mBAAA;IACf,kBAAA,GAAqB,mBAAA,CAAoB,WAAA;IACzC,gBAAA,GAAmB,mBAAA,CAAoB,SAAA;EAAA;AAAA;;AAhCrB;AAAA;;KAwCV,SAAA,
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"mappings":";KAKY,eAAA;AAAA,KACA,oBAAA;AAAA,UAEK,aAAA;EACf,EAAA,EAAI,eAAA;EACJ,OAAA,EAAS,oBAAA;AAAA;AAAA,UAGM,YAAA;EACf,QAAA,EAAU,aAAA;AAAA;AAAA,UAGF,mBAAA;EACR,WAAA,CAAY,OAAA,EAAS,WAAA;EACrB,SAAA,IAAa,KAAA,EAAO,YAAA;AAAA;AAAA,UAGZ,sBAAA;EACR,WAAA,CAAY,OAAA;AAAA;AAAA,UAUJ,cAAA;EACR,eAAA;IACE,KAAA,GAAQ,sBAAA;EAAA;AAAA;AAAA;YAKA,MAAA;IACR,KAAA,GAAQ,YAAA;IACR,gBAAA,GAAmB,mBAAA;IACnB,kBAAA,GAAqB,mBAAA;IACrB,gBAAA,GAAmB,mBAAA;IACnB,MAAA,GAAS,cAAA;IACT,cAAA,CAAe,OAAA;IACf,oBAAA,CAAqB,OAAA,EAAS,WAAA;IAC9B,WAAA,CAAY,OAAA,EAAS,SAAA;IACrB,YAAA,GAAe,mBAAA;IACf,kBAAA,GAAqB,mBAAA,CAAoB,WAAA;IACzC,gBAAA,GAAmB,mBAAA,CAAoB,SAAA;EAAA;AAAA;;AAhCrB;AAAA;;KAwCV,SAAA,sCAKV,SAAA;EAAA,eACiB,SAAA;AAAA;AAAA,KAEP,mBAAA,cAAiC,OAAA,EAAS,QAAA;AAAA,iBAqRtC,QAAA,CAAS,OAAA;AAAA,iBAIT,UAAA,CAAW,KAAO,EAAA,UAAA;AAAA,iBAIlB,QAAA,CAAS,KAAO,EAAA,SAAA;AAAA,iBAIhB,cAAA,CAAe,OAAS,EAAA,mBAAA;AAAA,iBAIxB,gBAAA,CAAiB,OAAA,EAAS,mBAAA,CAAoB,UAAA;AAAA,iBAI9C,cAAA,CAAe,OAAA,EAAS,mBAAA,CAAoB,SAAA"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { decode, encode } from \"cborg\";\n\nconst READY_MESSAGE = new ArrayBuffer(0);\nconst ENCODE_OPTIONS = { float64: true } as const;\n\nexport type KiriePlatformOs = \"android\" | \"ios\" | \"macos\" | \"windows\" | \"linux\";\nexport type KiriePlatformBackend = \"webview\" | \"wkwebview\" | \"godot-cef\";\n\nexport interface KiriePlatform {\n os: KiriePlatformOs;\n backend: KiriePlatformBackend;\n}\n\nexport interface KirieRuntime {\n platform: KiriePlatform;\n}\n\ninterface KirieAndroidChannel {\n postMessage(message: ArrayBuffer): void;\n onmessage: ((event: MessageEvent) => void) | null;\n}\n\ninterface KirieIosMessageHandler {\n postMessage(message: string): void;\n}\n\ntype KirieLane = \"text\" | \"binary\" | \"data\";\n\ninterface KirieIosPacketMessage {\n lane: KirieLane;\n packet: string;\n}\n\ninterface KirieIosWebkit {\n messageHandlers?: {\n kirie?: KirieIosMessageHandler;\n };\n}\n\ndeclare global {\n interface Window {\n kirie?: KirieRuntime;\n KirieTextChannel?: KirieAndroidChannel;\n KirieBinaryChannel?: KirieAndroidChannel;\n KirieDataChannel?: KirieAndroidChannel;\n webkit?: KirieIosWebkit;\n sendIpcMessage(message: string): void;\n sendIpcBinaryMessage(message: ArrayBuffer): void;\n sendIpcData(message: KirieData): void;\n onIpcMessage?: KirieMessageHandler<string>;\n onIpcBinaryMessage?: KirieMessageHandler<ArrayBuffer>;\n onIpcDataMessage?: KirieMessageHandler<KirieData>;\n }\n}\n\n/**\n * Structured data lane subset shared with Godot Variant data.\n * It intentionally excludes engine-local and JavaScript-local object types.\n */\nexport type KirieData =\n | null\n | boolean\n | number\n | string\n | KirieData[]\n | { [key: string]: KirieData };\n\nexport type KirieMessageHandler<TMessage> = (message: TMessage) => void;\n\ninterface KirieTransport {\n sendText(message: string): void;\n sendBinary(bytes: Uint8Array): void;\n sendData(value: KirieData): void;\n onTextReceived(handler: KirieMessageHandler<string>): () => void;\n onBinaryReceived(handler: KirieMessageHandler<Uint8Array>): () => void;\n onDataReceived(handler: KirieMessageHandler<KirieData>): () => void;\n}\n\nfunction asArrayBuffer(bytes: Uint8Array): ArrayBuffer {\n if (\n bytes.buffer instanceof ArrayBuffer &&\n bytes.byteOffset === 0 &&\n bytes.byteLength === bytes.buffer.byteLength\n ) {\n return bytes.buffer;\n }\n\n const copy = new Uint8Array(bytes.byteLength);\n copy.set(bytes);\n return copy.buffer as ArrayBuffer;\n}\n\nfunction asUint8Array(value: unknown): Uint8Array {\n if (value instanceof ArrayBuffer) {\n return new Uint8Array(value);\n }\n\n throw new TypeError(\"Kirie message must be an ArrayBuffer.\");\n}\n\nfunction decodeText(value: unknown): string {\n const decoded = decode(asUint8Array(value));\n if (typeof decoded !== \"string\") {\n throw new TypeError(\"Kirie text message must decode to a string.\");\n }\n\n return decoded;\n}\n\nfunction decodeBinary(value: unknown): Uint8Array {\n const decoded = decode(asUint8Array(value));\n if (decoded instanceof Uint8Array) {\n return decoded;\n }\n\n throw new TypeError(\"Kirie binary message must decode to bytes.\");\n}\n\nfunction currentTransport(): KirieTransport {\n const platform = window.kirie?.platform;\n return transports[`${platform?.os}/${platform?.backend}`];\n}\n\nfunction listenAndroid<TMessage>(\n channel: KirieAndroidChannel,\n read: (value: unknown) => TMessage,\n handler: KirieMessageHandler<TMessage>,\n): () => void {\n const listener = (event: MessageEvent) => {\n handler(read(event.data));\n };\n\n channel.onmessage = listener;\n channel.postMessage(READY_MESSAGE);\n\n return () => {\n if (channel.onmessage === listener) {\n channel.onmessage = null;\n }\n };\n}\n\nfunction requireAndroidChannel(\n name: \"KirieTextChannel\" | \"KirieBinaryChannel\" | \"KirieDataChannel\",\n): KirieAndroidChannel {\n const channel = window[name];\n if (!channel) {\n throw new Error(`Kirie Android channel is not available: ${name}`);\n }\n\n return channel;\n}\n\nconst androidTransport: KirieTransport = {\n sendText(message) {\n requireAndroidChannel(\"KirieTextChannel\").postMessage(\n asArrayBuffer(encode(message, ENCODE_OPTIONS)),\n );\n },\n\n sendBinary(bytes) {\n requireAndroidChannel(\"KirieBinaryChannel\").postMessage(\n asArrayBuffer(encode(bytes, ENCODE_OPTIONS)),\n );\n },\n\n sendData(value) {\n requireAndroidChannel(\"KirieDataChannel\").postMessage(\n asArrayBuffer(encode(value, ENCODE_OPTIONS)),\n );\n },\n\n onTextReceived(handler) {\n return listenAndroid(requireAndroidChannel(\"KirieTextChannel\"), decodeText, handler);\n },\n\n onBinaryReceived(handler) {\n return listenAndroid(requireAndroidChannel(\"KirieBinaryChannel\"), decodeBinary, handler);\n },\n\n onDataReceived(handler) {\n return listenAndroid(\n requireAndroidChannel(\"KirieDataChannel\"),\n (value) => decode(asUint8Array(value)) as KirieData,\n handler,\n );\n },\n};\n\nfunction requireIosMessageHandler(): KirieIosMessageHandler {\n const handler = window.webkit?.messageHandlers?.kirie;\n if (!handler) {\n throw new Error(\n \"Kirie iOS message handler is not available: window.webkit.messageHandlers.kirie\",\n );\n }\n\n return handler;\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = \"\";\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n\n return btoa(binary);\n}\n\nfunction base64ToArrayBuffer(encoded: string): ArrayBuffer {\n const binary = atob(encoded);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) {\n bytes[index] = binary.charCodeAt(index);\n }\n\n return bytes.buffer as ArrayBuffer;\n}\n\nfunction postIosPacket(lane: KirieLane, packet: Uint8Array): void {\n requireIosMessageHandler().postMessage(\n JSON.stringify({\n lane,\n packet: bytesToBase64(packet),\n } satisfies KirieIosPacketMessage),\n );\n}\n\nfunction listenIos<TMessage>(\n lane: KirieLane,\n read: (value: unknown) => TMessage,\n handler: KirieMessageHandler<TMessage>,\n): () => void {\n const listener = (event: Event) => {\n if (!(event instanceof CustomEvent) || !isIosPacketMessage(event.detail)) {\n return;\n }\n\n if (event.detail.lane !== lane) {\n return;\n }\n\n handler(read(base64ToArrayBuffer(event.detail.packet)));\n };\n\n window.addEventListener(\"kirie:ipc-packet\", listener);\n return () => window.removeEventListener(\"kirie:ipc-packet\", listener);\n}\n\nfunction isIosPacketMessage(value: unknown): value is KirieIosPacketMessage {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n const message = value as Partial<KirieIosPacketMessage>;\n return (\n (message.lane === \"text\" || message.lane === \"binary\" || message.lane === \"data\") &&\n typeof message.packet === \"string\"\n );\n}\n\nconst iosTransport: KirieTransport = {\n sendText(message) {\n postIosPacket(\"text\", encode(message, ENCODE_OPTIONS));\n },\n\n sendBinary(bytes) {\n postIosPacket(\"binary\", encode(bytes, ENCODE_OPTIONS));\n },\n\n sendData(value) {\n postIosPacket(\"data\", encode(value, ENCODE_OPTIONS));\n },\n\n onTextReceived(handler) {\n return listenIos(\"text\", decodeText, handler);\n },\n\n onBinaryReceived(handler) {\n return listenIos(\"binary\", decodeBinary, handler);\n },\n\n onDataReceived(handler) {\n return listenIos(\"data\", (value) => decode(asUint8Array(value)) as KirieData, handler);\n },\n};\n\ntype KirieCefCallbackName = \"onIpcMessage\" | \"onIpcBinaryMessage\" | \"onIpcDataMessage\";\n\ninterface KirieCefCallbacks {\n onIpcMessage?: KirieMessageHandler<string>;\n onIpcBinaryMessage?: KirieMessageHandler<ArrayBuffer>;\n onIpcDataMessage?: KirieMessageHandler<KirieData>;\n}\n\nfunction listenCefLegacy<TName extends KirieCefCallbackName>(\n name: TName,\n handler: KirieCefCallbacks[TName],\n): () => void {\n const callbacks = window as unknown as KirieCefCallbacks;\n callbacks[name] = handler;\n\n return () => {\n if (callbacks[name] === handler) {\n callbacks[name] = undefined;\n }\n };\n}\n\nconst cefTransport: KirieTransport = {\n sendText(message) {\n window.sendIpcMessage(message);\n },\n\n sendBinary(bytes) {\n window.sendIpcBinaryMessage(asArrayBuffer(bytes));\n },\n\n sendData(value) {\n window.sendIpcData(value);\n },\n\n onTextReceived(handler) {\n // TODO: Switch to Godot CEF listener objects after the upstream addListener lifecycle fix ships.\n return listenCefLegacy(\"onIpcMessage\", handler);\n },\n\n onBinaryReceived(handler) {\n return listenCefLegacy(\"onIpcBinaryMessage\", (value) => handler(new Uint8Array(value)));\n },\n\n onDataReceived(handler) {\n return listenCefLegacy(\"onIpcDataMessage\", handler);\n },\n};\n\nconst transports: Record<string, KirieTransport> = {\n \"android/webview\": androidTransport,\n \"ios/wkwebview\": iosTransport,\n \"linux/godot-cef\": cefTransport,\n \"macos/godot-cef\": cefTransport,\n \"windows/godot-cef\": cefTransport,\n};\n\nexport function sendText(message: string): void {\n currentTransport().sendText(message);\n}\n\nexport function sendBinary(bytes: Uint8Array): void {\n currentTransport().sendBinary(bytes);\n}\n\nexport function sendData(value: KirieData): void {\n currentTransport().sendData(value);\n}\n\nexport function onTextReceived(handler: KirieMessageHandler<string>): () => void {\n return currentTransport().onTextReceived(handler);\n}\n\nexport function onBinaryReceived(handler: KirieMessageHandler<Uint8Array>): () => void {\n return currentTransport().onBinaryReceived(handler);\n}\n\nexport function onDataReceived(handler: KirieMessageHandler<KirieData>): () => void {\n return currentTransport().onDataReceived(handler);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { decode, encode } from \"cborg\";\n\nconst READY_MESSAGE = new ArrayBuffer(0);\nconst ENCODE_OPTIONS = { float64: true } as const;\n\nexport type KiriePlatformOs = \"android\" | \"ios\" | \"macos\" | \"windows\" | \"linux\";\nexport type KiriePlatformBackend = \"webview\" | \"wkwebview\" | \"godot-cef\";\n\nexport interface KiriePlatform {\n os: KiriePlatformOs;\n backend: KiriePlatformBackend;\n}\n\nexport interface KirieRuntime {\n platform: KiriePlatform;\n}\n\ninterface KirieAndroidChannel {\n postMessage(message: ArrayBuffer): void;\n onmessage: ((event: MessageEvent) => void) | null;\n}\n\ninterface KirieIosMessageHandler {\n postMessage(message: string): void;\n}\n\ntype KirieLane = \"text\" | \"binary\" | \"data\";\n\ninterface KirieIosPacketMessage {\n lane: KirieLane;\n packet: string;\n}\n\ninterface KirieIosWebkit {\n messageHandlers?: {\n kirie?: KirieIosMessageHandler;\n };\n}\n\ndeclare global {\n interface Window {\n kirie?: KirieRuntime;\n KirieTextChannel?: KirieAndroidChannel;\n KirieBinaryChannel?: KirieAndroidChannel;\n KirieDataChannel?: KirieAndroidChannel;\n webkit?: KirieIosWebkit;\n sendIpcMessage(message: string): void;\n sendIpcBinaryMessage(message: ArrayBuffer): void;\n sendIpcData(message: KirieData): void;\n onIpcMessage?: KirieMessageHandler<string>;\n onIpcBinaryMessage?: KirieMessageHandler<ArrayBuffer>;\n onIpcDataMessage?: KirieMessageHandler<KirieData>;\n }\n}\n\n/**\n * Structured data lane subset shared with Godot Variant data.\n * It intentionally excludes engine-local and JavaScript-local object types.\n */\nexport type KirieData =\n | null |\n boolean |\n number |\n string |\n KirieData[] |\n { [key: string]: KirieData };\n\nexport type KirieMessageHandler<TMessage> = (message: TMessage) => void;\n\ninterface KirieTransport {\n sendText(message: string): void;\n sendBinary(bytes: Uint8Array): void;\n sendData(value: KirieData): void;\n onTextReceived(handler: KirieMessageHandler<string>): () => void;\n onBinaryReceived(handler: KirieMessageHandler<Uint8Array>): () => void;\n onDataReceived(handler: KirieMessageHandler<KirieData>): () => void;\n}\n\nfunction asArrayBuffer(bytes: Uint8Array): ArrayBuffer {\n if (\n bytes.buffer instanceof ArrayBuffer &&\n bytes.byteOffset === 0 &&\n bytes.byteLength === bytes.buffer.byteLength\n ) {\n return bytes.buffer;\n }\n\n const copy = new Uint8Array(bytes.byteLength);\n copy.set(bytes);\n return copy.buffer as ArrayBuffer;\n}\n\nfunction asUint8Array(value: unknown): Uint8Array {\n if (value instanceof ArrayBuffer) {\n return new Uint8Array(value);\n }\n\n throw new TypeError(\"Kirie message must be an ArrayBuffer.\");\n}\n\nfunction decodeText(value: unknown): string {\n const decoded = decode(asUint8Array(value));\n if (typeof decoded !== \"string\") {\n throw new TypeError(\"Kirie text message must decode to a string.\");\n }\n\n return decoded;\n}\n\nfunction decodeBinary(value: unknown): Uint8Array {\n const decoded = decode(asUint8Array(value));\n if (decoded instanceof Uint8Array) {\n return decoded;\n }\n\n throw new TypeError(\"Kirie binary message must decode to bytes.\");\n}\n\nfunction currentTransport(): KirieTransport {\n const platform = window.kirie?.platform;\n return transports[`${platform?.os}/${platform?.backend}`];\n}\n\nfunction listenAndroid<TMessage>(\n channel: KirieAndroidChannel,\n read: (value: unknown) => TMessage,\n handler: KirieMessageHandler<TMessage>,\n): () => void {\n const listener = (event: MessageEvent): void => {\n handler(read(event.data));\n };\n\n channel.onmessage = listener;\n channel.postMessage(READY_MESSAGE);\n\n return () => {\n if (channel.onmessage === listener) {\n channel.onmessage = null;\n }\n };\n}\n\nfunction requireAndroidChannel(\n name: \"KirieTextChannel\" | \"KirieBinaryChannel\" | \"KirieDataChannel\",\n): KirieAndroidChannel {\n const channel = window[name];\n if (!channel) {\n throw new Error(`Kirie Android channel is not available: ${name}`);\n }\n\n return channel;\n}\n\nconst androidTransport: KirieTransport = {\n sendText(message) {\n requireAndroidChannel(\"KirieTextChannel\").postMessage(\n asArrayBuffer(encode(message, ENCODE_OPTIONS)),\n );\n },\n\n sendBinary(bytes) {\n requireAndroidChannel(\"KirieBinaryChannel\").postMessage(\n asArrayBuffer(encode(bytes, ENCODE_OPTIONS)),\n );\n },\n\n sendData(value) {\n requireAndroidChannel(\"KirieDataChannel\").postMessage(\n asArrayBuffer(encode(value, ENCODE_OPTIONS)),\n );\n },\n\n onTextReceived(handler) {\n return listenAndroid(requireAndroidChannel(\"KirieTextChannel\"), decodeText, handler);\n },\n\n onBinaryReceived(handler) {\n return listenAndroid(requireAndroidChannel(\"KirieBinaryChannel\"), decodeBinary, handler);\n },\n\n onDataReceived(handler) {\n return listenAndroid(\n requireAndroidChannel(\"KirieDataChannel\"),\n (value) => decode(asUint8Array(value)) as KirieData,\n handler,\n );\n },\n};\n\nfunction requireIosMessageHandler(): KirieIosMessageHandler {\n const handler = window.webkit?.messageHandlers?.kirie;\n if (!handler) {\n throw new Error(\n \"Kirie iOS message handler is not available: window.webkit.messageHandlers.kirie\",\n );\n }\n\n return handler;\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = \"\";\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n\n return btoa(binary);\n}\n\nfunction base64ToArrayBuffer(encoded: string): ArrayBuffer {\n const binary = atob(encoded);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) {\n bytes[index] = binary.charCodeAt(index);\n }\n\n return bytes.buffer as ArrayBuffer;\n}\n\nfunction postIosPacket(lane: KirieLane, packet: Uint8Array): void {\n requireIosMessageHandler().postMessage(\n JSON.stringify({\n lane,\n packet: bytesToBase64(packet),\n } satisfies KirieIosPacketMessage),\n );\n}\n\nfunction listenIos<TMessage>(\n lane: KirieLane,\n read: (value: unknown) => TMessage,\n handler: KirieMessageHandler<TMessage>,\n): () => void {\n const listener = (event: Event): void => {\n if (!(event instanceof CustomEvent) || !isIosPacketMessage(event.detail)) {\n return;\n }\n\n if (event.detail.lane !== lane) {\n return;\n }\n\n handler(read(base64ToArrayBuffer(event.detail.packet)));\n };\n\n window.addEventListener(\"kirie:ipc-packet\", listener);\n return () => window.removeEventListener(\"kirie:ipc-packet\", listener);\n}\n\nfunction isIosPacketMessage(value: unknown): value is KirieIosPacketMessage {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n const message = value as Partial<KirieIosPacketMessage>;\n return (\n (message.lane === \"text\" || message.lane === \"binary\" || message.lane === \"data\") &&\n typeof message.packet === \"string\"\n );\n}\n\nconst iosTransport: KirieTransport = {\n sendText(message) {\n postIosPacket(\"text\", encode(message, ENCODE_OPTIONS));\n },\n\n sendBinary(bytes) {\n postIosPacket(\"binary\", encode(bytes, ENCODE_OPTIONS));\n },\n\n sendData(value) {\n postIosPacket(\"data\", encode(value, ENCODE_OPTIONS));\n },\n\n onTextReceived(handler) {\n return listenIos(\"text\", decodeText, handler);\n },\n\n onBinaryReceived(handler) {\n return listenIos(\"binary\", decodeBinary, handler);\n },\n\n onDataReceived(handler) {\n return listenIos(\"data\", (value) => decode(asUint8Array(value)) as KirieData, handler);\n },\n};\n\ntype KirieCefCallbackName = \"onIpcMessage\" | \"onIpcBinaryMessage\" | \"onIpcDataMessage\";\n\ninterface KirieCefCallbacks {\n onIpcMessage?: KirieMessageHandler<string>;\n onIpcBinaryMessage?: KirieMessageHandler<ArrayBuffer>;\n onIpcDataMessage?: KirieMessageHandler<KirieData>;\n}\n\nfunction listenCefLegacy<TName extends KirieCefCallbackName>(\n name: TName,\n handler: KirieCefCallbacks[TName],\n): () => void {\n const callbacks = window as unknown as KirieCefCallbacks;\n callbacks[name] = handler;\n\n return () => {\n if (callbacks[name] === handler) {\n callbacks[name] = undefined;\n }\n };\n}\n\nconst cefTransport: KirieTransport = {\n sendText(message) {\n window.sendIpcMessage(message);\n },\n\n sendBinary(bytes) {\n window.sendIpcBinaryMessage(asArrayBuffer(bytes));\n },\n\n sendData(value) {\n window.sendIpcData(value);\n },\n\n onTextReceived(handler) {\n // TODO: Switch to Godot CEF listener objects after the upstream addListener lifecycle fix ships.\n return listenCefLegacy(\"onIpcMessage\", handler);\n },\n\n onBinaryReceived(handler) {\n return listenCefLegacy(\"onIpcBinaryMessage\", (value) => handler(new Uint8Array(value)));\n },\n\n onDataReceived(handler) {\n return listenCefLegacy(\"onIpcDataMessage\", handler);\n },\n};\n\nconst transports: Record<string, KirieTransport> = {\n \"android/webview\": androidTransport,\n \"ios/wkwebview\": iosTransport,\n \"linux/godot-cef\": cefTransport,\n \"macos/godot-cef\": cefTransport,\n \"windows/godot-cef\": cefTransport,\n};\n\nexport function sendText(message: string): void {\n currentTransport().sendText(message);\n}\n\nexport function sendBinary(bytes: Uint8Array): void {\n currentTransport().sendBinary(bytes);\n}\n\nexport function sendData(value: KirieData): void {\n currentTransport().sendData(value);\n}\n\nexport function onTextReceived(handler: KirieMessageHandler<string>): () => void {\n return currentTransport().onTextReceived(handler);\n}\n\nexport function onBinaryReceived(handler: KirieMessageHandler<Uint8Array>): () => void {\n return currentTransport().onBinaryReceived(handler);\n}\n\nexport function onDataReceived(handler: KirieMessageHandler<KirieData>): () => void {\n return currentTransport().onDataReceived(handler);\n}\n"],"mappings":"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"}
|