bunite-core 0.8.0 → 0.9.0

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.
Files changed (57) hide show
  1. package/package.json +9 -7
  2. package/src/{bun → host}/core/App.ts +45 -81
  3. package/src/{bun → host}/core/BrowserView.ts +64 -64
  4. package/src/{bun → host}/core/BrowserWindow.ts +14 -14
  5. package/src/host/core/Socket.ts +98 -0
  6. package/src/host/core/SurfaceBrowserIPC.ts +7 -0
  7. package/src/host/core/SurfaceManager.ts +154 -0
  8. package/src/host/encryptedPipe.ts +62 -0
  9. package/src/{bun → host}/events/appEvents.ts +0 -1
  10. package/src/host/index.ts +29 -0
  11. package/src/{bun/proc → host}/native.ts +38 -52
  12. package/src/{shared → host}/paths.ts +20 -26
  13. package/src/{bun/preload/inline.ts → host/preloadBundle.ts} +2 -2
  14. package/src/host/serveWeb.ts +81 -0
  15. package/src/native/linux/bunite_linux_runtime.cpp +2 -2
  16. package/src/native/mac/bunite_mac_ffi.mm +2 -2
  17. package/src/native/shared/ffi_exports.h +1 -1
  18. package/src/native/win/native_host_ffi.cpp +2 -2
  19. package/src/preload/runtime.built.js +1 -1
  20. package/src/preload/runtime.ts +54 -219
  21. package/src/preload/tsconfig.json +3 -10
  22. package/src/rpc/encrypt.ts +74 -0
  23. package/src/rpc/error.ts +58 -0
  24. package/src/rpc/framework.ts +132 -0
  25. package/src/rpc/hash.ts +142 -0
  26. package/src/rpc/index.ts +129 -0
  27. package/src/rpc/peer.ts +1055 -0
  28. package/src/rpc/renderer.ts +82 -0
  29. package/src/rpc/schema.ts +246 -0
  30. package/src/rpc/stream.ts +72 -0
  31. package/src/rpc/transport.ts +81 -0
  32. package/src/rpc/wire.ts +150 -0
  33. package/src/{preload/webviewElement.ts → webview/native.ts} +68 -48
  34. package/src/{shared/webviewPolyfill.ts → webview/polyfill.ts} +4 -7
  35. package/src/bun/core/Socket.ts +0 -187
  36. package/src/bun/core/SurfaceBrowserIPC.ts +0 -65
  37. package/src/bun/core/SurfaceManager.ts +0 -201
  38. package/src/bun/index.ts +0 -53
  39. package/src/bun/preload/index.ts +0 -73
  40. package/src/preload/tsconfig.tsbuildinfo +0 -1
  41. package/src/shared/rpc.ts +0 -424
  42. package/src/shared/rpcDemux.ts +0 -219
  43. package/src/shared/rpcWire.ts +0 -54
  44. package/src/shared/rpcWireConstants.ts +0 -3
  45. package/src/shared/webRpcHandler.ts +0 -77
  46. package/src/shared/webSocketTransport.ts +0 -26
  47. package/src/view/index.ts +0 -196
  48. /package/src/{shared → host}/cefVersion.ts +0 -0
  49. /package/src/{bun → host}/core/SurfaceRegistry.ts +0 -0
  50. /package/src/{bun → host}/core/singleInstanceLock.ts +0 -0
  51. /package/src/{bun → host}/core/windowIds.ts +0 -0
  52. /package/src/{bun → host}/events/event.ts +0 -0
  53. /package/src/{bun → host}/events/eventEmitter.ts +0 -0
  54. /package/src/{bun → host}/events/webviewEvents.ts +0 -0
  55. /package/src/{bun → host}/events/windowEvents.ts +0 -0
  56. /package/src/{shared → host}/log.ts +0 -0
  57. /package/src/{shared → host}/platform.ts +0 -0
