opentray 0.7.0 → 0.8.1
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/README.md +54 -181
- package/dist/cli.d.mts +5 -7
- package/dist/cli.d.mts.map +1 -1
- package/dist/cli.mjs +22 -89
- package/dist/cli.mjs.map +1 -1
- package/dist/index.d.mts +10 -12
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +578 -80
- package/dist/index.mjs.map +1 -1
- package/dist/native-runtime-Cn8BaffH.d.mts +136 -0
- package/dist/native-runtime-Cn8BaffH.d.mts.map +1 -0
- package/dist/node.d.mts +30 -42
- package/dist/node.d.mts.map +1 -1
- package/dist/node.mjs +16 -2
- package/dist/node.mjs.map +1 -0
- package/dist/runtime-binding-transport-UPunusBT.mjs +177 -0
- package/dist/runtime-binding-transport-UPunusBT.mjs.map +1 -0
- package/package.json +13 -11
- package/dist/client-C27qmRfr.d.mts +0 -102
- package/dist/client-C27qmRfr.d.mts.map +0 -1
- package/dist/local-broker-DOIkewF4.mjs +0 -551
- package/dist/local-broker-DOIkewF4.mjs.map +0 -1
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
import { PROTOCOL_VERSION, parseServerFrame } from "@opentray/spec";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { constants } from "node:fs";
|
|
5
|
+
import { access } from "node:fs/promises";
|
|
6
|
+
//#region src/native-runtime.ts
|
|
7
|
+
const requireFromSource = createRequire(import.meta.url);
|
|
8
|
+
const runtimeBindingRelativePath = "runtime/opentray_runtime.node";
|
|
9
|
+
const resolveRuntimeNativeTarget = (platform = process.platform, arch = process.arch) => {
|
|
10
|
+
return {
|
|
11
|
+
packageName: `@opentray/${platformToPackageOs(platform)}-${normalizeArch(arch)}`,
|
|
12
|
+
bindingRelativePath: runtimeBindingRelativePath
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
const resolveInstalledRuntimeBindingPath = async ({ platform = process.platform, arch = process.arch, resolvePackageJson = resolvePackageJsonFromSource } = {}) => {
|
|
16
|
+
const target = resolveRuntimeNativeTarget(platform, arch);
|
|
17
|
+
const packageJsonPath = resolvePackageJson(target.packageName);
|
|
18
|
+
if (packageJsonPath === void 0) throw new MissingPlatformRuntimeBindingError(`unable to resolve OpenTray runtime binding for ${platform}/${arch}; install ${target.packageName}`, platform, arch, { packageName: target.packageName });
|
|
19
|
+
const bindingPath = join(dirname(packageJsonPath), target.bindingRelativePath);
|
|
20
|
+
if (!await exists(bindingPath)) throw new MissingPlatformRuntimeBindingError(`OpenTray runtime package ${target.packageName} is installed but missing ${target.bindingRelativePath}`, platform, arch, {
|
|
21
|
+
packageName: target.packageName,
|
|
22
|
+
bindingPath
|
|
23
|
+
});
|
|
24
|
+
return bindingPath;
|
|
25
|
+
};
|
|
26
|
+
const loadOpenTrayRuntimeBinding = async (options = {}) => {
|
|
27
|
+
const bindingPath = await resolveInstalledRuntimeBindingPath(options);
|
|
28
|
+
const loaded = (options.nativeLoader ?? loadNativeModule)(bindingPath);
|
|
29
|
+
if (!isRuntimeBinding(loaded)) throw new MissingPlatformRuntimeBindingError(`OpenTray runtime binding ${bindingPath} does not expose runtimeBindingInfo()`, options.platform ?? process.platform, options.arch ?? process.arch, { bindingPath });
|
|
30
|
+
return loaded;
|
|
31
|
+
};
|
|
32
|
+
const loadNativeModule = (bindingPath) => requireFromSource(bindingPath);
|
|
33
|
+
const isRuntimeBinding = (value) => {
|
|
34
|
+
if (typeof value !== "object" || value === null || !("runtimeBindingInfo" in value)) return false;
|
|
35
|
+
return typeof value.runtimeBindingInfo === "function";
|
|
36
|
+
};
|
|
37
|
+
const platformToPackageOs = (platform) => {
|
|
38
|
+
switch (platform) {
|
|
39
|
+
case "darwin":
|
|
40
|
+
case "linux": return platform;
|
|
41
|
+
case "win32": return "windows";
|
|
42
|
+
default: throw new MissingPlatformRuntimeBindingError(`unsupported OpenTray runtime platform: ${platform}`, platform, process.arch);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
const normalizeArch = (arch) => {
|
|
46
|
+
switch (arch) {
|
|
47
|
+
case "arm64":
|
|
48
|
+
case "x64": return arch;
|
|
49
|
+
default: throw new MissingPlatformRuntimeBindingError(`unsupported OpenTray runtime architecture: ${arch}`, process.platform, arch);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
const resolvePackageJsonFromSource = (packageName) => {
|
|
53
|
+
try {
|
|
54
|
+
return requireFromSource.resolve(`${packageName}/package.json`);
|
|
55
|
+
} catch (error) {
|
|
56
|
+
if (isNodeError(error) && error.code === "MODULE_NOT_FOUND") return;
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
const exists = async (path) => {
|
|
61
|
+
try {
|
|
62
|
+
await access(path, constants.F_OK);
|
|
63
|
+
return true;
|
|
64
|
+
} catch {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
const isNodeError = (error) => error instanceof Error && "code" in error;
|
|
69
|
+
var MissingPlatformRuntimeBindingError = class extends Error {
|
|
70
|
+
code = "OPENTRAY_MISSING_PLATFORM_RUNTIME_BINDING";
|
|
71
|
+
platform;
|
|
72
|
+
arch;
|
|
73
|
+
packageName;
|
|
74
|
+
bindingPath;
|
|
75
|
+
constructor(message, platform, arch, options = {}) {
|
|
76
|
+
super(message, options.cause === void 0 ? void 0 : { cause: options.cause });
|
|
77
|
+
this.name = "MissingPlatformRuntimeBindingError";
|
|
78
|
+
this.platform = platform;
|
|
79
|
+
this.arch = arch;
|
|
80
|
+
this.packageName = options.packageName;
|
|
81
|
+
this.bindingPath = options.bindingPath;
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
//#endregion
|
|
85
|
+
//#region src/runtime-binding-transport.ts
|
|
86
|
+
const createRuntimeBindingTransport = async ({ binding, packageVersion = "0.0.0", clientVersion = packageVersion, protocolVersion = PROTOCOL_VERSION, appId, appName, kind = "visible" } = {}) => {
|
|
87
|
+
const resolvedBinding = binding ?? await loadOpenTrayRuntimeBinding();
|
|
88
|
+
const transport = new RuntimeBindingTransport(kind === "headless" ? createHeadlessRuntime(resolvedBinding, packageVersion, appId, appName) : createVisibleRuntime(resolvedBinding));
|
|
89
|
+
await transport.init(clientVersion, protocolVersion);
|
|
90
|
+
return transport;
|
|
91
|
+
};
|
|
92
|
+
const createVisibleRuntime = (binding) => {
|
|
93
|
+
if (binding.createVisibleRuntime === void 0) throw new Error("OpenTray runtime binding does not expose createVisibleRuntime()");
|
|
94
|
+
return binding.createVisibleRuntime();
|
|
95
|
+
};
|
|
96
|
+
const createHeadlessRuntime = (binding, packageVersion, appId, appName) => {
|
|
97
|
+
if (binding.createHeadlessRuntime === void 0) throw new Error("OpenTray runtime binding does not expose createHeadlessRuntime()");
|
|
98
|
+
return binding.createHeadlessRuntime(packageVersion, appId, appName);
|
|
99
|
+
};
|
|
100
|
+
var RuntimeBindingTransport = class {
|
|
101
|
+
listeners = /* @__PURE__ */ new Set();
|
|
102
|
+
runtime;
|
|
103
|
+
pollInterval;
|
|
104
|
+
constructor(runtime) {
|
|
105
|
+
this.runtime = runtime;
|
|
106
|
+
this.pollInterval = runtime.pollEvents === void 0 ? void 0 : setInterval(() => {
|
|
107
|
+
this.pollRuntimeEvents().catch(() => {});
|
|
108
|
+
}, 50);
|
|
109
|
+
this.pollInterval?.unref();
|
|
110
|
+
}
|
|
111
|
+
async init(clientVersion, protocolVersion) {
|
|
112
|
+
if ((await this.invoke({
|
|
113
|
+
type: "init",
|
|
114
|
+
protocolVersion,
|
|
115
|
+
clientVersion
|
|
116
|
+
})).find((frame) => frame.type === "ready") === void 0) throw new Error("OpenTray runtime binding did not return a ready frame");
|
|
117
|
+
}
|
|
118
|
+
async request(frame) {
|
|
119
|
+
const response = (await this.invoke(frame)).find((candidate) => responseRequestId(candidate) === frame.requestId);
|
|
120
|
+
if (response === void 0) throw new Error(`OpenTray runtime binding did not return response for requestId: ${frame.requestId}`);
|
|
121
|
+
return response;
|
|
122
|
+
}
|
|
123
|
+
onEvent(listener) {
|
|
124
|
+
this.listeners.add(listener);
|
|
125
|
+
return () => {
|
|
126
|
+
this.listeners.delete(listener);
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
async close() {
|
|
130
|
+
if (this.pollInterval !== void 0) clearInterval(this.pollInterval);
|
|
131
|
+
const frames = await this.parseFrames(await this.runtime.close());
|
|
132
|
+
this.dispatchEvents(frames);
|
|
133
|
+
}
|
|
134
|
+
async invoke(frame) {
|
|
135
|
+
const frames = await this.parseFrames(await this.runtime.request(JSON.stringify(frame)));
|
|
136
|
+
this.dispatchEvents(frames);
|
|
137
|
+
return frames;
|
|
138
|
+
}
|
|
139
|
+
async parseFrames(frameJson) {
|
|
140
|
+
return (await frameJson).map((raw) => {
|
|
141
|
+
const parsed = parseServerFrame(raw);
|
|
142
|
+
if (!parsed.ok || parsed.frame === void 0) throw new Error(`${parsed.error ?? "invalid server frame"}: ${raw}`);
|
|
143
|
+
return parsed.frame;
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
dispatchEvents(frames) {
|
|
147
|
+
for (const frame of frames) {
|
|
148
|
+
if (frame.type !== "event" && frame.type !== "ext-event") continue;
|
|
149
|
+
for (const listener of this.listeners) listener(frame);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
async pollRuntimeEvents() {
|
|
153
|
+
const pollEvents = this.runtime.pollEvents;
|
|
154
|
+
if (pollEvents === void 0) return;
|
|
155
|
+
const frames = await this.parseFrames(await pollEvents.call(this.runtime));
|
|
156
|
+
this.dispatchEvents(frames);
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
const responseRequestId = (frame) => {
|
|
160
|
+
switch (frame.type) {
|
|
161
|
+
case "app-created":
|
|
162
|
+
case "default-app":
|
|
163
|
+
case "tray-created":
|
|
164
|
+
case "tray-bounds":
|
|
165
|
+
case "ack":
|
|
166
|
+
case "ext-command-result":
|
|
167
|
+
case "runtime-host-health": return frame.requestId;
|
|
168
|
+
case "ready":
|
|
169
|
+
case "event":
|
|
170
|
+
case "ext-event":
|
|
171
|
+
case "error": return;
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
//#endregion
|
|
175
|
+
export { resolveRuntimeNativeTarget as a, resolveInstalledRuntimeBindingPath as i, MissingPlatformRuntimeBindingError as n, loadOpenTrayRuntimeBinding as r, createRuntimeBindingTransport as t };
|
|
176
|
+
|
|
177
|
+
//# sourceMappingURL=runtime-binding-transport-UPunusBT.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-binding-transport-UPunusBT.mjs","names":["binding"],"sources":["../src/native-runtime.ts","../src/runtime-binding-transport.ts"],"sourcesContent":["import { access } from \"node:fs/promises\";\nimport { constants } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\n\nconst requireFromSource = createRequire(import.meta.url);\n\nexport interface OpenTrayRuntimeBindingInfo {\n readonly kind: string;\n readonly protocolVersion: number;\n}\n\nexport interface OpenTrayRuntimeBinding {\n runtimeBindingInfo(): OpenTrayRuntimeBindingInfo;\n runVisibleRuntimeHost?(options?: OpenTrayVisibleRuntimeHostOptions): void;\n createVisibleRuntime?(): OpenTrayVisibleRuntime;\n createHeadlessRuntime?(\n packageVersion?: string,\n appId?: string,\n appName?: string\n ): OpenTrayHeadlessRuntime;\n}\n\nexport interface OpenTrayVisibleRuntimeHostOptions {\n readonly packageVersion?: string;\n readonly appId?: string;\n readonly appName?: string;\n readonly autoExitAfterMs?: number;\n}\n\nexport interface OpenTrayRuntimeHost {\n request(frameJson: string): string[] | Promise<string[]>;\n close(): string[] | Promise<string[]>;\n}\n\nexport interface OpenTrayVisibleRuntime extends OpenTrayRuntimeHost {\n pollEvents(): string[] | Promise<string[]>;\n}\n\nexport type OpenTrayHeadlessRuntime = OpenTrayRuntimeHost;\n\nexport interface RuntimeNativeTarget {\n readonly packageName: string;\n readonly bindingRelativePath: string;\n}\n\nexport interface ResolveRuntimeBindingOptions {\n readonly platform?: string;\n readonly arch?: string;\n readonly resolvePackageJson?: (packageName: string) => string | undefined;\n readonly nativeLoader?: (bindingPath: string) => unknown;\n}\n\nexport const runtimeBindingRelativePath = \"runtime/opentray_runtime.node\";\n\nexport const resolveRuntimeNativeTarget = (\n platform: string = process.platform,\n arch: string = process.arch\n): RuntimeNativeTarget => {\n const packageOs = platformToPackageOs(platform);\n const nativeArch = normalizeArch(arch);\n return {\n packageName: `@opentray/${packageOs}-${nativeArch}`,\n bindingRelativePath: runtimeBindingRelativePath,\n };\n};\n\nexport const resolveInstalledRuntimeBindingPath = async ({\n platform = process.platform,\n arch = process.arch,\n resolvePackageJson = resolvePackageJsonFromSource,\n}: ResolveRuntimeBindingOptions = {}): Promise<string> => {\n const target = resolveRuntimeNativeTarget(platform, arch);\n const packageJsonPath = resolvePackageJson(target.packageName);\n if (packageJsonPath === undefined) {\n throw new MissingPlatformRuntimeBindingError(\n `unable to resolve OpenTray runtime binding for ${platform}/${arch}; install ${target.packageName}`,\n platform,\n arch,\n { packageName: target.packageName }\n );\n }\n\n const bindingPath = join(\n dirname(packageJsonPath),\n target.bindingRelativePath\n );\n if (!(await exists(bindingPath))) {\n throw new MissingPlatformRuntimeBindingError(\n `OpenTray runtime package ${target.packageName} is installed but missing ${target.bindingRelativePath}`,\n platform,\n arch,\n {\n packageName: target.packageName,\n bindingPath,\n }\n );\n }\n return bindingPath;\n};\n\nexport const loadOpenTrayRuntimeBinding = async (\n options: ResolveRuntimeBindingOptions = {}\n): Promise<OpenTrayRuntimeBinding> => {\n const bindingPath = await resolveInstalledRuntimeBindingPath(options);\n const loaded = (options.nativeLoader ?? loadNativeModule)(bindingPath);\n if (!isRuntimeBinding(loaded)) {\n throw new MissingPlatformRuntimeBindingError(\n `OpenTray runtime binding ${bindingPath} does not expose runtimeBindingInfo()`,\n options.platform ?? process.platform,\n options.arch ?? process.arch,\n { bindingPath }\n );\n }\n return loaded;\n};\n\nconst loadNativeModule = (bindingPath: string): unknown =>\n requireFromSource(bindingPath);\n\nconst isRuntimeBinding = (value: unknown): value is OpenTrayRuntimeBinding => {\n if (\n typeof value !== \"object\" ||\n value === null ||\n !(\"runtimeBindingInfo\" in value)\n ) {\n return false;\n }\n const binding = value as { runtimeBindingInfo?: unknown };\n return typeof binding.runtimeBindingInfo === \"function\";\n};\n\nconst platformToPackageOs = (\n platform: string\n): \"darwin\" | \"linux\" | \"windows\" => {\n switch (platform) {\n case \"darwin\":\n case \"linux\":\n return platform;\n case \"win32\":\n return \"windows\";\n default:\n throw new MissingPlatformRuntimeBindingError(\n `unsupported OpenTray runtime platform: ${platform}`,\n platform,\n process.arch\n );\n }\n};\n\nconst normalizeArch = (arch: string): \"arm64\" | \"x64\" => {\n switch (arch) {\n case \"arm64\":\n case \"x64\":\n return arch;\n default:\n throw new MissingPlatformRuntimeBindingError(\n `unsupported OpenTray runtime architecture: ${arch}`,\n process.platform,\n arch\n );\n }\n};\n\nconst resolvePackageJsonFromSource = (\n packageName: string\n): string | undefined => {\n try {\n return requireFromSource.resolve(`${packageName}/package.json`);\n } catch (error) {\n if (isNodeError(error) && error.code === \"MODULE_NOT_FOUND\") {\n return undefined;\n }\n throw error;\n }\n};\n\nconst exists = async (path: string): Promise<boolean> => {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n};\n\nconst isNodeError = (error: unknown): error is NodeJS.ErrnoException =>\n error instanceof Error && \"code\" in error;\n\nexport class MissingPlatformRuntimeBindingError extends Error {\n readonly code = \"OPENTRAY_MISSING_PLATFORM_RUNTIME_BINDING\";\n readonly platform: string;\n readonly arch: string;\n readonly packageName: string | undefined;\n readonly bindingPath: string | undefined;\n\n constructor(\n message: string,\n platform: string,\n arch: string,\n options: {\n readonly packageName?: string;\n readonly bindingPath?: string;\n readonly cause?: unknown;\n } = {}\n ) {\n super(\n message,\n options.cause === undefined ? undefined : { cause: options.cause }\n );\n this.name = \"MissingPlatformRuntimeBindingError\";\n this.platform = platform;\n this.arch = arch;\n this.packageName = options.packageName;\n this.bindingPath = options.bindingPath;\n }\n}\n","import {\n PROTOCOL_VERSION,\n parseServerFrame,\n type ClientRequestFrame,\n type RequestId,\n type ServerFrame,\n} from \"@opentray/spec\";\n\nimport type { OpenTrayConnection, OpenTrayEventFrame } from \"./client\";\nimport {\n loadOpenTrayRuntimeBinding,\n type OpenTrayRuntimeHost,\n type OpenTrayRuntimeBinding,\n type OpenTrayVisibleRuntime,\n} from \"./native-runtime\";\n\nexport type RuntimeBindingTransportKind = \"visible\" | \"headless\";\n\nexport interface CreateRuntimeBindingTransportOptions {\n readonly kind?: RuntimeBindingTransportKind;\n readonly binding?: OpenTrayRuntimeBinding;\n readonly packageVersion?: string;\n readonly clientVersion?: string;\n readonly protocolVersion?: number;\n readonly appId?: string;\n readonly appName?: string;\n}\n\nexport const createRuntimeBindingTransport = async ({\n binding,\n packageVersion = \"0.0.0\",\n clientVersion = packageVersion,\n protocolVersion = PROTOCOL_VERSION,\n appId,\n appName,\n kind = \"visible\",\n}: CreateRuntimeBindingTransportOptions = {}): Promise<OpenTrayConnection> => {\n const resolvedBinding = binding ?? (await loadOpenTrayRuntimeBinding());\n const runtime =\n kind === \"headless\"\n ? createHeadlessRuntime(resolvedBinding, packageVersion, appId, appName)\n : createVisibleRuntime(resolvedBinding);\n const transport = new RuntimeBindingTransport(runtime);\n await transport.init(clientVersion, protocolVersion);\n return transport;\n};\n\nconst createVisibleRuntime = (\n binding: OpenTrayRuntimeBinding\n): OpenTrayVisibleRuntime => {\n if (binding.createVisibleRuntime === undefined) {\n throw new Error(\n \"OpenTray runtime binding does not expose createVisibleRuntime()\"\n );\n }\n return binding.createVisibleRuntime();\n};\n\nconst createHeadlessRuntime = (\n binding: OpenTrayRuntimeBinding,\n packageVersion: string,\n appId: string | undefined,\n appName: string | undefined\n): OpenTrayRuntimeHost => {\n if (binding.createHeadlessRuntime === undefined) {\n throw new Error(\n \"OpenTray runtime binding does not expose createHeadlessRuntime()\"\n );\n }\n return binding.createHeadlessRuntime(packageVersion, appId, appName);\n};\n\ntype RuntimeFrameInvoker = (frameJson: string) => string[] | Promise<string[]>;\n\ninterface RuntimeBindingHost extends OpenTrayRuntimeHost {\n request: RuntimeFrameInvoker;\n pollEvents?(): string[] | Promise<string[]>;\n}\n\nclass RuntimeBindingTransport implements OpenTrayConnection {\n private readonly listeners = new Set<(frame: OpenTrayEventFrame) => void>();\n private readonly runtime: RuntimeBindingHost;\n private readonly pollInterval: NodeJS.Timeout | undefined;\n\n constructor(runtime: RuntimeBindingHost) {\n this.runtime = runtime;\n this.pollInterval =\n runtime.pollEvents === undefined\n ? undefined\n : setInterval(() => {\n void this.pollRuntimeEvents().catch(() => {\n // Polling is an event ingress path. Request and close failures still surface to callers.\n });\n }, 50);\n this.pollInterval?.unref();\n }\n\n async init(clientVersion: string, protocolVersion: number): Promise<void> {\n const frames = await this.invoke({\n type: \"init\",\n protocolVersion,\n clientVersion,\n });\n const ready = frames.find(\n (frame): frame is Extract<ServerFrame, { type: \"ready\" }> =>\n frame.type === \"ready\"\n );\n if (ready === undefined) {\n throw new Error(\"OpenTray runtime binding did not return a ready frame\");\n }\n }\n\n async request(frame: ClientRequestFrame): Promise<ServerFrame> {\n const frames = await this.invoke(frame);\n const response = frames.find(\n (candidate) => responseRequestId(candidate) === frame.requestId\n );\n if (response === undefined) {\n throw new Error(\n `OpenTray runtime binding did not return response for requestId: ${frame.requestId}`\n );\n }\n return response;\n }\n\n onEvent(listener: (frame: OpenTrayEventFrame) => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n async close(): Promise<void> {\n if (this.pollInterval !== undefined) {\n clearInterval(this.pollInterval);\n }\n const frames = await this.parseFrames(await this.runtime.close());\n this.dispatchEvents(frames);\n }\n\n private async invoke(frame: object): Promise<ServerFrame[]> {\n const frames = await this.parseFrames(\n await this.runtime.request(JSON.stringify(frame))\n );\n this.dispatchEvents(frames);\n return frames;\n }\n\n private async parseFrames(\n frameJson: string[] | Promise<string[]>\n ): Promise<ServerFrame[]> {\n const rawFrames = await frameJson;\n return rawFrames.map((raw) => {\n const parsed = parseServerFrame(raw);\n if (!parsed.ok || parsed.frame === undefined) {\n throw new Error(`${parsed.error ?? \"invalid server frame\"}: ${raw}`);\n }\n return parsed.frame;\n });\n }\n\n private dispatchEvents(frames: readonly ServerFrame[]): void {\n for (const frame of frames) {\n if (frame.type !== \"event\" && frame.type !== \"ext-event\") {\n continue;\n }\n for (const listener of this.listeners) {\n listener(frame);\n }\n }\n }\n\n private async pollRuntimeEvents(): Promise<void> {\n const pollEvents = this.runtime.pollEvents;\n if (pollEvents === undefined) {\n return;\n }\n const frames = await this.parseFrames(await pollEvents.call(this.runtime));\n this.dispatchEvents(frames);\n }\n}\n\nconst responseRequestId = (frame: ServerFrame): RequestId | undefined => {\n switch (frame.type) {\n case \"app-created\":\n case \"default-app\":\n case \"tray-created\":\n case \"tray-bounds\":\n case \"ack\":\n case \"ext-command-result\":\n case \"runtime-host-health\":\n return frame.requestId;\n case \"ready\":\n case \"event\":\n case \"ext-event\":\n case \"error\":\n return undefined;\n }\n};\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "opentray",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.1",
|
|
4
4
|
"description": "Developer-facing OpenTray SDK and CLI package.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
],
|
|
29
29
|
"sideEffects": false,
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@opentray/spec": "0.
|
|
31
|
+
"@opentray/spec": "0.6.0"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
34
|
"tsdown": "^0.22.1",
|
|
@@ -36,19 +36,21 @@
|
|
|
36
36
|
"vitest": "^4.1.7"
|
|
37
37
|
},
|
|
38
38
|
"optionalDependencies": {
|
|
39
|
-
"@opentray/darwin-arm64": "0.
|
|
40
|
-
"@opentray/darwin-x64": "0.
|
|
41
|
-
"@opentray/linux-arm64": "0.
|
|
42
|
-
"@opentray/linux-x64": "0.
|
|
43
|
-
"@opentray/windows-arm64": "0.
|
|
44
|
-
"@opentray/windows-x64": "0.
|
|
39
|
+
"@opentray/darwin-arm64": "0.8.1",
|
|
40
|
+
"@opentray/darwin-x64": "0.8.1",
|
|
41
|
+
"@opentray/linux-arm64": "0.8.1",
|
|
42
|
+
"@opentray/linux-x64": "0.8.1",
|
|
43
|
+
"@opentray/windows-arm64": "0.8.1",
|
|
44
|
+
"@opentray/windows-x64": "0.8.1"
|
|
45
45
|
},
|
|
46
46
|
"scripts": {
|
|
47
47
|
"build": "tsdown src/index.ts src/node.ts src/cli.ts --format esm --dts",
|
|
48
48
|
"cli": "bun run src/cli.ts",
|
|
49
|
-
"example:
|
|
50
|
-
"example:
|
|
51
|
-
"example:
|
|
49
|
+
"example:matrix": "bun run examples/example-matrix.ts",
|
|
50
|
+
"example:basic": "bun run examples/basic-tray.ts",
|
|
51
|
+
"example:debug-runtime-lynx": "bun run examples/debug-runtime-lynx.ts",
|
|
52
|
+
"example:debug-runtime-tray": "bun run examples/debug-runtime-tray.ts",
|
|
53
|
+
"example:visible-binding": "node examples/visible-binding-host.mjs",
|
|
52
54
|
"example:mediaQuery": "bun run examples/media-query-panel.ts",
|
|
53
55
|
"example:badge": "bun run examples/badge-panel.ts",
|
|
54
56
|
"example:placement": "bun run examples/placement-panel.ts",
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
import { ClientFrame, ClientRequestFrame, ExtensionEnvelope, Icon, Menu, RequestId, ServerFrame, SpaceOptions, SpaceRef, Tooltip, TrayBoundsResult, TrayEvent, TrayId, TrayOptions } from "@opentray/spec";
|
|
2
|
-
|
|
3
|
-
//#region src/client.d.ts
|
|
4
|
-
interface OpenTrayTransport {
|
|
5
|
-
request(frame: ClientRequestFrame): Promise<ServerFrame>;
|
|
6
|
-
}
|
|
7
|
-
type BrokerEventFrame = Extract<ServerFrame, {
|
|
8
|
-
type: "event" | "ext-event";
|
|
9
|
-
}>;
|
|
10
|
-
interface OpenTrayEventSource {
|
|
11
|
-
onEvent(listener: (frame: BrokerEventFrame) => void): () => void;
|
|
12
|
-
}
|
|
13
|
-
interface OpenTrayConnection extends OpenTrayTransport, OpenTrayEventSource {}
|
|
14
|
-
interface OpenTrayClient {
|
|
15
|
-
createSpace(options: SpaceOptions): Promise<SpaceHandle>;
|
|
16
|
-
resolveDefaultSpace(): Promise<SpaceHandle>;
|
|
17
|
-
/** @deprecated Use `createSpace`. */
|
|
18
|
-
createSurface(options: SpaceOptions): Promise<SpaceHandle>;
|
|
19
|
-
}
|
|
20
|
-
interface SpaceHandle {
|
|
21
|
-
space: SpaceRef;
|
|
22
|
-
createTray(options: TrayOptions): Promise<TrayHandle>;
|
|
23
|
-
}
|
|
24
|
-
interface EventfulSpaceHandle extends Omit<SpaceHandle, "createTray"> {
|
|
25
|
-
createTray(options: TrayOptions): Promise<EventfulTrayHandle>;
|
|
26
|
-
}
|
|
27
|
-
/** @deprecated Use `SpaceHandle`. */
|
|
28
|
-
type SurfaceHandle = SpaceHandle;
|
|
29
|
-
interface TrayHandle {
|
|
30
|
-
space: SpaceRef;
|
|
31
|
-
trayId: TrayId;
|
|
32
|
-
getBounds(): Promise<TrayBoundsResult>;
|
|
33
|
-
setMenu(menu: Menu): Promise<void>;
|
|
34
|
-
setTooltip(tooltip: Tooltip): Promise<void>;
|
|
35
|
-
setIcon(icon: Icon): Promise<void>;
|
|
36
|
-
setTitle(title: string): Promise<void>;
|
|
37
|
-
loadExtension(options: ExtensionLoadOptions): Promise<void>;
|
|
38
|
-
commandExtension(ext: string, data: unknown): Promise<void>;
|
|
39
|
-
requestExtension(ext: string, data: unknown): Promise<ExtensionEnvelope[]>;
|
|
40
|
-
extend<TCapability extends object, TOptions = undefined>(extension: TrayExtension<TCapability, TOptions>, options?: TOptions): TrayHandle & TCapability;
|
|
41
|
-
destroy(): Promise<void>;
|
|
42
|
-
}
|
|
43
|
-
type TrayScopedEvent = Exclude<TrayEvent, {
|
|
44
|
-
type: "ready";
|
|
45
|
-
}>;
|
|
46
|
-
type TrayEventType = TrayScopedEvent["type"];
|
|
47
|
-
type TrayEventByType<TEvent extends TrayEventType> = Extract<TrayScopedEvent, {
|
|
48
|
-
type: TEvent;
|
|
49
|
-
}>;
|
|
50
|
-
interface EventfulTrayHandle extends TrayHandle {
|
|
51
|
-
extend<TCapability extends object, TOptions = undefined>(extension: TrayExtension<TCapability, TOptions>, options?: TOptions): EventfulTrayHandle & TCapability;
|
|
52
|
-
listenExtension<TData = unknown>(ext: string, handler: (event: ExtensionEnvelope<TData>) => void): () => void;
|
|
53
|
-
listen<TEvent extends TrayEventType>(event: TEvent, handler: (event: TrayEventByType<TEvent>) => void): () => void;
|
|
54
|
-
onMenuClick(handler: (event: TrayEventByType<"menuClick">) => void): () => void;
|
|
55
|
-
onTrayClick(handler: (event: TrayEventByType<"trayClick">) => void): () => void;
|
|
56
|
-
onTrayDoubleClick(handler: (event: TrayEventByType<"trayDoubleClick">) => void): () => void;
|
|
57
|
-
}
|
|
58
|
-
interface ExtensionLoadOptions {
|
|
59
|
-
name: string;
|
|
60
|
-
path: string;
|
|
61
|
-
mountId?: string;
|
|
62
|
-
}
|
|
63
|
-
interface TrayExtensionMountSpec {
|
|
64
|
-
name?: string;
|
|
65
|
-
path?: string;
|
|
66
|
-
mountId?: string;
|
|
67
|
-
}
|
|
68
|
-
interface TrayExtensionContext {
|
|
69
|
-
readonly name: string;
|
|
70
|
-
readonly path: string;
|
|
71
|
-
readonly mountId: string;
|
|
72
|
-
ensureLoaded(): Promise<void>;
|
|
73
|
-
command(data: unknown): Promise<void>;
|
|
74
|
-
request(data: unknown): Promise<ExtensionEnvelope[]>;
|
|
75
|
-
}
|
|
76
|
-
interface TrayExtension<TCapability extends object, TOptions = undefined> {
|
|
77
|
-
readonly name: string;
|
|
78
|
-
readonly path: string;
|
|
79
|
-
resolveMount?(options: TOptions | undefined): TrayExtensionMountSpec;
|
|
80
|
-
extend(tray: TrayHandle, context: TrayExtensionContext, options: TOptions | undefined): TCapability;
|
|
81
|
-
}
|
|
82
|
-
declare const createInitFrame: (clientVersion: string) => ClientFrame;
|
|
83
|
-
interface CreateClientOptions {
|
|
84
|
-
requestIdPrefix?: string;
|
|
85
|
-
}
|
|
86
|
-
interface OpenTrayEventfulClient extends Omit<OpenTrayClient, "createSpace" | "resolveDefaultSpace" | "createSurface"> {
|
|
87
|
-
createSpace(options: SpaceOptions): Promise<EventfulSpaceHandle>;
|
|
88
|
-
resolveDefaultSpace(): Promise<EventfulSpaceHandle>;
|
|
89
|
-
/** @deprecated Use `createSpace`. */
|
|
90
|
-
createSurface(options: SpaceOptions): Promise<EventfulSpaceHandle>;
|
|
91
|
-
}
|
|
92
|
-
declare function createClient(transport: OpenTrayConnection, options?: CreateClientOptions): OpenTrayEventfulClient;
|
|
93
|
-
declare function createClient(transport: OpenTrayTransport, options?: CreateClientOptions): OpenTrayClient;
|
|
94
|
-
declare function createSpaceHandle(transport: OpenTrayConnection, space: SpaceRef, nextRequestId?: () => RequestId): EventfulSpaceHandle;
|
|
95
|
-
declare function createSpaceHandle(transport: OpenTrayTransport, space: SpaceRef, nextRequestId?: () => RequestId): SpaceHandle;
|
|
96
|
-
/** @deprecated Use `createSpaceHandle`. */
|
|
97
|
-
declare const createSurfaceHandle: typeof createSpaceHandle;
|
|
98
|
-
declare function createTrayHandle(transport: OpenTrayConnection, space: SpaceRef, trayId: TrayId, nextRequestId?: () => RequestId): EventfulTrayHandle;
|
|
99
|
-
declare function createTrayHandle(transport: OpenTrayTransport, space: SpaceRef, trayId: TrayId, nextRequestId?: () => RequestId): TrayHandle;
|
|
100
|
-
//#endregion
|
|
101
|
-
export { createTrayHandle as C, createSurfaceHandle as S, TrayExtensionMountSpec as _, ExtensionLoadOptions as a, createInitFrame as b, OpenTrayEventSource as c, SpaceHandle as d, SurfaceHandle as f, TrayExtensionContext as g, TrayExtension as h, EventfulTrayHandle as i, OpenTrayEventfulClient as l, TrayEventType as m, CreateClientOptions as n, OpenTrayClient as o, TrayEventByType as p, EventfulSpaceHandle as r, OpenTrayConnection as s, BrokerEventFrame as t, OpenTrayTransport as u, TrayHandle as v, createSpaceHandle as x, createClient as y };
|
|
102
|
-
//# sourceMappingURL=client-C27qmRfr.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client-C27qmRfr.d.mts","names":[],"sources":["../src/client.ts"],"mappings":"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"}
|