bunite-core 0.8.1 → 0.10.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.
- package/package.json +7 -6
- package/src/{bun → host}/core/App.ts +45 -81
- package/src/{bun → host}/core/BrowserView.ts +71 -65
- package/src/{bun → host}/core/BrowserWindow.ts +15 -14
- package/src/host/core/Socket.ts +98 -0
- package/src/host/core/SurfaceBrowserIPC.ts +7 -0
- package/src/host/core/SurfaceManager.ts +154 -0
- package/src/host/encryptedPipe.ts +62 -0
- package/src/{bun → host}/events/appEvents.ts +0 -1
- package/src/host/index.ts +29 -0
- package/src/{bun/proc → host}/native.ts +38 -52
- package/src/{shared → host}/paths.ts +20 -26
- package/src/{bun/preload/inline.ts → host/preloadBundle.ts} +2 -2
- package/src/host/serveWeb.ts +105 -0
- package/src/native/linux/bunite_linux_runtime.cpp +2 -2
- package/src/native/mac/bunite_mac_ffi.mm +2 -2
- package/src/native/shared/ffi_exports.h +1 -1
- package/src/native/win/native_host_ffi.cpp +2 -2
- package/src/preload/runtime.built.js +1 -1
- package/src/preload/runtime.ts +52 -219
- package/src/preload/tsconfig.json +3 -10
- package/src/rpc/encrypt.ts +74 -0
- package/src/rpc/error.ts +68 -0
- package/src/rpc/framework.ts +132 -0
- package/src/rpc/index.ts +138 -0
- package/src/rpc/peer.ts +1438 -0
- package/src/rpc/renderer.ts +80 -0
- package/src/rpc/schema.ts +229 -0
- package/src/rpc/stream.ts +72 -0
- package/src/rpc/transport.ts +81 -0
- package/src/rpc/wire.ts +164 -0
- package/src/{preload/webviewElement.ts → webview/native.ts} +68 -48
- package/src/{shared/webviewPolyfill.ts → webview/polyfill.ts} +4 -7
- package/src/bun/core/Socket.ts +0 -187
- package/src/bun/core/SurfaceBrowserIPC.ts +0 -65
- package/src/bun/core/SurfaceManager.ts +0 -201
- package/src/bun/index.ts +0 -53
- package/src/bun/preload/index.ts +0 -73
- package/src/preload/tsconfig.tsbuildinfo +0 -1
- package/src/shared/rpc.ts +0 -424
- package/src/shared/rpcDemux.ts +0 -219
- package/src/shared/rpcWire.ts +0 -54
- package/src/shared/rpcWireConstants.ts +0 -3
- package/src/shared/webRpcHandler.ts +0 -77
- package/src/shared/webSocketTransport.ts +0 -26
- package/src/view/index.ts +0 -196
- /package/src/{shared → host}/cefVersion.ts +0 -0
- /package/src/{bun → host}/core/SurfaceRegistry.ts +0 -0
- /package/src/{bun → host}/core/singleInstanceLock.ts +0 -0
- /package/src/{bun → host}/core/windowIds.ts +0 -0
- /package/src/{bun → host}/events/event.ts +0 -0
- /package/src/{bun → host}/events/eventEmitter.ts +0 -0
- /package/src/{bun → host}/events/webviewEvents.ts +0 -0
- /package/src/{bun → host}/events/windowEvents.ts +0 -0
- /package/src/{shared → host}/log.ts +0 -0
- /package/src/{shared → host}/platform.ts +0 -0
|
@@ -1,14 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
+
"extends": "../../../tsconfig.base.json",
|
|
2
3
|
"compilerOptions": {
|
|
3
|
-
"composite": true
|
|
4
|
-
"target": "ES2022",
|
|
5
|
-
"module": "ES2022",
|
|
6
|
-
"moduleResolution": "bundler",
|
|
7
|
-
"lib": ["ES2022", "DOM"],
|
|
8
|
-
"strict": true,
|
|
9
|
-
"exactOptionalPropertyTypes": false,
|
|
10
|
-
"skipLibCheck": true,
|
|
11
|
-
"noEmit": true
|
|
4
|
+
"composite": true
|
|
12
5
|
},
|
|
13
|
-
"include": ["runtime.ts", "
|
|
6
|
+
"include": ["runtime.ts", "../webview/native.ts", "../rpc/**/*.ts"]
|
|
14
7
|
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { BytesPipe } from "./transport";
|
|
2
|
+
|
|
3
|
+
const VERSION = 1;
|
|
4
|
+
const IV_LENGTH = 12;
|
|
5
|
+
const HEADER_LENGTH = 1 + IV_LENGTH;
|
|
6
|
+
|
|
7
|
+
function toBufferSource(view: Uint8Array): ArrayBuffer {
|
|
8
|
+
const out = new ArrayBuffer(view.byteLength);
|
|
9
|
+
new Uint8Array(out).set(view);
|
|
10
|
+
return out;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
async function importAesGcmKey(rawKey: Uint8Array): Promise<CryptoKey> {
|
|
14
|
+
return crypto.subtle.importKey("raw", toBufferSource(rawKey), "AES-GCM", false, ["encrypt", "decrypt"]);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// WebCrypto AES-256-GCM (browser / preload). For Bun-side use `host/encryptedPipe.ts` (node:crypto).
|
|
18
|
+
export async function createEncryptedPipe(base: BytesPipe, rawKey: Uint8Array): Promise<BytesPipe> {
|
|
19
|
+
const key = await importAesGcmKey(rawKey);
|
|
20
|
+
let downstream: ((bytes: Uint8Array) => void) | undefined;
|
|
21
|
+
let sendChain: Promise<void> = Promise.resolve();
|
|
22
|
+
let recvChain: Promise<void> = Promise.resolve();
|
|
23
|
+
let closed = false;
|
|
24
|
+
const closeOnce = () => { if (!closed) { closed = true; base.close(); } };
|
|
25
|
+
|
|
26
|
+
base.setReceive((frame) => {
|
|
27
|
+
if (closed) return;
|
|
28
|
+
if (frame.length < HEADER_LENGTH || frame[0] !== VERSION) {
|
|
29
|
+
closeOnce();
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const iv = toBufferSource(frame.subarray(1, HEADER_LENGTH));
|
|
33
|
+
const payload = toBufferSource(frame.subarray(HEADER_LENGTH));
|
|
34
|
+
recvChain = recvChain.then(async () => {
|
|
35
|
+
if (closed) return;
|
|
36
|
+
try {
|
|
37
|
+
const buf = await crypto.subtle.decrypt({ name: "AES-GCM", iv }, key, payload);
|
|
38
|
+
downstream?.(new Uint8Array(buf));
|
|
39
|
+
} catch {
|
|
40
|
+
closeOnce();
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
return {
|
|
46
|
+
send(bytes) {
|
|
47
|
+
if (closed) return;
|
|
48
|
+
const payload = toBufferSource(bytes);
|
|
49
|
+
sendChain = sendChain.then(async () => {
|
|
50
|
+
if (closed) return;
|
|
51
|
+
try {
|
|
52
|
+
const iv = crypto.getRandomValues(new Uint8Array(IV_LENGTH));
|
|
53
|
+
const ivBuf = toBufferSource(iv);
|
|
54
|
+
const encrypted = await crypto.subtle.encrypt({ name: "AES-GCM", iv: ivBuf }, key, payload);
|
|
55
|
+
const encArr = new Uint8Array(encrypted);
|
|
56
|
+
const out = new Uint8Array(HEADER_LENGTH + encArr.byteLength);
|
|
57
|
+
out[0] = VERSION;
|
|
58
|
+
out.set(iv, 1);
|
|
59
|
+
out.set(encArr, HEADER_LENGTH);
|
|
60
|
+
base.send(out);
|
|
61
|
+
} catch {
|
|
62
|
+
closeOnce();
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
},
|
|
66
|
+
setReceive(handler) {
|
|
67
|
+
downstream = handler;
|
|
68
|
+
},
|
|
69
|
+
close() {
|
|
70
|
+
closeOnce();
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
package/src/rpc/error.ts
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
export type IpcCode =
|
|
2
|
+
| "not_found"
|
|
3
|
+
| "failed_precondition"
|
|
4
|
+
| "already_exists"
|
|
5
|
+
| "invalid_argument"
|
|
6
|
+
| "cancelled"
|
|
7
|
+
| "deadline_exceeded"
|
|
8
|
+
| "resource_exhausted"
|
|
9
|
+
| "unavailable"
|
|
10
|
+
| "internal";
|
|
11
|
+
|
|
12
|
+
export type FailedPreconditionReason =
|
|
13
|
+
| "version_mismatch"
|
|
14
|
+
| "unauthorized"
|
|
15
|
+
| "unregistered_cap_return"
|
|
16
|
+
| "revoked";
|
|
17
|
+
|
|
18
|
+
export type ResourceExhaustedReason =
|
|
19
|
+
| "max_frame_bytes"
|
|
20
|
+
| "max_concurrent_calls"
|
|
21
|
+
| "max_caps_per_connection"
|
|
22
|
+
| "stream_credit_window"
|
|
23
|
+
| "rate_limited";
|
|
24
|
+
|
|
25
|
+
export type UnavailableReason =
|
|
26
|
+
| "peer_closing"
|
|
27
|
+
| "goaway"
|
|
28
|
+
| "plugin_unloading";
|
|
29
|
+
|
|
30
|
+
export type AlreadyExistsReason =
|
|
31
|
+
| "name_collision"
|
|
32
|
+
| "reserved_namespace";
|
|
33
|
+
|
|
34
|
+
export type RetrySpec =
|
|
35
|
+
| { kind: "never" }
|
|
36
|
+
| { kind: "transparent" }
|
|
37
|
+
| { kind: "after-cooldown"; minMs: number }
|
|
38
|
+
| { kind: "after-resync" };
|
|
39
|
+
|
|
40
|
+
export interface IpcStatus {
|
|
41
|
+
code: IpcCode;
|
|
42
|
+
message?: string;
|
|
43
|
+
details?: unknown;
|
|
44
|
+
retry?: RetrySpec;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export class IpcError extends Error {
|
|
48
|
+
readonly code: IpcCode;
|
|
49
|
+
readonly details: unknown;
|
|
50
|
+
readonly retry?: RetrySpec;
|
|
51
|
+
|
|
52
|
+
constructor(status: IpcStatus) {
|
|
53
|
+
super(status.message ?? status.code);
|
|
54
|
+
this.name = "IpcError";
|
|
55
|
+
this.code = status.code;
|
|
56
|
+
this.details = status.details;
|
|
57
|
+
this.retry = status.retry;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
toStatus(): IpcStatus {
|
|
61
|
+
return {
|
|
62
|
+
code: this.code,
|
|
63
|
+
message: this.message,
|
|
64
|
+
details: this.details,
|
|
65
|
+
retry: this.retry,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { call, defineCap, stream, cap } from "./schema";
|
|
2
|
+
import type { CapDef } from "./schema";
|
|
3
|
+
|
|
4
|
+
export const BrowserWindowCap = defineCap("bunite.BrowserWindow", {
|
|
5
|
+
focus: call<void, void>(),
|
|
6
|
+
close: call<void, void>(),
|
|
7
|
+
setBounds: call<{ x: number; y: number; w: number; h: number }, void>(),
|
|
8
|
+
setTitle: call<{ title: string }, void>(),
|
|
9
|
+
id: call<void, number>({ idempotent: true }),
|
|
10
|
+
label: call<void, string>({ idempotent: true }),
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
export const WindowCap = defineCap("bunite.Window", {
|
|
14
|
+
create: call<WindowCreateOpts, typeof BrowserWindowCap>({ returns: cap(BrowserWindowCap) }),
|
|
15
|
+
list: call<void, typeof BrowserWindowCap>({ returns: cap.array(BrowserWindowCap), idempotent: true }),
|
|
16
|
+
focus: call<{ id?: number; label?: string }, void>(),
|
|
17
|
+
close: call<{ id?: number; label?: string }, void>(),
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
export interface WindowCreateOpts {
|
|
21
|
+
url: string;
|
|
22
|
+
title?: string;
|
|
23
|
+
bounds?: { x?: number; y?: number; w?: number; h?: number };
|
|
24
|
+
label?: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export const FileRefCap = defineCap("bunite.FileRef", {
|
|
28
|
+
text: call<void, string>({ idempotent: true }),
|
|
29
|
+
bytes: call<void, Uint8Array>({ idempotent: true }),
|
|
30
|
+
path: call<void, string>({ idempotent: true }),
|
|
31
|
+
revoke: call<void, void>(),
|
|
32
|
+
}, { disposal: { method: "revoke" } });
|
|
33
|
+
|
|
34
|
+
export const DialogsCap = defineCap("bunite.Dialogs", {
|
|
35
|
+
openFile: call<DialogOpenFileOpts, typeof FileRefCap>({ returns: cap.array(FileRefCap) }),
|
|
36
|
+
saveFile: call<DialogSaveFileOpts, typeof FileRefCap>({ returns: cap(FileRefCap) }),
|
|
37
|
+
showMessage: call<DialogMessageOpts, "primary" | "secondary" | "tertiary">(),
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
export interface DialogOpenFileOpts {
|
|
41
|
+
title?: string;
|
|
42
|
+
filters?: { name: string; extensions: string[] }[];
|
|
43
|
+
multiple?: boolean;
|
|
44
|
+
startDir?: string;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface DialogSaveFileOpts {
|
|
48
|
+
title?: string;
|
|
49
|
+
defaultName?: string;
|
|
50
|
+
filters?: { name: string; extensions: string[] }[];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface DialogMessageOpts {
|
|
54
|
+
title?: string;
|
|
55
|
+
body: string;
|
|
56
|
+
primary?: string;
|
|
57
|
+
secondary?: string;
|
|
58
|
+
tertiary?: string;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export const ClipboardCap = defineCap("bunite.Clipboard", {
|
|
62
|
+
readText: call<void, string>({ idempotent: true }),
|
|
63
|
+
writeText: call<{ text: string }, void>(),
|
|
64
|
+
readBytes: call<{ mime: string }, Uint8Array>({ idempotent: true }),
|
|
65
|
+
writeBytes: call<{ mime: string; data: Uint8Array }, void>(),
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
export const ShellCap = defineCap("bunite.Shell", {
|
|
69
|
+
openExternal: call<{ url: string }, boolean>(),
|
|
70
|
+
showItemInFolder: call<{ path: string }, void>(),
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
export type SurfaceMask = { x: number; y: number; w: number; h: number };
|
|
74
|
+
|
|
75
|
+
export const SurfaceCap = defineCap("bunite.Surface", {
|
|
76
|
+
init: call<{
|
|
77
|
+
src: string;
|
|
78
|
+
x: number;
|
|
79
|
+
y: number;
|
|
80
|
+
width: number;
|
|
81
|
+
height: number;
|
|
82
|
+
hidden?: boolean;
|
|
83
|
+
}, { surfaceId: number }>(),
|
|
84
|
+
resize: call<{ surfaceId: number; x: number; y: number; w: number; h: number }, void>(),
|
|
85
|
+
remove: call<{ surfaceId: number }, void>(),
|
|
86
|
+
setHidden: call<{ surfaceId: number; hidden: boolean }, void>(),
|
|
87
|
+
setMasks: call<{ surfaceId: number; masks: SurfaceMask[] }, void>(),
|
|
88
|
+
setAllPassthrough: call<{ passthrough: boolean }, void>(),
|
|
89
|
+
bringAllVisiblesToFront: call<void, void>(),
|
|
90
|
+
navigate: call<{ surfaceId: number; url: string }, void>(),
|
|
91
|
+
goBack: call<{ surfaceId: number }, void>(),
|
|
92
|
+
reload: call<{ surfaceId: number }, void>(),
|
|
93
|
+
didNavigate: stream<void, { surfaceId: number; url: string }>(),
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
export const RuntimeCap = defineCap("bunite.Runtime", {
|
|
97
|
+
window: call<void, typeof WindowCap>({ returns: cap(WindowCap), idempotent: true }),
|
|
98
|
+
dialogs: call<void, typeof DialogsCap>({ returns: cap(DialogsCap), idempotent: true }),
|
|
99
|
+
clipboard: call<void, typeof ClipboardCap>({ returns: cap(ClipboardCap), idempotent: true }),
|
|
100
|
+
shell: call<void, typeof ShellCap>({ returns: cap(ShellCap), idempotent: true }),
|
|
101
|
+
appName: call<void, string>({ idempotent: true }),
|
|
102
|
+
appVersion: call<void, string>({ idempotent: true }),
|
|
103
|
+
theme: call<void, "light" | "dark">({ idempotent: true }),
|
|
104
|
+
themeWatch: stream<void, "light" | "dark">(),
|
|
105
|
+
surface: call<void, typeof SurfaceCap>({ returns: cap(SurfaceCap), idempotent: true }),
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
export const FRAMEWORK_TYPE_IDS = {
|
|
109
|
+
Runtime: 1,
|
|
110
|
+
Window: 2,
|
|
111
|
+
Dialogs: 3,
|
|
112
|
+
FileRef: 4,
|
|
113
|
+
Clipboard: 5,
|
|
114
|
+
Shell: 6,
|
|
115
|
+
BrowserWindow: 7,
|
|
116
|
+
Surface: 8,
|
|
117
|
+
} as const;
|
|
118
|
+
|
|
119
|
+
const FRAMEWORK_CAP_TYPE_IDS = new Map<CapDef<any, any>, number>([
|
|
120
|
+
[RuntimeCap, FRAMEWORK_TYPE_IDS.Runtime],
|
|
121
|
+
[WindowCap, FRAMEWORK_TYPE_IDS.Window],
|
|
122
|
+
[DialogsCap, FRAMEWORK_TYPE_IDS.Dialogs],
|
|
123
|
+
[FileRefCap, FRAMEWORK_TYPE_IDS.FileRef],
|
|
124
|
+
[ClipboardCap, FRAMEWORK_TYPE_IDS.Clipboard],
|
|
125
|
+
[ShellCap, FRAMEWORK_TYPE_IDS.Shell],
|
|
126
|
+
[BrowserWindowCap, FRAMEWORK_TYPE_IDS.BrowserWindow],
|
|
127
|
+
[SurfaceCap, FRAMEWORK_TYPE_IDS.Surface],
|
|
128
|
+
]);
|
|
129
|
+
|
|
130
|
+
export function frameworkTypeIdOf(cap: CapDef<any, any>): number | undefined {
|
|
131
|
+
return FRAMEWORK_CAP_TYPE_IDS.get(cap);
|
|
132
|
+
}
|
package/src/rpc/index.ts
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
export {
|
|
2
|
+
call,
|
|
3
|
+
stream,
|
|
4
|
+
cap,
|
|
5
|
+
defineCap,
|
|
6
|
+
defineSchema,
|
|
7
|
+
isCallDef,
|
|
8
|
+
isStreamDef,
|
|
9
|
+
isCapDef,
|
|
10
|
+
isSchema,
|
|
11
|
+
isCapRef,
|
|
12
|
+
isCapArray,
|
|
13
|
+
isCapRecord,
|
|
14
|
+
returnsKindOf,
|
|
15
|
+
} from "./schema";
|
|
16
|
+
|
|
17
|
+
export type {
|
|
18
|
+
CallDef,
|
|
19
|
+
StreamDef,
|
|
20
|
+
CapDef,
|
|
21
|
+
CapRefToken,
|
|
22
|
+
CapArrayToken,
|
|
23
|
+
CapRecordToken,
|
|
24
|
+
AnyCapToken,
|
|
25
|
+
MethodDef,
|
|
26
|
+
MethodsRecord,
|
|
27
|
+
DisposalSpec,
|
|
28
|
+
DefineCapOpts,
|
|
29
|
+
Schema,
|
|
30
|
+
SchemaRoots,
|
|
31
|
+
ImplsOf,
|
|
32
|
+
ReturnsKind,
|
|
33
|
+
CallCtx,
|
|
34
|
+
Attestation,
|
|
35
|
+
ExportedCap,
|
|
36
|
+
ClientOf,
|
|
37
|
+
ImplOf,
|
|
38
|
+
ClientReturn,
|
|
39
|
+
} from "./schema";
|
|
40
|
+
|
|
41
|
+
export {
|
|
42
|
+
CapRef,
|
|
43
|
+
CAP_REF_EXT,
|
|
44
|
+
createCodec,
|
|
45
|
+
isFrame,
|
|
46
|
+
DEFAULT_MAX_BYTES,
|
|
47
|
+
PROTOCOL_VERSION,
|
|
48
|
+
FRAMEWORK_NAME_PREFIX,
|
|
49
|
+
BOOTSTRAP_METHOD,
|
|
50
|
+
} from "./wire";
|
|
51
|
+
|
|
52
|
+
export type {
|
|
53
|
+
Frame,
|
|
54
|
+
CallFrame,
|
|
55
|
+
ResultFrame,
|
|
56
|
+
StreamFrame,
|
|
57
|
+
CancelFrame,
|
|
58
|
+
DropFrame,
|
|
59
|
+
HelloFrame,
|
|
60
|
+
GoAwayFrame,
|
|
61
|
+
CapRevokedFrame,
|
|
62
|
+
StreamEvent,
|
|
63
|
+
Target,
|
|
64
|
+
CallMeta,
|
|
65
|
+
CodecPair,
|
|
66
|
+
u32,
|
|
67
|
+
u53,
|
|
68
|
+
} from "./wire";
|
|
69
|
+
|
|
70
|
+
export { IpcError } from "./error";
|
|
71
|
+
|
|
72
|
+
export type {
|
|
73
|
+
IpcCode,
|
|
74
|
+
IpcStatus,
|
|
75
|
+
RetrySpec,
|
|
76
|
+
FailedPreconditionReason,
|
|
77
|
+
ResourceExhaustedReason,
|
|
78
|
+
UnavailableReason,
|
|
79
|
+
AlreadyExistsReason,
|
|
80
|
+
} from "./error";
|
|
81
|
+
|
|
82
|
+
export {
|
|
83
|
+
CapTable,
|
|
84
|
+
USER_ROOTS_CAP_ID,
|
|
85
|
+
RUNTIME_CAP_ID,
|
|
86
|
+
USER_ROOTS_TYPE_ID,
|
|
87
|
+
RUNTIME_TYPE_ID,
|
|
88
|
+
FIRST_USER_CAP_ID,
|
|
89
|
+
FIRST_USER_TYPE_ID,
|
|
90
|
+
MAX_CAPS_PER_CONNECTION,
|
|
91
|
+
MAX_IN_FLIGHT_CALLS_PER_CONNECTION,
|
|
92
|
+
createConnection,
|
|
93
|
+
} from "./peer";
|
|
94
|
+
|
|
95
|
+
export {
|
|
96
|
+
RuntimeCap,
|
|
97
|
+
WindowCap,
|
|
98
|
+
BrowserWindowCap,
|
|
99
|
+
DialogsCap,
|
|
100
|
+
FileRefCap,
|
|
101
|
+
ClipboardCap,
|
|
102
|
+
ShellCap,
|
|
103
|
+
SurfaceCap,
|
|
104
|
+
FRAMEWORK_TYPE_IDS,
|
|
105
|
+
} from "./framework";
|
|
106
|
+
|
|
107
|
+
export type {
|
|
108
|
+
WindowCreateOpts,
|
|
109
|
+
DialogOpenFileOpts,
|
|
110
|
+
DialogSaveFileOpts,
|
|
111
|
+
DialogMessageOpts,
|
|
112
|
+
} from "./framework";
|
|
113
|
+
|
|
114
|
+
export type {
|
|
115
|
+
Transport,
|
|
116
|
+
Connection,
|
|
117
|
+
ConnectionOptions,
|
|
118
|
+
ConnectionEvents,
|
|
119
|
+
CapTableEntry,
|
|
120
|
+
PendingCall,
|
|
121
|
+
Policy,
|
|
122
|
+
IfExists,
|
|
123
|
+
ServeHandle,
|
|
124
|
+
} from "./peer";
|
|
125
|
+
|
|
126
|
+
export {
|
|
127
|
+
createFrameTransport,
|
|
128
|
+
createWebSocketPipe,
|
|
129
|
+
} from "./transport";
|
|
130
|
+
|
|
131
|
+
export type {
|
|
132
|
+
BytesPipe,
|
|
133
|
+
WebSocketLike,
|
|
134
|
+
} from "./transport";
|
|
135
|
+
|
|
136
|
+
export { createEncryptedPipe } from "./encrypt";
|
|
137
|
+
|
|
138
|
+
export { Stream } from "./stream";
|