package/src/bun/index.ts DELETED
@@ -1,53 +0,0 @@
1
- import { AppRuntime } from "./core/App";
2
- import { BrowserWindow, type WindowOptionsType } from "./core/BrowserWindow";
3
- import { BrowserView, type BrowserViewOptions } from "./core/BrowserView";
4
- import { buniteEventEmitter } from "./events/eventEmitter";
5
- import { BuniteEvent } from "./events/event";
6
- import { completePermissionRequest } from "./proc/native";
7
- import {
8
- createRpc,
9
- defineBunRpc,
10
- type BuniteRpcConfig,
11
- type BuniteRpcSchema,
12
- type RpcSchema,
13
- type RpcWithTransport
14
- } from "../shared/rpc";
15
- import { createRpcTransportDemuxer, type RpcChannelHandle, type RpcDemuxBufferPolicy, type RpcTransportDemuxer, type RpcTransportDemuxerOptions } from "../shared/rpcDemux";
16
- import { createWebSocketTransport, type WebSocketLike, type WebSocketTransportPipe } from "../shared/webSocketTransport";
17
- import { createWebRpcHandler, type WebRpcClient } from "../shared/webRpcHandler";
18
- import { acquireSingleInstanceLock, type SingleInstanceLock } from "./core/singleInstanceLock";
19
- import { log, type LogLevel } from "../shared/log";
20
-
21
- export {
22
- acquireSingleInstanceLock,
23
- AppRuntime,
24
- BrowserWindow,
25
- BrowserView,
26
- buniteEventEmitter,
27
- completePermissionRequest,
28
- createRpc,
29
- createRpcTransportDemuxer,
30
- createWebRpcHandler,
31
- createWebSocketTransport,
32
- defineBunRpc,
33
- log
34
- };
35
-
36
- export type {
37
- LogLevel,
38
- BuniteEvent,
39
- BuniteRpcConfig,
40
- BuniteRpcSchema,
41
- BrowserViewOptions,
42
- RpcChannelHandle,
43
- RpcDemuxBufferPolicy,
44
- RpcSchema,
45
- RpcWithTransport,
46
- RpcTransportDemuxer,
47
- RpcTransportDemuxerOptions,
48
- SingleInstanceLock,
49
- WebRpcClient,
50
- WebSocketLike,
51
- WebSocketTransportPipe,
52
- WindowOptionsType
53
- };
@@ -1,73 +0,0 @@
1
- import { RPC_FRAME_VERSION, RPC_IV_LENGTH } from "../../shared/rpcWireConstants";
2
-
3
- type BunitePreloadWindow = Window &
4
- typeof globalThis & {
5
- __bunite?: {
6
- receiveMessageFromBun?: (message: unknown) => void;
7
- };
8
- __buniteWebviewId?: number;
9
- __buniteRpcSocketPort?: number;
10
- __bunite_encrypt?: (data: Uint8Array) => Promise<Uint8Array>;
11
- __bunite_decrypt?: (data: Uint8Array) => Promise<Uint8Array>;
12
- };
13
-
14
- function base64ToUint8Array(base64: string) {
15
- return Uint8Array.from(atob(base64), (char) => char.charCodeAt(0));
16
- }
17
-
18
- function toArrayBuffer(bytes: Uint8Array): ArrayBuffer {
19
- const copy = new Uint8Array(bytes.byteLength);
20
- copy.set(bytes);
21
- return copy.buffer;
22
- }
23
-
24
- async function importAesKey(secretKeyBase64: string) {
25
- const keyData = base64ToUint8Array(secretKeyBase64);
26
- return crypto.subtle.importKey("raw", toArrayBuffer(keyData), "AES-GCM", false, ["encrypt", "decrypt"]);
27
- }
28
-
29
- export async function installBunitePreloadGlobals(options: {
30
- webviewId: number;
31
- rpcSocketPort: number;
32
- secretKeyBase64: string;
33
- }) {
34
- const buniteWindow = window as BunitePreloadWindow;
35
- const cryptoKey = await importAesKey(options.secretKeyBase64);
36
-
37
- const encrypt = async (data: Uint8Array) => {
38
- const iv = crypto.getRandomValues(new Uint8Array(RPC_IV_LENGTH));
39
- const encrypted = new Uint8Array(
40
- await crypto.subtle.encrypt({ name: "AES-GCM", iv }, cryptoKey, toArrayBuffer(data))
41
- );
42
- const frame = new Uint8Array(1 + iv.length + encrypted.length);
43
- frame[0] = RPC_FRAME_VERSION;
44
- frame.set(iv, 1);
45
- frame.set(encrypted, 1 + iv.length);
46
- return frame;
47
- };
48
-
49
- const decrypt = async (frame: Uint8Array) => {
50
- if (frame.length < 1 + RPC_IV_LENGTH + 16) {
51
- throw new Error("Invalid bunite RPC frame.");
52
- }
53
- if (frame[0] !== RPC_FRAME_VERSION) {
54
- throw new Error("Unsupported bunite RPC frame version.");
55
- }
56
- const iv = frame.slice(1, 1 + RPC_IV_LENGTH);
57
- const encrypted = frame.slice(1 + RPC_IV_LENGTH);
58
-
59
- const decrypted = await crypto.subtle.decrypt(
60
- { name: "AES-GCM", iv },
61
- cryptoKey,
62
- toArrayBuffer(encrypted)
63
- );
64
-
65
- return new Uint8Array(decrypted);
66
- };
67
-
68
- buniteWindow.__bunite ??= {};
69
- buniteWindow.__buniteWebviewId = options.webviewId;
70
- buniteWindow.__buniteRpcSocketPort = options.rpcSocketPort;
71
- buniteWindow.__bunite_encrypt = encrypt;
72
- buniteWindow.__bunite_decrypt = decrypt;
73
- }
@@ -1 +0,0 @@
1
- {"fileNames":["../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.dom.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/.bun/typescript@6.0.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","./webviewelement.ts","./runtime.ts"],"fileInfos":[{"version":"bcd24271a113971ba9eb71ff8cb01bc6b0f872a85c23fdbe5d93065b375933cd","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f88bedbeb09c6f5a6645cb24c7c55f1aa22d19ae96c8e6959cbd8b85a707bc6","impliedFormat":1},{"version":"7fe93b39b810eadd916be8db880dd7f0f7012a5cc6ffb62de8f62a2117fa6f1f","impliedFormat":1},{"version":"bb0074cc08b84a2374af33d8bf044b80851ccc9e719a5e202eacf40db2c31600","impliedFormat":1},{"version":"1a7daebe4f45fb03d9ec53d60008fbf9ac45a697fdc89e4ce218bc94b94f94d6","impliedFormat":1},{"version":"f94b133a3cb14a288803be545ac2683e0d0ff6661bcd37e31aaaec54fc382aed","impliedFormat":1},{"version":"f59d0650799f8782fd74cf73c19223730c6d1b9198671b1c5b3a38e1188b5953","impliedFormat":1},{"version":"8a15b4607d9a499e2dbeed9ec0d3c0d7372c850b2d5f1fb259e8f6d41d468a84","impliedFormat":1},{"version":"26e0fe14baee4e127f4365d1ae0b276f400562e45e19e35fd2d4c296684715e6","impliedFormat":1},{"version":"d6b1eba8496bdd0eed6fc8a685768fe01b2da4a0388b5fe7df558290bffcf32f","affectsGlobalScope":true,"impliedFormat":1},{"version":"eadcffda2aa84802c73938e589b9e58248d74c59cb7fcbca6474e3435ac15504","affectsGlobalScope":true,"impliedFormat":1},{"version":"105ba8ff7ba746404fe1a2e189d1d3d2e0eb29a08c18dded791af02f29fb4711","affectsGlobalScope":true,"impliedFormat":1},{"version":"00343ca5b2e3d48fa5df1db6e32ea2a59afab09590274a6cccb1dbae82e60c7c","affectsGlobalScope":true,"impliedFormat":1},{"version":"ebd9f816d4002697cb2864bea1f0b70a103124e18a8cd9645eeccc09bdf80ab4","affectsGlobalScope":true,"impliedFormat":1},{"version":"2c1afac30a01772cd2a9a298a7ce7706b5892e447bb46bdbeef720f7b5da77ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"7b0225f483e4fa685625ebe43dd584bb7973bbd84e66a6ba7bbe175ee1048b4f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c0a4b8ac6ce74679c1da2b3795296f5896e31c38e888469a8e0f99dc3305de60","affectsGlobalScope":true,"impliedFormat":1},{"version":"3084a7b5f569088e0146533a00830e206565de65cae2239509168b11434cd84f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5079c53f0f141a0698faa903e76cb41cd664e3efb01cc17a5c46ec2eb0bef42","affectsGlobalScope":true,"impliedFormat":1},{"version":"32cafbc484dea6b0ab62cf8473182bbcb23020d70845b406f80b7526f38ae862","affectsGlobalScope":true,"impliedFormat":1},{"version":"fca4cdcb6d6c5ef18a869003d02c9f0fd95df8cfaf6eb431cd3376bc034cad36","affectsGlobalScope":true,"impliedFormat":1},{"version":"b93ec88115de9a9dc1b602291b85baf825c85666bf25985cc5f698073892b467","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5c06dcc3fe849fcb297c247865a161f995cc29de7aa823afdd75aaaddc1419b","affectsGlobalScope":true,"impliedFormat":1},{"version":"b77e16112127a4b169ef0b8c3a4d730edf459c5f25fe52d5e436a6919206c4d7","affectsGlobalScope":true,"impliedFormat":1},{"version":"fbffd9337146eff822c7c00acbb78b01ea7ea23987f6c961eba689349e744f8c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a995c0e49b721312f74fdfb89e4ba29bd9824c770bbb4021d74d2bf560e4c6bd","affectsGlobalScope":true,"impliedFormat":1},{"version":"c7b3542146734342e440a84b213384bfa188835537ddbda50d30766f0593aff9","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce6180fa19b1cccd07ee7f7dbb9a367ac19c0ed160573e4686425060b6df7f57","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f02e2476bccb9dbe21280d6090f0df17d2f66b74711489415a8aa4df73c9675","affectsGlobalScope":true,"impliedFormat":1},{"version":"45e3ab34c1c013c8ab2dc1ba4c80c780744b13b5676800ae2e3be27ae862c40c","affectsGlobalScope":true,"impliedFormat":1},{"version":"805c86f6cca8d7702a62a844856dbaa2a3fd2abef0536e65d48732441dde5b5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e42e397f1a5a77994f0185fd1466520691456c772d06bf843e5084ceb879a0ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"f4c2b41f90c95b1c532ecc874bd3c111865793b23aebcc1c3cbbabcd5d76ffb0","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab26191cfad5b66afa11b8bf935ef1cd88fabfcb28d30b2dfa6fad877d050332","affectsGlobalScope":true,"impliedFormat":1},{"version":"2088bc26531e38fb05eedac2951480db5309f6be3fa4a08d2221abb0f5b4200d","affectsGlobalScope":true,"impliedFormat":1},{"version":"cb9d366c425fea79716a8fb3af0d78e6b22ebbab3bd64d25063b42dc9f531c1e","affectsGlobalScope":true,"impliedFormat":1},{"version":"500934a8089c26d57ebdb688fc9757389bb6207a3c8f0674d68efa900d2abb34","affectsGlobalScope":true,"impliedFormat":1},{"version":"689da16f46e647cef0d64b0def88910e818a5877ca5379ede156ca3afb780ac3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc21cc8b6fee4f4c2440d08035b7ea3c06b3511314c8bab6bef7a92de58a2593","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ca53d13d2957003abb47922a71866ba7cb2068f8d154877c596d63c359fed25","affectsGlobalScope":true,"impliedFormat":1},{"version":"54725f8c4df3d900cb4dac84b64689ce29548da0b4e9b7c2de61d41c79293611","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5594bc3076ac29e6c1ebda77939bc4c8833de72f654b6e376862c0473199323","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f3eb332c2d73e729f3364fcc0c2b375e72a121e8157d25a82d67a138c83a95c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6f4427f9642ce8d500970e4e69d1397f64072ab73b97e476b4002a646ac743b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"48915f327cd1dea4d7bd358d9dc7732f58f9e1626a29cc0c05c8c692419d9bb7","affectsGlobalScope":true,"impliedFormat":1},{"version":"b7bf9377723203b5a6a4b920164df22d56a43f593269ba6ae1fdc97774b68855","affectsGlobalScope":true,"impliedFormat":1},{"version":"db9709688f82c9e5f65a119c64d835f906efe5f559d08b11642d56eb85b79357","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b25b8c874acd1a4cf8444c3617e037d444d19080ac9f634b405583fd10ce1f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"37be57d7c90cf1f8112ee2636a068d8fd181289f82b744160ec56a7dc158a9f5","affectsGlobalScope":true,"impliedFormat":1},{"version":"a917a49ac94cd26b754ab84e113369a75d1a47a710661d7cd25e961cc797065f","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d3261badeb7843d157ef3e6f5d1427d0eeb0af0cf9df84a62cfd29fd47ac86e","affectsGlobalScope":true,"impliedFormat":1},{"version":"195daca651dde22f2167ac0d0a05e215308119a3100f5e6268e8317d05a92526","affectsGlobalScope":true,"impliedFormat":1},{"version":"8b11e4285cd2bb164a4dc09248bdec69e9842517db4ca47c1ba913011e44ff2f","affectsGlobalScope":true,"impliedFormat":1},{"version":"0508571a52475e245b02bc50fa1394065a0a3d05277fbf5120c3784b85651799","affectsGlobalScope":true,"impliedFormat":1},{"version":"8f9af488f510c3015af3cc8c267a9e9d96c4dd38a1fdff0e11dc5a544711415b","affectsGlobalScope":true,"impliedFormat":1},{"version":"fc611fea8d30ea72c6bbfb599c9b4d393ce22e2f5bfef2172534781e7d138104","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ce14b81c5cc821994aa8ec1d42b220dd41b27fcc06373bce3958af7421b77d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3a048b3e9302ef9a34ef4ebb9aecfb28b66abb3bce577206a79fee559c230da","affectsGlobalScope":true,"impliedFormat":1},{"version":"d1d2b74439bf388c1b2a5806029a7d6f23146a906e163721473d684aa9a8f1e5","signature":"5c08c27ab7fdb9d3a443d5b81d066acf9a3b44413dbfe91153a2288779910ad5","affectsGlobalScope":true},{"version":"3782d5b638f6529d7049c5ce5e778c01aadad180784460eb5c69430fd405de49","signature":"6447fe52d8ee29270b95a53b62dece95739c334d51b6271bd7e1323e81b79a2c"}],"root":[59,60],"options":{"composite":true,"exactOptionalPropertyTypes":false,"module":7,"skipLibCheck":true,"strict":true,"target":9},"affectedFilesPendingEmit":[[60,17],[59,17]],"emitSignatures":[59,60],"version":"6.0.3"}
package/src/shared/rpc.ts DELETED
@@ -1,424 +0,0 @@
1
- export type RpcRequestPacket = {
2
- type: "request";
3
- id: number;
4
- method: string;
5
- params: unknown;
6
- scope?: "global";
7
- };
8
-
9
- export type RpcResponsePacket =
10
- | { type: "response"; id: number; success: true; payload: unknown; scope?: "global" }
11
- | { type: "response"; id: number; success: false; error?: string; scope?: "global" };
12
-
13
- export type RpcMessagePacket = {
14
- type: "message";
15
- id: string;
16
- payload: unknown;
17
- };
18
-
19
- export type RpcEventPacket = {
20
- type: "event";
21
- channel: string;
22
- data: unknown;
23
- };
24
-
25
- export type RpcPacket = RpcRequestPacket | RpcResponsePacket | RpcMessagePacket | RpcEventPacket;
26
-
27
- type BaseRpcRequestsSchema = Record<string, { params: unknown; response: unknown }>;
28
- type BaseRpcMessagesSchema = Record<string, unknown>;
29
-
30
- export type RpcRequestsSchema<T extends BaseRpcRequestsSchema = BaseRpcRequestsSchema> = T;
31
- export type RpcMessagesSchema<T extends BaseRpcMessagesSchema = BaseRpcMessagesSchema> = T;
32
-
33
- type InputRpcSchema = {
34
- requests?: RpcRequestsSchema;
35
- messages?: RpcMessagesSchema;
36
- };
37
-
38
- type ResolvedRpcSchema<I extends InputRpcSchema> = {
39
- requests: undefined extends I["requests"] ? BaseRpcRequestsSchema : NonNullable<I["requests"]>;
40
- messages: undefined extends I["messages"] ? BaseRpcMessagesSchema : NonNullable<I["messages"]>;
41
- };
42
-
43
- export type RpcSchema<I extends InputRpcSchema | void = InputRpcSchema> = ResolvedRpcSchema<
44
- I extends InputRpcSchema ? I : InputRpcSchema
45
- >;
46
-
47
- type RequestParams<RS extends RpcRequestsSchema, M extends keyof RS> = RS[M]["params"];
48
- type RequestResponse<RS extends RpcRequestsSchema, M extends keyof RS> = RS[M]["response"];
49
- type MessagePayload<MS extends RpcMessagesSchema, N extends keyof MS> = MS[N];
50
-
51
- type RpcRequestHandlerFn<RS extends RpcRequestsSchema> = <M extends keyof RS>(
52
- method: M,
53
- params: RequestParams<RS, M>
54
- ) => Promise<RequestResponse<RS, M>> | RequestResponse<RS, M>;
55
-
56
- type RpcRequestHandlerObject<RS extends RpcRequestsSchema> = {
57
- [M in keyof RS]?: (
58
- ...args: undefined extends RS[M]["params"] ? [params?: RS[M]["params"]] : [params: RS[M]["params"]]
59
- ) => Promise<Awaited<RequestResponse<RS, M>>> | Awaited<RequestResponse<RS, M>>;
60
- } & {
61
- _?: (method: keyof RS, params: RequestParams<RS, keyof RS>) => unknown;
62
- };
63
-
64
- export type RpcRequestHandler<RS extends RpcRequestsSchema = RpcRequestsSchema> =
65
- | RpcRequestHandlerFn<RS>
66
- | RpcRequestHandlerObject<RS>;
67
-
68
- export type RpcTransport = {
69
- send?: (data: RpcPacket) => void;
70
- registerHandler?: (handler: (packet: RpcPacket) => void) => void;
71
- unregisterHandler?: () => void;
72
- };
73
-
74
- export interface RpcWithTransport {
75
- setTransport: (transport: RpcTransport) => void;
76
- }
77
-
78
- export type BuniteRpcSchema = {
79
- bun: RpcSchema;
80
- webview: RpcSchema;
81
- };
82
-
83
- type RemoteSideOf<S extends "bun" | "webview"> = S extends "bun" ? "webview" : "bun";
84
-
85
- export type BuniteRpcConfig<
86
- Schema extends BuniteRpcSchema,
87
- Side extends "bun" | "webview"
88
- > = {
89
- maxRequestTime?: number;
90
- handlers: {
91
- requests?: RpcRequestHandler<Schema[Side]["requests"]>;
92
- messages?: {
93
- [K in keyof Schema[RemoteSideOf<Side>]["messages"]]?: (
94
- payload: MessagePayload<Schema[RemoteSideOf<Side>]["messages"], K>
95
- ) => void;
96
- } & {
97
- "*"?: (
98
- messageName: keyof Schema[RemoteSideOf<Side>]["messages"],
99
- payload: MessagePayload<Schema[RemoteSideOf<Side>]["messages"], keyof Schema[RemoteSideOf<Side>]["messages"]>
100
- ) => void;
101
- };
102
- };
103
- };
104
-
105
- const MAX_ID = 1e10;
106
- const DEFAULT_MAX_REQUEST_TIME = 15_000;
107
-
108
- function missingTransportMethodError(methods: string[], action: string): Error {
109
- return new Error(
110
- `This RPC instance cannot ${action} because the transport did not provide: ${methods.join(", ")}`
111
- );
112
- }
113
-
114
- export function createRpc<
115
- Schema extends RpcSchema = RpcSchema,
116
- RemoteSchema extends RpcSchema = Schema
117
- >(options: {
118
- transport?: RpcTransport;
119
- requestHandler?: RpcRequestHandler<Schema["requests"]>;
120
- maxRequestTime?: number;
121
- } = {}) {
122
- let transport: RpcTransport = {};
123
- let requestHandler:
124
- | RpcRequestHandlerFn<Schema["requests"]>
125
- | undefined;
126
-
127
- function setTransport(nextTransport: RpcTransport) {
128
- transport.unregisterHandler?.();
129
- transport = nextTransport;
130
- transport.registerHandler?.(handlePacket);
131
- }
132
-
133
- function setRequestHandler(handler: RpcRequestHandler<Schema["requests"]>) {
134
- if (typeof handler === "function") {
135
- requestHandler = handler as RpcRequestHandlerFn<Schema["requests"]>;
136
- return;
137
- }
138
-
139
- requestHandler = (method, params) => {
140
- const requestHandlerObject = handler as RpcRequestHandlerObject<Schema["requests"]>;
141
- const specificHandler = requestHandlerObject[method];
142
- if (specificHandler) {
143
- return (specificHandler as (...args: [unknown]) => unknown)(params);
144
- }
145
- if (!requestHandlerObject._) {
146
- throw new Error(`The requested method has no handler: ${String(method)}`);
147
- }
148
- return requestHandlerObject._(method, params as never);
149
- };
150
- }
151
-
152
- if (options.transport) {
153
- setTransport(options.transport);
154
- }
155
- if (options.requestHandler) {
156
- setRequestHandler(options.requestHandler);
157
- }
158
-
159
- let lastRequestId = 0;
160
- const maxRequestTime = options.maxRequestTime ?? DEFAULT_MAX_REQUEST_TIME;
161
- const pendingRequests = new Map<
162
- number,
163
- {
164
- resolve: (value: unknown) => void;
165
- reject: (error: Error) => void;
166
- timeout: ReturnType<typeof setTimeout>;
167
- }
168
- >();
169
- const messageListeners = new Map<string, Set<(payload: unknown) => void>>();
170
- const wildcardListeners = new Set<(messageName: string, payload: unknown) => void>();
171
-
172
- function nextRequestId() {
173
- if (lastRequestId < MAX_ID) {
174
- lastRequestId += 1;
175
- return lastRequestId;
176
- }
177
- lastRequestId = 1;
178
- return lastRequestId;
179
- }
180
-
181
- function request<M extends keyof RemoteSchema["requests"]>(
182
- method: M,
183
- ...args: undefined extends RemoteSchema["requests"][M]["params"]
184
- ? [params?: RemoteSchema["requests"][M]["params"]]
185
- : [params: RemoteSchema["requests"][M]["params"]]
186
- ): Promise<RemoteSchema["requests"][M]["response"]> {
187
- if (!transport.send) {
188
- throw missingTransportMethodError(["send"], "issue requests");
189
- }
190
-
191
- const id = nextRequestId();
192
- const params = args[0];
193
- const packet: RpcRequestPacket = {
194
- type: "request",
195
- id,
196
- method: String(method),
197
- params
198
- };
199
-
200
- return new Promise((resolve, reject) => {
201
- const timeout = setTimeout(() => {
202
- pendingRequests.delete(id);
203
- reject(new Error(`Request timed out: ${String(method)}`));
204
- }, maxRequestTime);
205
-
206
- pendingRequests.set(id, { resolve, reject, timeout });
207
- transport.send?.(packet);
208
- }) as Promise<RemoteSchema["requests"][M]["response"]>;
209
- }
210
-
211
- function send<M extends keyof RemoteSchema["messages"]>(
212
- messageName: M,
213
- ...args: void extends RemoteSchema["messages"][M]
214
- ? []
215
- : undefined extends RemoteSchema["messages"][M]
216
- ? [payload?: RemoteSchema["messages"][M]]
217
- : [payload: RemoteSchema["messages"][M]]
218
- ): void {
219
- if (!transport.send) {
220
- throw missingTransportMethodError(["send"], "send messages");
221
- }
222
-
223
- transport.send({
224
- type: "message",
225
- id: String(messageName),
226
- payload: args[0]
227
- });
228
- }
229
-
230
- function addMessageListener(
231
- messageName: "*" | keyof Schema["messages"],
232
- listener:
233
- | ((name: string, payload: unknown) => void)
234
- | ((payload: unknown) => void)
235
- ) {
236
- if (messageName === "*") {
237
- wildcardListeners.add(listener as (name: string, payload: unknown) => void);
238
- return;
239
- }
240
-
241
- const key = String(messageName);
242
- if (!messageListeners.has(key)) {
243
- messageListeners.set(key, new Set());
244
- }
245
- messageListeners.get(key)?.add(listener as (payload: unknown) => void);
246
- }
247
-
248
- function removeMessageListener(
249
- messageName: "*" | keyof Schema["messages"],
250
- listener: ((payload: unknown) => void) | ((name: string, payload: unknown) => void)
251
- ) {
252
- if (messageName === "*") {
253
- wildcardListeners.delete(listener as (name: string, payload: unknown) => void);
254
- return;
255
- }
256
-
257
- messageListeners.get(String(messageName))?.delete(listener as (payload: unknown) => void);
258
- }
259
-
260
- async function handlePacket(packet: RpcPacket) {
261
- if (packet.type === "request") {
262
- if (!transport.send || !requestHandler) {
263
- throw missingTransportMethodError(["send", "requestHandler"], "handle requests");
264
- }
265
-
266
- try {
267
- const payload = await requestHandler(packet.method as never, packet.params as never);
268
- transport.send({
269
- type: "response",
270
- id: packet.id,
271
- success: true,
272
- payload
273
- });
274
- } catch (error) {
275
- transport.send({
276
- type: "response",
277
- id: packet.id,
278
- success: false,
279
- error: error instanceof Error ? error.message : String(error)
280
- });
281
- }
282
- return;
283
- }
284
-
285
- if (packet.type === "response") {
286
- const pending = pendingRequests.get(packet.id);
287
- if (!pending) {
288
- return;
289
- }
290
-
291
- clearTimeout(pending.timeout);
292
- pendingRequests.delete(packet.id);
293
-
294
- if (!packet.success) {
295
- pending.reject(new Error(packet.error ?? "Unknown RPC error"));
296
- } else {
297
- pending.resolve(packet.payload);
298
- }
299
- return;
300
- }
301
-
302
- if (packet.type === "message") {
303
- for (const listener of wildcardListeners) {
304
- listener(packet.id, packet.payload);
305
- }
306
- for (const listener of messageListeners.get(packet.id) ?? []) {
307
- listener(packet.payload);
308
- }
309
- }
310
- }
311
-
312
- const requestProxy = new Proxy(
313
- {},
314
- {
315
- get(_target, method) {
316
- return (params: unknown) =>
317
- request(method as keyof RemoteSchema["requests"], params as never);
318
- }
319
- }
320
- ) as {
321
- [M in keyof RemoteSchema["requests"]]: (
322
- ...args: undefined extends RemoteSchema["requests"][M]["params"]
323
- ? [params?: RemoteSchema["requests"][M]["params"]]
324
- : [params: RemoteSchema["requests"][M]["params"]]
325
- ) => Promise<RemoteSchema["requests"][M]["response"]>;
326
- };
327
-
328
- const sendProxy = new Proxy(
329
- {},
330
- {
331
- get(_target, method) {
332
- return (...args: unknown[]) =>
333
- (send as any)(method as keyof RemoteSchema["messages"], ...args);
334
- }
335
- }
336
- ) as {
337
- [M in keyof RemoteSchema["messages"]]: (
338
- ...args: void extends RemoteSchema["messages"][M]
339
- ? []
340
- : undefined extends RemoteSchema["messages"][M]
341
- ? [payload?: RemoteSchema["messages"][M]]
342
- : [payload: RemoteSchema["messages"][M]]
343
- ) => void;
344
- };
345
-
346
- function dispose() {
347
- for (const [id, pending] of pendingRequests) {
348
- clearTimeout(pending.timeout);
349
- pending.reject(new Error("RPC disposed"));
350
- }
351
- pendingRequests.clear();
352
- transport.unregisterHandler?.();
353
- transport = {};
354
- }
355
-
356
- return {
357
- setTransport,
358
- setRequestHandler,
359
- request,
360
- send,
361
- requestProxy,
362
- sendProxy,
363
- addMessageListener,
364
- removeMessageListener,
365
- dispose,
366
- proxy: {
367
- request: requestProxy,
368
- send: sendProxy
369
- }
370
- };
371
- }
372
-
373
- function defineSideRpc<
374
- Schema extends BuniteRpcSchema,
375
- Side extends "bun" | "webview"
376
- >(
377
- config: BuniteRpcConfig<Schema, Side>
378
- ) {
379
- type RemoteSide = Side extends "bun" ? "webview" : "bun";
380
- type LocalSchema = {
381
- requests: Schema[Side]["requests"];
382
- messages: Schema[RemoteSide]["messages"];
383
- };
384
- type RemoteSchema = {
385
- requests: Schema[RemoteSide]["requests"];
386
- messages: Schema[Side]["messages"];
387
- };
388
-
389
- const rpc = createRpc<LocalSchema, RemoteSchema>({
390
- maxRequestTime: config.maxRequestTime,
391
- requestHandler: config.handlers.requests,
392
- transport: {
393
- registerHandler: () => {}
394
- }
395
- });
396
-
397
- if (config.handlers.messages) {
398
- rpc.addMessageListener("*", (messageName, payload) => {
399
- const wildcardHandler = config.handlers.messages?.["*"];
400
- wildcardHandler?.(messageName as never, payload as never);
401
-
402
- const specificHandler = config.handlers.messages?.[
403
- messageName as keyof Schema[Side]["messages"]
404
- ];
405
- if (specificHandler) {
406
- (specificHandler as (payload: unknown) => void)(payload);
407
- }
408
- });
409
- }
410
-
411
- return rpc;
412
- }
413
-
414
- export function defineBunRpc<Schema extends BuniteRpcSchema>(
415
- config: BuniteRpcConfig<Schema, "bun">
416
- ) {
417
- return defineSideRpc<Schema, "bun">(config);
418
- }
419
-
420
- export function defineWebviewRpc<Schema extends BuniteRpcSchema>(
421
- config: BuniteRpcConfig<Schema, "webview">
422
- ) {
423
- return defineSideRpc<Schema, "webview">(config);
424
- }