@open-pets/client 0.1.0 → 2.0.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 OpenPets
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=check-client-protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-client-protocol.d.ts","sourceRoot":"","sources":["../src/check-client-protocol.ts"],"names":[],"mappings":""}
@@ -0,0 +1,41 @@
1
+ import assert from "node:assert/strict";
2
+ import { validateDiscovery } from "./discovery.js";
3
+ import { parsePetListResult } from "./index.js";
4
+ import { OpenPetsClientError, parseIpcResponse, validateReaction } from "./protocol.js";
5
+ const baseDiscovery = {
6
+ protocolVersion: 1,
7
+ protocol: "openpets-ipc",
8
+ endpoint: process.platform === "win32" ? "\\\\.\\pipe\\openpets-abc-123" : "/tmp/openpets-501/openpets-123.sock",
9
+ token: "x".repeat(32),
10
+ appVersion: "0.0.0",
11
+ pid: 123,
12
+ platform: process.platform,
13
+ };
14
+ validateDiscovery(baseDiscovery);
15
+ assertRejects(() => validateDiscovery({ ...baseDiscovery, protocol: "http" }));
16
+ assertRejects(() => validateDiscovery({ ...baseDiscovery, protocolVersion: 2 }));
17
+ assertRejects(() => validateDiscovery({ ...baseDiscovery, endpoint: "127.0.0.1:1234" }));
18
+ assertRejects(() => validateDiscovery({ ...baseDiscovery, platform: "freebsd" }));
19
+ assertRejects(() => validateReaction("bad"));
20
+ assert.equal(validateReaction("waving"), "waving");
21
+ const ok = parseIpcResponse({ id: "1", ok: true, result: { value: 1 } });
22
+ if (!ok.ok || ok.result.value !== 1)
23
+ throw new Error("Failed to parse ok response.");
24
+ const err = parseIpcResponse({ id: "1", ok: false, error: { code: "invalid_token", message: "Invalid" } });
25
+ if (err.ok || err.error.code !== "invalid_token")
26
+ throw new Error("Failed to parse error response.");
27
+ assertRejects(() => parseIpcResponse({ ok: true }));
28
+ assert.deepEqual(parsePetListResult({ ok: true, defaultPetId: "builtin", pets: [{ id: "fixer", displayName: "Fixer", builtIn: false, broken: false }] }), { ok: true, defaultPetId: "builtin", pets: [{ id: "fixer", displayName: "Fixer", builtIn: false, broken: false }] });
29
+ assertRejects(() => parsePetListResult({ ok: true, pets: [{ id: "fixer" }], defaultPetId: "builtin" }));
30
+ console.log("Client protocol validation passed.");
31
+ function assertRejects(callback) {
32
+ try {
33
+ callback();
34
+ }
35
+ catch (error) {
36
+ if (error instanceof OpenPetsClientError || error instanceof Error)
37
+ return;
38
+ }
39
+ throw new Error("Expected validation to reject.");
40
+ }
41
+ //# sourceMappingURL=check-client-protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-client-protocol.js","sourceRoot":"","sources":["../src/check-client-protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface OpenPetsDiscoveryFile {
2
+ readonly protocolVersion: 1;
3
+ readonly protocol: "openpets-ipc";
4
+ readonly endpoint: string;
5
+ readonly token: string;
6
+ readonly appVersion: string;
7
+ readonly pid: number;
8
+ readonly platform: NodeJS.Platform;
9
+ }
10
+ export declare function getDiscoveryFilePath(): string;
11
+ export declare function readDiscoveryFile(path?: string): OpenPetsDiscoveryFile;
12
+ export declare function validateDiscovery(value: unknown): OpenPetsDiscoveryFile;
13
+ export declare function validateEndpoint(endpoint: string): void;
14
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,eAAe,EAAE,CAAC,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;CACpC;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAmB7C;AAED,wBAAgB,iBAAiB,CAAC,IAAI,SAAyB,GAAG,qBAAqB,CAsBtF;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,qBAAqB,CAqBvE;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CA0BvD"}
@@ -0,0 +1,119 @@
1
+ import { existsSync, lstatSync, readFileSync, statSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { basename, dirname, join } from "node:path";
4
+ import { isRecord, maxIpcMessageBytes, openPetsIpcProtocol, openPetsIpcVersion, OpenPetsClientError } from "./protocol.js";
5
+ export function getDiscoveryFilePath() {
6
+ if (process.env.OPENPETS_DISCOVERY_FILE) {
7
+ return process.env.OPENPETS_DISCOVERY_FILE;
8
+ }
9
+ if (process.platform === "darwin") {
10
+ return join(homedir(), "Library", "Application Support", "OpenPets", "runtime", "ipc.json");
11
+ }
12
+ if (process.platform === "win32") {
13
+ return join(process.env.APPDATA ?? join(homedir(), "AppData", "Roaming"), "OpenPets", "runtime", "ipc.json");
14
+ }
15
+ const xdg = getSecureXdgRuntimeDir();
16
+ if (xdg) {
17
+ return join(xdg, "openpets", "ipc.json");
18
+ }
19
+ return join(process.env.XDG_CONFIG_HOME ?? join(homedir(), ".config"), "OpenPets", "runtime", "ipc.json");
20
+ }
21
+ export function readDiscoveryFile(path = getDiscoveryFilePath()) {
22
+ let raw;
23
+ try {
24
+ const stat = statSync(path);
25
+ if (!stat.isFile())
26
+ throw new OpenPetsClientError("invalid_discovery", "OpenPets discovery path is not a file.");
27
+ if (stat.size > maxIpcMessageBytes)
28
+ throw new OpenPetsClientError("invalid_discovery", "OpenPets discovery file is too large.");
29
+ raw = readFileSync(path, "utf8");
30
+ }
31
+ catch (error) {
32
+ if (error instanceof OpenPetsClientError)
33
+ throw error;
34
+ throw new OpenPetsClientError("unavailable", `OpenPets discovery file is unavailable: ${error instanceof Error ? error.message : "unknown error"}`);
35
+ }
36
+ if (Buffer.byteLength(raw, "utf8") > maxIpcMessageBytes) {
37
+ throw new OpenPetsClientError("invalid_discovery", "OpenPets discovery file is too large.");
38
+ }
39
+ try {
40
+ return validateDiscovery(JSON.parse(raw));
41
+ }
42
+ catch (error) {
43
+ if (error instanceof OpenPetsClientError)
44
+ throw error;
45
+ throw new OpenPetsClientError("invalid_discovery", "OpenPets discovery file is malformed JSON.");
46
+ }
47
+ }
48
+ export function validateDiscovery(value) {
49
+ if (!isRecord(value))
50
+ throw new OpenPetsClientError("invalid_discovery", "Discovery must be an object.");
51
+ if (value.protocol !== openPetsIpcProtocol)
52
+ throw new OpenPetsClientError("invalid_discovery", "Discovery protocol is invalid.");
53
+ if (value.protocolVersion !== openPetsIpcVersion)
54
+ throw new OpenPetsClientError("invalid_discovery", "Discovery protocol version is invalid.");
55
+ if (value.platform !== process.platform)
56
+ throw new OpenPetsClientError("invalid_discovery", "Discovery platform does not match this client.");
57
+ if (typeof value.endpoint !== "string")
58
+ throw new OpenPetsClientError("invalid_discovery", "Discovery endpoint is invalid.");
59
+ if (typeof value.token !== "string" || value.token.length < 16 || value.token.length > 256)
60
+ throw new OpenPetsClientError("invalid_discovery", "Discovery token is invalid.");
61
+ if (typeof value.appVersion !== "string")
62
+ throw new OpenPetsClientError("invalid_discovery", "Discovery app version is invalid.");
63
+ if (typeof value.pid !== "number" || !Number.isInteger(value.pid) || value.pid <= 0)
64
+ throw new OpenPetsClientError("invalid_discovery", "Discovery pid is invalid.");
65
+ validateEndpoint(value.endpoint);
66
+ return {
67
+ protocolVersion: openPetsIpcVersion,
68
+ protocol: openPetsIpcProtocol,
69
+ endpoint: value.endpoint,
70
+ token: value.token,
71
+ appVersion: value.appVersion,
72
+ pid: value.pid,
73
+ platform: value.platform,
74
+ };
75
+ }
76
+ export function validateEndpoint(endpoint) {
77
+ if (endpoint.length < 1 || endpoint.length > 240)
78
+ throw new OpenPetsClientError("invalid_discovery", "Discovery endpoint length is invalid.");
79
+ if (endpoint.includes("\0"))
80
+ throw new OpenPetsClientError("invalid_discovery", "Discovery endpoint contains NUL.");
81
+ if (process.platform === "win32") {
82
+ if (!endpoint.startsWith("\\\\.\\pipe\\openpets-") || endpoint.includes("/")) {
83
+ throw new OpenPetsClientError("invalid_discovery", "Discovery endpoint is not an OpenPets named pipe.");
84
+ }
85
+ return;
86
+ }
87
+ if (!endpoint.startsWith("/") || endpoint.includes("://") || endpoint.includes("..")) {
88
+ throw new OpenPetsClientError("invalid_discovery", "Discovery endpoint is not an absolute Unix socket path.");
89
+ }
90
+ if (!basename(endpoint).startsWith("openpets-") || !basename(endpoint).endsWith(".sock")) {
91
+ throw new OpenPetsClientError("invalid_discovery", "Discovery endpoint filename is not an OpenPets socket.");
92
+ }
93
+ const parent = dirname(endpoint);
94
+ const parentName = basename(parent);
95
+ const isTmpRuntime = parent.startsWith("/tmp/") && parentName.startsWith("openpets-");
96
+ const isXdgRuntime = parentName === "openpets";
97
+ if (!isTmpRuntime && !isXdgRuntime) {
98
+ throw new OpenPetsClientError("invalid_discovery", "Discovery endpoint is outside an expected OpenPets runtime directory.");
99
+ }
100
+ }
101
+ function getSecureXdgRuntimeDir() {
102
+ const dir = process.env.XDG_RUNTIME_DIR;
103
+ if (!dir || !existsSync(dir))
104
+ return null;
105
+ try {
106
+ const stat = lstatSync(dir);
107
+ if (!stat.isDirectory() || stat.isSymbolicLink())
108
+ return null;
109
+ if (typeof process.getuid === "function" && stat.uid !== process.getuid())
110
+ return null;
111
+ if ((stat.mode & 0o777) !== 0o700)
112
+ return null;
113
+ return dir;
114
+ }
115
+ catch {
116
+ return null;
117
+ }
118
+ }
119
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,9 +1,65 @@
1
- export type { OpenPetsClient, OpenPetsClientOptions, OpenPetsHealth, OpenPetsLeaseInput, OpenPetsSafeResult, } from "./client.js";
2
- export { createOpenPetsClient, getHealth, isOpenPetsRunning, leaseAcquire, leaseHeartbeat, leaseRelease, safeSendEvent, sendEvent, windowAction, } from "./client.js";
3
- export type { OpenPetsEventInput } from "./event-input.js";
4
- export { OpenPetsClientError } from "./errors.js";
5
- export type { OpenPetsClientErrorCode } from "./errors.js";
6
- export type { LeaseResult, OpenPetsEvent, OpenPetsLeaseClient, OpenPetsState } from "@open-pets/core";
7
- export type { OpenPetsWindowAction } from "@open-pets/core/ipc";
8
- export { createManualEvent, isOpenPetsState, validateOpenPetsEvent } from "@open-pets/core";
1
+ import { type OpenPetsDiscoveryFile } from "./discovery.js";
2
+ import { type OpenPetsIpcMethod, type OpenPetsReaction } from "./protocol.js";
3
+ export { getDiscoveryFilePath, readDiscoveryFile, validateDiscovery, validateEndpoint, type OpenPetsDiscoveryFile } from "./discovery.js";
4
+ export { allowedReactions, OpenPetsClientError, type OpenPetsReaction } from "./protocol.js";
5
+ export interface OpenPetsClientOptions {
6
+ readonly discoveryPath?: string;
7
+ readonly connectTimeoutMs?: number;
8
+ readonly responseTimeoutMs?: number;
9
+ }
10
+ export interface OpenPetsStatusResult {
11
+ readonly ok: boolean;
12
+ readonly appRunning: boolean;
13
+ readonly unavailableReason?: string;
14
+ readonly [key: string]: unknown;
15
+ }
16
+ export interface OpenPetsLeaseResult {
17
+ readonly leaseId: string;
18
+ readonly requestedPetId?: string;
19
+ readonly targetKind: "default" | "explicit";
20
+ readonly actualTargetPetId: string;
21
+ readonly actualTargetPetName: string;
22
+ readonly usingDefaultPet: boolean;
23
+ readonly fallbackReason?: string;
24
+ readonly expiresAt: number;
25
+ readonly leaseActive: boolean;
26
+ }
27
+ export interface OpenPetsPetListResult {
28
+ readonly ok: true;
29
+ readonly pets: readonly OpenPetsPetListItem[];
30
+ readonly defaultPetId: string;
31
+ }
32
+ export interface OpenPetsPetListItem {
33
+ readonly id: string;
34
+ readonly displayName: string;
35
+ readonly builtIn: boolean;
36
+ readonly broken: boolean;
37
+ }
38
+ export interface OpenPetsClient {
39
+ hello(): Promise<unknown>;
40
+ status(options?: {
41
+ readonly leaseId?: string;
42
+ }): Promise<OpenPetsStatusResult>;
43
+ listPets(): Promise<OpenPetsPetListResult>;
44
+ acquireLease(options?: {
45
+ readonly requestedPetId?: string;
46
+ }): Promise<OpenPetsLeaseResult>;
47
+ heartbeatLease(leaseId: string): Promise<{
48
+ readonly leaseId: string;
49
+ readonly expiresAt: number;
50
+ }>;
51
+ releaseLease(leaseId: string): Promise<{
52
+ readonly released: boolean;
53
+ }>;
54
+ react(reaction: OpenPetsReaction, options?: {
55
+ readonly leaseId?: string;
56
+ }): Promise<unknown>;
57
+ say(message: string, options?: {
58
+ readonly reaction?: OpenPetsReaction;
59
+ readonly leaseId?: string;
60
+ }): Promise<unknown>;
61
+ }
62
+ export declare function createOpenPetsClient(options?: OpenPetsClientOptions): OpenPetsClient;
63
+ export declare function parsePetListResult(value: unknown): OpenPetsPetListResult;
64
+ export declare function sendRequest<T>(discovery: OpenPetsDiscoveryFile, method: OpenPetsIpcMethod, params: unknown, options?: OpenPetsClientOptions): Promise<T>;
9
65
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,cAAc,EACd,qBAAqB,EACrB,cAAc,EACd,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,oBAAoB,EACpB,SAAS,EACT,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,aAAa,EACb,SAAS,EACT,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,YAAY,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACtG,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,4 +1,115 @@
1
- export { createOpenPetsClient, getHealth, isOpenPetsRunning, leaseAcquire, leaseHeartbeat, leaseRelease, safeSendEvent, sendEvent, windowAction, } from "./client.js";
2
- export { OpenPetsClientError } from "./errors.js";
3
- export { createManualEvent, isOpenPetsState, validateOpenPetsEvent } from "@open-pets/core";
1
+ import net from "node:net";
2
+ import { randomUUID } from "node:crypto";
3
+ import { readDiscoveryFile } from "./discovery.js";
4
+ import { connectTimeoutMs, maxIpcMessageBytes, openPetsIpcVersion, parseIpcResponse, responseTimeoutMs, validateReaction, OpenPetsClientError } from "./protocol.js";
5
+ export { getDiscoveryFilePath, readDiscoveryFile, validateDiscovery, validateEndpoint } from "./discovery.js";
6
+ export { allowedReactions, OpenPetsClientError } from "./protocol.js";
7
+ export function createOpenPetsClient(options = {}) {
8
+ return {
9
+ hello: () => sendDiscoveredRequest("hello", {}, options),
10
+ status: async (statusOptions) => {
11
+ try {
12
+ return await sendDiscoveredRequest("status", { leaseId: statusOptions?.leaseId }, options);
13
+ }
14
+ catch (error) {
15
+ return {
16
+ ok: false,
17
+ appRunning: false,
18
+ unavailableReason: error instanceof Error ? error.message : "OpenPets is unavailable.",
19
+ };
20
+ }
21
+ },
22
+ listPets: async () => parsePetListResult(await sendDiscoveredRequest("pets.list", {}, options)),
23
+ acquireLease: (leaseOptions) => sendDiscoveredRequest("lease.acquire", { requestedPetId: leaseOptions?.requestedPetId }, options),
24
+ heartbeatLease: (leaseId) => sendDiscoveredRequest("lease.heartbeat", { leaseId }, options),
25
+ releaseLease: (leaseId) => sendDiscoveredRequest("lease.release", { leaseId }, options),
26
+ react: (reaction, reactOptions) => sendDiscoveredRequest("pet.react", { reaction: validateReaction(reaction), leaseId: reactOptions?.leaseId }, options),
27
+ say: (message, sayOptions) => sendDiscoveredRequest("pet.say", { message, reaction: sayOptions?.reaction, leaseId: sayOptions?.leaseId }, options),
28
+ };
29
+ }
30
+ export function parsePetListResult(value) {
31
+ if (!isRecord(value) || value.ok !== true || !Array.isArray(value.pets) || typeof value.defaultPetId !== "string") {
32
+ throw new OpenPetsClientError("invalid_response", "OpenPets pet list response is invalid.");
33
+ }
34
+ return {
35
+ ok: true,
36
+ defaultPetId: value.defaultPetId,
37
+ pets: value.pets.map(parsePetListItem),
38
+ };
39
+ }
40
+ function parsePetListItem(value) {
41
+ if (!isRecord(value) || typeof value.id !== "string" || typeof value.displayName !== "string" || typeof value.builtIn !== "boolean" || typeof value.broken !== "boolean") {
42
+ throw new OpenPetsClientError("invalid_response", "OpenPets pet list item is invalid.");
43
+ }
44
+ return { id: value.id, displayName: value.displayName, builtIn: value.builtIn, broken: value.broken };
45
+ }
46
+ function isRecord(value) {
47
+ return typeof value === "object" && value !== null;
48
+ }
49
+ async function sendDiscoveredRequest(method, params, options) {
50
+ const discovery = readDiscoveryFile(options.discoveryPath);
51
+ return sendRequest(discovery, method, params, options);
52
+ }
53
+ export function sendRequest(discovery, method, params, options = {}) {
54
+ const request = {
55
+ id: randomUUID(),
56
+ version: openPetsIpcVersion,
57
+ token: discovery.token,
58
+ method,
59
+ params,
60
+ };
61
+ const requestLine = `${JSON.stringify(request)}\n`;
62
+ if (Buffer.byteLength(requestLine, "utf8") > maxIpcMessageBytes) {
63
+ return Promise.reject(new OpenPetsClientError("request_too_large", "OpenPets IPC request is too large."));
64
+ }
65
+ return new Promise((resolve, reject) => {
66
+ const socket = net.createConnection(discovery.endpoint);
67
+ let buffer = "";
68
+ let settled = false;
69
+ const connectTimer = setTimeout(() => finish(new OpenPetsClientError("connect_timeout", "Timed out connecting to OpenPets.")), options.connectTimeoutMs ?? connectTimeoutMs);
70
+ const responseTimer = setTimeout(() => finish(new OpenPetsClientError("response_timeout", "Timed out waiting for OpenPets response.")), options.responseTimeoutMs ?? responseTimeoutMs);
71
+ const finish = (error, result) => {
72
+ if (settled)
73
+ return;
74
+ settled = true;
75
+ clearTimeout(connectTimer);
76
+ clearTimeout(responseTimer);
77
+ socket.destroy();
78
+ if (error)
79
+ reject(error);
80
+ else
81
+ resolve(result);
82
+ };
83
+ socket.setEncoding("utf8");
84
+ socket.once("connect", () => {
85
+ clearTimeout(connectTimer);
86
+ socket.write(requestLine);
87
+ });
88
+ socket.on("data", (chunk) => {
89
+ buffer += chunk;
90
+ if (Buffer.byteLength(buffer, "utf8") > maxIpcMessageBytes) {
91
+ finish(new OpenPetsClientError("response_too_large", "OpenPets IPC response is too large."));
92
+ return;
93
+ }
94
+ const newline = buffer.indexOf("\n");
95
+ if (newline === -1)
96
+ return;
97
+ try {
98
+ const parsed = parseIpcResponse(JSON.parse(buffer.slice(0, newline)));
99
+ if (parsed.ok)
100
+ finish(undefined, parsed.result);
101
+ else
102
+ finish(new OpenPetsClientError(parsed.error.code, parsed.error.message));
103
+ }
104
+ catch (error) {
105
+ finish(error);
106
+ }
107
+ });
108
+ socket.once("error", (error) => finish(new OpenPetsClientError("unavailable", error.message)));
109
+ socket.once("end", () => {
110
+ if (!settled)
111
+ finish(new OpenPetsClientError("connection_closed", "OpenPets closed the IPC connection before responding."));
112
+ });
113
+ });
114
+ }
4
115
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,oBAAoB,EACpB,SAAS,EACT,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,aAAa,EACb,SAAS,EACT,YAAY,GACb,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAIlD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ export declare const openPetsIpcProtocol = "openpets-ipc";
2
+ export declare const openPetsIpcVersion = 1;
3
+ export declare const maxIpcMessageBytes: number;
4
+ export declare const connectTimeoutMs = 2000;
5
+ export declare const responseTimeoutMs = 3000;
6
+ export declare const allowedReactions: readonly ["idle", "thinking", "working", "editing", "running", "testing", "waiting", "waving", "success", "error", "celebrating"];
7
+ export type OpenPetsReaction = typeof allowedReactions[number];
8
+ export type OpenPetsIpcMethod = "hello" | "status" | "pets.list" | "lease.acquire" | "lease.heartbeat" | "lease.release" | "pet.react" | "pet.say";
9
+ export interface OpenPetsIpcRequest {
10
+ readonly id: string;
11
+ readonly version: 1;
12
+ readonly token: string;
13
+ readonly method: OpenPetsIpcMethod;
14
+ readonly params?: unknown;
15
+ }
16
+ export interface OpenPetsIpcOkResponse<T = unknown> {
17
+ readonly id: string | null;
18
+ readonly ok: true;
19
+ readonly result: T;
20
+ }
21
+ export interface OpenPetsIpcErrorResponse {
22
+ readonly id: string | null;
23
+ readonly ok: false;
24
+ readonly error: {
25
+ readonly code: string;
26
+ readonly message: string;
27
+ };
28
+ }
29
+ export type OpenPetsIpcResponse<T = unknown> = OpenPetsIpcOkResponse<T> | OpenPetsIpcErrorResponse;
30
+ export declare function parseIpcResponse<T = unknown>(value: unknown): OpenPetsIpcResponse<T>;
31
+ export declare function validateReaction(value: string): OpenPetsReaction;
32
+ export declare class OpenPetsClientError extends Error {
33
+ readonly code: string;
34
+ constructor(code: string, message: string);
35
+ }
36
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
37
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,iBAAiB,CAAC;AAClD,eAAO,MAAM,kBAAkB,IAAI,CAAC;AACpC,eAAO,MAAM,kBAAkB,QAAY,CAAC;AAC5C,eAAO,MAAM,gBAAgB,OAAQ,CAAC;AACtC,eAAO,MAAM,iBAAiB,OAAQ,CAAC;AAEvC,eAAO,MAAM,gBAAgB,mIAYnB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAC/D,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,eAAe,GAAG,iBAAiB,GAAG,eAAe,GAAG,WAAW,GAAG,SAAS,CAAC;AAEnJ,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAqB,CAAC,CAAC,GAAG,OAAO;IAChD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;CACpB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE;QACd,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAED,MAAM,MAAM,mBAAmB,CAAC,CAAC,GAAG,OAAO,IAAI,qBAAqB,CAAC,CAAC,CAAC,GAAG,wBAAwB,CAAC;AAEnG,wBAAgB,gBAAgB,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAapF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAKhE;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAGnD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE"}
@@ -0,0 +1,48 @@
1
+ export const openPetsIpcProtocol = "openpets-ipc";
2
+ export const openPetsIpcVersion = 1;
3
+ export const maxIpcMessageBytes = 16 * 1024;
4
+ export const connectTimeoutMs = 2_000;
5
+ export const responseTimeoutMs = 3_000;
6
+ export const allowedReactions = [
7
+ "idle",
8
+ "thinking",
9
+ "working",
10
+ "editing",
11
+ "running",
12
+ "testing",
13
+ "waiting",
14
+ "waving",
15
+ "success",
16
+ "error",
17
+ "celebrating",
18
+ ];
19
+ export function parseIpcResponse(value) {
20
+ if (!isRecord(value))
21
+ throw new OpenPetsClientError("invalid_response", "IPC response must be an object.");
22
+ if (typeof value.id !== "string" && value.id !== null)
23
+ throw new OpenPetsClientError("invalid_response", "IPC response id is invalid.");
24
+ if (value.ok === true) {
25
+ return { id: value.id, ok: true, result: value.result };
26
+ }
27
+ if (value.ok === false && isRecord(value.error) && typeof value.error.code === "string" && typeof value.error.message === "string") {
28
+ return { id: value.id, ok: false, error: { code: value.error.code, message: value.error.message } };
29
+ }
30
+ throw new OpenPetsClientError("invalid_response", "IPC response shape is invalid.");
31
+ }
32
+ export function validateReaction(value) {
33
+ if (!allowedReactions.includes(value)) {
34
+ throw new OpenPetsClientError("invalid_reaction", "Invalid OpenPets reaction.");
35
+ }
36
+ return value;
37
+ }
38
+ export class OpenPetsClientError extends Error {
39
+ code;
40
+ constructor(code, message) {
41
+ super(message);
42
+ this.code = code;
43
+ }
44
+ }
45
+ export function isRecord(value) {
46
+ return typeof value === "object" && value !== null;
47
+ }
48
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG,cAAc,CAAC;AAClD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AACpC,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,GAAG,IAAI,CAAC;AAC5C,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AACtC,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAEvC,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,MAAM;IACN,UAAU;IACV,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,QAAQ;IACR,SAAS;IACT,OAAO;IACP,aAAa;CACL,CAAC;AA8BX,MAAM,UAAU,gBAAgB,CAAc,KAAc;IAC1D,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,mBAAmB,CAAC,kBAAkB,EAAE,iCAAiC,CAAC,CAAC;IAC3G,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,IAAI,KAAK,CAAC,EAAE,KAAK,IAAI;QAAE,MAAM,IAAI,mBAAmB,CAAC,kBAAkB,EAAE,6BAA6B,CAAC,CAAC;IAExI,IAAI,KAAK,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAW,EAAE,CAAC;IAC/D,CAAC;IAED,IAAI,KAAK,CAAC,EAAE,KAAK,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACnI,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;IACtG,CAAC;IAED,MAAM,IAAI,mBAAmB,CAAC,kBAAkB,EAAE,gCAAgC,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,KAAyB,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,mBAAmB,CAAC,kBAAkB,EAAE,4BAA4B,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,KAAyB,CAAC;AACnC,CAAC;AAED,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IACvB;IAArB,YAAqB,IAAY,EAAE,OAAe;QAChD,KAAK,CAAC,OAAO,CAAC,CAAC;QADI,SAAI,GAAJ,IAAI,CAAQ;IAEjC,CAAC;CACF;AAED,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=smoke.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smoke.d.ts","sourceRoot":"","sources":["../src/smoke.ts"],"names":[],"mappings":""}
package/dist/smoke.js ADDED
@@ -0,0 +1,28 @@
1
+ import { createOpenPetsClient } from "./index.js";
2
+ import { validateReaction } from "./protocol.js";
3
+ const client = createOpenPetsClient();
4
+ const [command = "status", first, second] = process.argv.slice(2);
5
+ try {
6
+ const result = command === "hello"
7
+ ? await client.hello()
8
+ : command === "status"
9
+ ? await client.status()
10
+ : command === "react"
11
+ ? await client.react(validateReaction(first ?? "idle"))
12
+ : command === "say"
13
+ ? await client.say(first ?? "Working on it", second ? { reaction: validateReaction(second) } : undefined)
14
+ : command === "invalid-token"
15
+ ? await runInvalidTokenCheck()
16
+ : await client.status();
17
+ console.log(JSON.stringify(result, null, 2));
18
+ }
19
+ catch (error) {
20
+ console.error(error instanceof Error ? error.message : String(error));
21
+ process.exitCode = 1;
22
+ }
23
+ async function runInvalidTokenCheck() {
24
+ const { readDiscoveryFile, sendRequest } = await import("./index.js");
25
+ const discovery = readDiscoveryFile();
26
+ return sendRequest({ ...discovery, token: "invalid-token-value" }, "hello", {});
27
+ }
28
+ //# sourceMappingURL=smoke.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smoke.js","sourceRoot":"","sources":["../src/smoke.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAyB,MAAM,eAAe,CAAC;AAExE,MAAM,MAAM,GAAG,oBAAoB,EAAE,CAAC;AACtC,MAAM,CAAC,OAAO,GAAG,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAElE,IAAI,CAAC;IACH,MAAM,MAAM,GAAG,OAAO,KAAK,OAAO;QAChC,CAAC,CAAC,MAAM,MAAM,CAAC,KAAK,EAAE;QACtB,CAAC,CAAC,OAAO,KAAK,QAAQ;YACpB,CAAC,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE;YACvB,CAAC,CAAC,OAAO,KAAK,OAAO;gBACnB,CAAC,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC;gBACvD,CAAC,CAAC,OAAO,KAAK,KAAK;oBACjB,CAAC,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,gBAAgB,CAAC,MAAM,CAAqB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;oBAC7H,CAAC,CAAC,OAAO,KAAK,eAAe;wBAC3B,CAAC,CAAC,MAAM,oBAAoB,EAAE;wBAC9B,CAAC,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;IAElC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC;AAED,KAAK,UAAU,oBAAoB;IACjC,MAAM,EAAE,iBAAiB,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,iBAAiB,EAAE,CAAC;IACtC,OAAO,WAAW,CAAC,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;AAClF,CAAC"}
package/package.json CHANGED
@@ -1,29 +1,40 @@
1
1
  {
2
2
  "name": "@open-pets/client",
3
- "version": "0.1.0",
4
- "description": "TypeScript IPC client for OpenPets desktop.",
3
+ "version": "2.0.0",
5
4
  "license": "MIT",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/alvinunreal/openpets.git",
8
+ "directory": "packages/client"
9
+ },
6
10
  "type": "module",
11
+ "main": "dist/index.js",
12
+ "types": "dist/index.d.ts",
13
+ "files": [
14
+ "dist"
15
+ ],
16
+ "publishConfig": {
17
+ "access": "public"
18
+ },
7
19
  "exports": {
8
20
  ".": {
9
21
  "types": "./dist/index.d.ts",
10
- "import": "./dist/index.js"
22
+ "default": "./dist/index.js"
11
23
  }
12
24
  },
13
- "files": ["dist"],
14
- "publishConfig": {
15
- "access": "public"
16
- },
17
- "dependencies": {
18
- "@open-pets/core": "0.1.0"
25
+ "devDependencies": {
26
+ "@types/node": "^25.6.2",
27
+ "typescript": "^6.0.3"
19
28
  },
20
29
  "scripts": {
21
- "build": "bunx tsc -p tsconfig.json",
22
- "typecheck": "bunx tsc -p tsconfig.json --noEmit",
23
- "test": "bun test"
24
- },
25
- "devDependencies": {
26
- "@types/bun": "latest",
27
- "typescript": "^5.9.3"
30
+ "test": "node dist/check-client-protocol.js",
31
+ "check": "pnpm typecheck && pnpm build && pnpm test",
32
+ "typecheck": "tsc --noEmit",
33
+ "build": "tsc",
34
+ "smoke": "pnpm build && node dist/smoke.js",
35
+ "smoke:status": "pnpm smoke status",
36
+ "smoke:react": "pnpm smoke react",
37
+ "smoke:say": "pnpm smoke say",
38
+ "smoke:invalid-token": "pnpm smoke invalid-token"
28
39
  }
29
- }
40
+ }
package/dist/client.d.ts DELETED
@@ -1,62 +0,0 @@
1
- import { type LeaseResult, type OpenPetsLeaseClient, type OpenPetsState } from "@open-pets/core";
2
- import { type OpenPetsHealthV2, type OpenPetsWindowAction } from "@open-pets/core/ipc";
3
- import { OpenPetsClientError } from "./errors.js";
4
- import { type OpenPetsEventInput } from "./event-input.js";
5
- export type OpenPetsClientOptions = {
6
- endpoint?: string;
7
- timeoutMs?: number;
8
- verifyOpenPets?: boolean;
9
- };
10
- export type OpenPetsHealth = OpenPetsHealthV2;
11
- export type OpenPetsSafeResult = {
12
- ok: true;
13
- state?: OpenPetsState;
14
- } | {
15
- ok: false;
16
- error: OpenPetsClientError;
17
- };
18
- export type OpenPetsLeaseInput = {
19
- id: string;
20
- client: OpenPetsLeaseClient;
21
- label?: string;
22
- ttlMs?: number;
23
- autoClose?: boolean;
24
- };
25
- export type OpenPetsClient = {
26
- getHealth(options?: OpenPetsClientOptions): Promise<OpenPetsHealth>;
27
- isRunning(options?: OpenPetsClientOptions): Promise<boolean>;
28
- sendEvent(event: OpenPetsEventInput, options?: OpenPetsClientOptions): Promise<{
29
- ok: true;
30
- state: OpenPetsState;
31
- }>;
32
- safeSendEvent(event: OpenPetsEventInput, options?: OpenPetsClientOptions): Promise<OpenPetsSafeResult>;
33
- windowAction(action: OpenPetsWindowAction, options?: OpenPetsClientOptions): Promise<{
34
- ok: true;
35
- action: OpenPetsWindowAction;
36
- }>;
37
- leaseAcquire(input: OpenPetsLeaseInput, options?: OpenPetsClientOptions): Promise<LeaseResult>;
38
- leaseHeartbeat(input: {
39
- id: string;
40
- ttlMs?: number;
41
- }, options?: OpenPetsClientOptions): Promise<LeaseResult>;
42
- leaseRelease(id: string, options?: OpenPetsClientOptions): Promise<LeaseResult>;
43
- };
44
- export declare function createOpenPetsClient(options?: OpenPetsClientOptions): OpenPetsClient;
45
- export declare function getHealth(options?: OpenPetsClientOptions): Promise<OpenPetsHealthV2>;
46
- export declare function isOpenPetsRunning(options?: OpenPetsClientOptions): Promise<boolean>;
47
- export declare function sendEvent(event: OpenPetsEventInput, options?: OpenPetsClientOptions): Promise<{
48
- ok: true;
49
- state: OpenPetsState;
50
- }>;
51
- export declare function safeSendEvent(event: OpenPetsEventInput, options?: OpenPetsClientOptions): Promise<OpenPetsSafeResult>;
52
- export declare function windowAction(action: OpenPetsWindowAction, options?: OpenPetsClientOptions): Promise<{
53
- ok: true;
54
- action: OpenPetsWindowAction;
55
- }>;
56
- export declare function leaseAcquire(input: OpenPetsLeaseInput, options?: OpenPetsClientOptions): Promise<LeaseResult>;
57
- export declare function leaseHeartbeat(input: {
58
- id: string;
59
- ttlMs?: number;
60
- }, options?: OpenPetsClientOptions): Promise<LeaseResult>;
61
- export declare function leaseRelease(id: string, options?: OpenPetsClientOptions): Promise<LeaseResult>;
62
- //# sourceMappingURL=client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js DELETED
@@ -1,258 +0,0 @@
1
- import { createConnection } from "node:net";
2
- import { isOpenPetsState } from "@open-pets/core";
3
- import { getDefaultOpenPetsIpcEndpoint, isOpenPetsWindowAction, MAX_IPC_FRAME_BYTES, OPENPETS_IPC_PROTOCOL_VERSION, parseIpcFrame, serializeIpcRequest, } from "@open-pets/core/ipc";
4
- import { OpenPetsClientError } from "./errors.js";
5
- import { normalizeEventInput } from "./event-input.js";
6
- export function createOpenPetsClient(options = {}) {
7
- let verifiedEndpoint = null;
8
- function mergedOptions(overrides = {}) {
9
- return {
10
- endpoint: overrides.endpoint ?? options.endpoint ?? getDefaultOpenPetsIpcEndpoint(),
11
- timeoutMs: overrides.timeoutMs ?? options.timeoutMs,
12
- verifyOpenPets: overrides.verifyOpenPets ?? options.verifyOpenPets ?? true,
13
- };
14
- }
15
- async function getHealthForClient(overrides = {}) {
16
- const merged = mergedOptions(overrides);
17
- return fetchHealth(merged.endpoint, merged.timeoutMs ?? 1000);
18
- }
19
- async function sendEventForClient(event, overrides = {}) {
20
- const merged = mergedOptions(overrides);
21
- const timeoutMs = merged.timeoutMs ?? 1000;
22
- const deadline = Date.now() + timeoutMs;
23
- if (merged.verifyOpenPets && verifiedEndpoint !== merged.endpoint) {
24
- await fetchHealth(merged.endpoint, remainingMs(deadline));
25
- verifiedEndpoint = merged.endpoint;
26
- }
27
- return sendEventIpc(merged.endpoint, normalizeEventInput(event), remainingMs(deadline));
28
- }
29
- async function safeSendEventForClient(event, overrides = {}) {
30
- try {
31
- return await sendEventForClient(event, { ...overrides, timeoutMs: overrides.timeoutMs ?? options.timeoutMs ?? 400 });
32
- }
33
- catch (error) {
34
- return { ok: false, error: toClientError(error) };
35
- }
36
- }
37
- async function windowActionForClient(action, overrides = {}) {
38
- if (!isOpenPetsWindowAction(action))
39
- throw new OpenPetsClientError("rejected", "Invalid OpenPets window action");
40
- const merged = mergedOptions(overrides);
41
- const response = await requestIpc(merged.endpoint, { id: createRequestId("window"), method: "window", params: { action } }, merged.timeoutMs ?? 1000);
42
- return validateWindowActionResult(unwrapIpcResult(response));
43
- }
44
- async function leaseRequestForClient(params, overrides = {}) {
45
- const merged = mergedOptions(overrides);
46
- const response = await requestIpc(merged.endpoint, { id: createRequestId("lease"), method: "lease", params }, merged.timeoutMs ?? 1000);
47
- return validateLeaseResult(unwrapIpcResult(response));
48
- }
49
- return {
50
- getHealth: getHealthForClient,
51
- async isRunning(overrides) {
52
- try {
53
- await getHealthForClient(overrides);
54
- return true;
55
- }
56
- catch {
57
- return false;
58
- }
59
- },
60
- sendEvent: sendEventForClient,
61
- safeSendEvent: safeSendEventForClient,
62
- windowAction: windowActionForClient,
63
- leaseAcquire(input, overrides) {
64
- return leaseRequestForClient({ action: "acquire", ...input }, overrides);
65
- },
66
- leaseHeartbeat(input, overrides) {
67
- return leaseRequestForClient({ action: "heartbeat", ...input }, overrides);
68
- },
69
- leaseRelease(id, overrides) {
70
- return leaseRequestForClient({ action: "release", id }, overrides);
71
- },
72
- };
73
- }
74
- const defaultClient = createOpenPetsClient();
75
- export function getHealth(options) {
76
- return defaultClient.getHealth(options);
77
- }
78
- export function isOpenPetsRunning(options) {
79
- return defaultClient.isRunning(options);
80
- }
81
- export function sendEvent(event, options) {
82
- return defaultClient.sendEvent(event, options);
83
- }
84
- export function safeSendEvent(event, options) {
85
- return defaultClient.safeSendEvent(event, options);
86
- }
87
- export function windowAction(action, options) {
88
- return defaultClient.windowAction(action, options);
89
- }
90
- export function leaseAcquire(input, options) {
91
- return defaultClient.leaseAcquire(input, options);
92
- }
93
- export function leaseHeartbeat(input, options) {
94
- return defaultClient.leaseHeartbeat(input, options);
95
- }
96
- export function leaseRelease(id, options) {
97
- return defaultClient.leaseRelease(id, options);
98
- }
99
- async function fetchHealth(endpoint, timeoutMs) {
100
- const response = await requestIpc(endpoint, { id: createRequestId("health"), method: "health" }, timeoutMs);
101
- return validateIpcHealth(unwrapIpcResult(response));
102
- }
103
- async function sendEventIpc(endpoint, event, timeoutMs) {
104
- const response = await requestIpc(endpoint, { id: createRequestId("event"), method: "event", params: event }, timeoutMs);
105
- return validateEventResult(unwrapIpcResult(response));
106
- }
107
- function requestIpc(endpoint, request, timeoutMs) {
108
- return new Promise((resolve, reject) => {
109
- let settled = false;
110
- let buffer = Buffer.alloc(0);
111
- const socket = createConnection(endpoint);
112
- const timeout = setTimeout(() => settle(reject, new OpenPetsClientError("timeout", "OpenPets request timed out")), timeoutMs);
113
- socket.on("connect", () => {
114
- try {
115
- socket.write(serializeIpcRequest(request));
116
- }
117
- catch (error) {
118
- settle(reject, error);
119
- }
120
- });
121
- socket.on("data", (chunk) => {
122
- buffer = Buffer.concat([buffer, typeof chunk === "string" ? Buffer.from(chunk) : chunk]);
123
- if (buffer.byteLength > MAX_IPC_FRAME_BYTES) {
124
- settle(reject, new OpenPetsClientError("invalid-response", "OpenPets IPC response is too large"));
125
- return;
126
- }
127
- const newlineIndex = buffer.indexOf(0x0a);
128
- if (newlineIndex < 0)
129
- return;
130
- try {
131
- settle(resolve, validateIpcResponse(parseIpcFrame(buffer.subarray(0, newlineIndex + 1)), request.id));
132
- }
133
- catch (error) {
134
- settle(reject, error);
135
- }
136
- });
137
- socket.on("end", () => {
138
- if (!settled)
139
- settle(reject, new OpenPetsClientError("invalid-response", "OpenPets IPC response ended before a complete frame"));
140
- });
141
- socket.on("close", () => {
142
- if (!settled)
143
- settle(reject, new OpenPetsClientError("not-running", "OpenPets is not running or cannot be reached"));
144
- });
145
- socket.on("error", (error) => {
146
- settle(reject, error.code === "ENOENT" || error.code === "ECONNREFUSED"
147
- ? new OpenPetsClientError("not-running", "OpenPets is not running or cannot be reached", { cause: error })
148
- : toClientError(error));
149
- });
150
- function settle(fn, value) {
151
- if (settled)
152
- return;
153
- settled = true;
154
- clearTimeout(timeout);
155
- socket.destroy();
156
- fn(value);
157
- }
158
- });
159
- }
160
- function validateIpcResponse(input, expectedId) {
161
- if (!input || typeof input !== "object" || Array.isArray(input))
162
- throw new OpenPetsClientError("invalid-response", "OpenPets IPC response must be an object");
163
- const record = input;
164
- if (typeof record.id !== "string" || typeof record.ok !== "boolean")
165
- throw new OpenPetsClientError("invalid-response", "OpenPets IPC response is missing required fields");
166
- if (record.id !== expectedId)
167
- throw new OpenPetsClientError("invalid-response", "OpenPets IPC response id did not match request id");
168
- if (record.ok)
169
- return { id: record.id, ok: true, result: record.result };
170
- const error = record.error;
171
- if (!error || typeof error !== "object" || Array.isArray(error))
172
- throw new OpenPetsClientError("invalid-response", "OpenPets IPC error response is invalid");
173
- const code = error.code;
174
- const message = error.message;
175
- return { id: record.id, ok: false, error: { code: typeof code === "string" ? code : "internal-error", message: typeof message === "string" ? message : "OpenPets IPC request failed" } };
176
- }
177
- function unwrapIpcResult(response) {
178
- if (response.ok)
179
- return response.result;
180
- if (response.error.code === "timeout")
181
- throw new OpenPetsClientError("timeout", response.error.message);
182
- if (response.error.code === "invalid-params")
183
- throw new OpenPetsClientError("rejected", response.error.message);
184
- throw new OpenPetsClientError("invalid-response", response.error.message);
185
- }
186
- function validateIpcHealth(input) {
187
- if (!input || typeof input !== "object" || Array.isArray(input))
188
- throw new OpenPetsClientError("invalid-response", "OpenPets IPC health response must be an object");
189
- const record = input;
190
- if (record.app !== "openpets")
191
- throw new OpenPetsClientError("not-openpets", "IPC endpoint is not served by OpenPets");
192
- if (record.protocolVersion !== OPENPETS_IPC_PROTOCOL_VERSION || record.transport !== "ipc")
193
- throw new OpenPetsClientError("incompatible-protocol", "OpenPets IPC protocol version is not supported");
194
- if (record.ok !== true || typeof record.version !== "string" || typeof record.ready !== "boolean")
195
- throw new OpenPetsClientError("invalid-response", "OpenPets IPC health response is missing required fields");
196
- return {
197
- app: "openpets",
198
- ok: true,
199
- version: record.version,
200
- protocolVersion: OPENPETS_IPC_PROTOCOL_VERSION,
201
- transport: "ipc",
202
- capabilities: Array.isArray(record.capabilities) ? record.capabilities.filter((item) => item === "event-v2" || item === "window-v1" || item === "speech-v1" || item === "lease-v1") : [],
203
- ready: record.ready,
204
- activePet: typeof record.activePet === "string" ? record.activePet : null,
205
- activeLeases: typeof record.activeLeases === "number" && Number.isFinite(record.activeLeases) ? record.activeLeases : 0,
206
- managed: typeof record.managed === "boolean" ? record.managed : false,
207
- ...(typeof record.debug === "boolean" ? { debug: record.debug } : {}),
208
- ...(record.window !== undefined ? { window: record.window } : {}),
209
- };
210
- }
211
- function validateEventResult(input) {
212
- if (!input || typeof input !== "object" || Array.isArray(input))
213
- throw new OpenPetsClientError("invalid-response", "OpenPets event response must be an object");
214
- const record = input;
215
- if (!isOpenPetsState(record.state))
216
- throw new OpenPetsClientError("invalid-response", "OpenPets event response is missing state");
217
- return { ok: true, state: record.state };
218
- }
219
- function validateWindowActionResult(input) {
220
- if (!input || typeof input !== "object" || Array.isArray(input))
221
- throw new OpenPetsClientError("invalid-response", "OpenPets window response must be an object");
222
- const record = input;
223
- if (!isOpenPetsWindowAction(record.action))
224
- throw new OpenPetsClientError("invalid-response", "OpenPets window response is missing action");
225
- return { ok: true, action: record.action };
226
- }
227
- function validateLeaseResult(input) {
228
- if (!input || typeof input !== "object" || Array.isArray(input))
229
- throw new OpenPetsClientError("invalid-response", "OpenPets lease response must be an object");
230
- const record = input;
231
- if (record.action !== "acquire" && record.action !== "heartbeat" && record.action !== "release")
232
- throw new OpenPetsClientError("invalid-response", "OpenPets lease response is missing action");
233
- if (typeof record.activeLeases !== "number" || !Number.isInteger(record.activeLeases) || record.activeLeases < 0)
234
- throw new OpenPetsClientError("invalid-response", "OpenPets lease response is missing activeLeases");
235
- if (typeof record.managed !== "boolean" || typeof record.leaseActive !== "boolean" || typeof record.changed !== "boolean")
236
- throw new OpenPetsClientError("invalid-response", "OpenPets lease response is missing required fields");
237
- return {
238
- action: record.action,
239
- activeLeases: record.activeLeases,
240
- managed: record.managed,
241
- leaseActive: record.leaseActive,
242
- changed: record.changed,
243
- };
244
- }
245
- function remainingMs(deadline) {
246
- return Math.max(1, deadline - Date.now());
247
- }
248
- function createRequestId(prefix) {
249
- return `${prefix}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
250
- }
251
- function toClientError(error) {
252
- if (error instanceof OpenPetsClientError)
253
- return error;
254
- if (error && typeof error === "object" && "code" in error && (error.code === "ENOENT" || error.code === "ECONNREFUSED"))
255
- return new OpenPetsClientError("not-running", "OpenPets is not running or cannot be reached", { cause: error });
256
- return new OpenPetsClientError("network-error", "OpenPets request failed", { cause: error });
257
- }
258
- //# sourceMappingURL=client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/errors.d.ts DELETED
@@ -1,10 +0,0 @@
1
- export type OpenPetsClientErrorCode = "not-running" | "timeout" | "not-openpets" | "invalid-response" | "incompatible-protocol" | "rejected" | "network-error";
2
- export declare class OpenPetsClientError extends Error {
3
- readonly code: OpenPetsClientErrorCode;
4
- readonly status: number | undefined;
5
- constructor(code: OpenPetsClientErrorCode, message: string, options?: {
6
- status?: number;
7
- cause?: unknown;
8
- });
9
- }
10
- //# sourceMappingURL=errors.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,uBAAuB,GAC/B,aAAa,GACb,SAAS,GACT,cAAc,GACd,kBAAkB,GAClB,uBAAuB,GACvB,UAAU,GACV,eAAe,CAAC;AAEpB,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,IAAI,EAAE,uBAAuB,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;gBAExB,IAAI,EAAE,uBAAuB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO;CAM/G"}
package/dist/errors.js DELETED
@@ -1,11 +0,0 @@
1
- export class OpenPetsClientError extends Error {
2
- code;
3
- status;
4
- constructor(code, message, options = {}) {
5
- super(message, options.cause === undefined ? undefined : { cause: options.cause });
6
- this.name = "OpenPetsClientError";
7
- this.code = code;
8
- this.status = options.status;
9
- }
10
- }
11
- //# sourceMappingURL=errors.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IACnC,IAAI,CAA0B;IAC9B,MAAM,CAAqB;IAEpC,YAAY,IAA6B,EAAE,OAAe,EAAE,UAAgD,EAAE;QAC5G,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACnF,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC/B,CAAC;CACF"}
@@ -1,10 +0,0 @@
1
- import { type OpenPetsEvent, type OpenPetsState } from "@open-pets/core";
2
- export type OpenPetsEventInput = OpenPetsEvent | {
3
- state: OpenPetsState;
4
- source?: string;
5
- type?: string;
6
- message?: string;
7
- tool?: string;
8
- };
9
- export declare function normalizeEventInput(input: OpenPetsEventInput): OpenPetsEvent;
10
- //# sourceMappingURL=event-input.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"event-input.d.ts","sourceRoot":"","sources":["../src/event-input.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,aAAa,EACnB,MAAM,iBAAiB,CAAC;AAGzB,MAAM,MAAM,kBAAkB,GAC1B,aAAa,GACb;IACE,KAAK,EAAE,aAAa,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEN,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,aAAa,CAiB5E"}
@@ -1,21 +0,0 @@
1
- import { createManualEvent, isOpenPetsState, validateOpenPetsEvent, } from "@open-pets/core";
2
- import { OpenPetsClientError } from "./errors.js";
3
- export function normalizeEventInput(input) {
4
- const existing = validateOpenPetsEvent(input);
5
- if (existing.ok)
6
- return existing.event;
7
- if (!input || typeof input !== "object" || Array.isArray(input) || !isOpenPetsState(input.state)) {
8
- throw new OpenPetsClientError("rejected", existing.error);
9
- }
10
- const event = createManualEvent(input.state, {
11
- source: input.source ?? "client",
12
- type: input.type ?? `state.${input.state}`,
13
- ...(input.message ? { message: input.message } : {}),
14
- ...(input.tool ? { tool: input.tool } : {}),
15
- });
16
- const validation = validateOpenPetsEvent(event);
17
- if (!validation.ok)
18
- throw new OpenPetsClientError("rejected", validation.error);
19
- return validation.event;
20
- }
21
- //# sourceMappingURL=event-input.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"event-input.js","sourceRoot":"","sources":["../src/event-input.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,qBAAqB,GAGtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAYlD,MAAM,UAAU,mBAAmB,CAAC,KAAyB;IAC3D,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC9C,IAAI,QAAQ,CAAC,EAAE;QAAE,OAAO,QAAQ,CAAC,KAAK,CAAC;IAEvC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACjG,MAAM,IAAI,mBAAmB,CAAC,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE;QAC3C,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,QAAQ;QAChC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,SAAS,KAAK,CAAC,KAAK,EAAE;QAC1C,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5C,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAChD,IAAI,CAAC,UAAU,CAAC,EAAE;QAAE,MAAM,IAAI,mBAAmB,CAAC,UAAU,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IAChF,OAAO,UAAU,CAAC,KAAK,CAAC;AAC1B,CAAC"}