@spotpatch/shared 1.8.0 → 1.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/dist/chunk-2LVIH7OA.js +75 -0
- package/dist/chunk-2LVIH7OA.js.map +1 -0
- package/dist/chunk-MOGITGPP.js +431 -0
- package/dist/chunk-MOGITGPP.js.map +1 -0
- package/dist/chunk-RK46Y7LD.js +34 -0
- package/dist/chunk-RK46Y7LD.js.map +1 -0
- package/dist/chunk-ZCG3DLSW.js +28 -0
- package/dist/chunk-ZCG3DLSW.js.map +1 -0
- package/dist/data-flow-runtime-BMm3F-eV.d.cts +658 -0
- package/dist/data-flow-runtime-Dp-xznQW.d.ts +658 -0
- package/dist/data-flow-runtime.cjs +78 -0
- package/dist/data-flow-runtime.cjs.map +1 -0
- package/dist/data-flow-runtime.d.cts +3 -0
- package/dist/data-flow-runtime.d.ts +3 -0
- package/dist/data-flow-runtime.js +13 -0
- package/dist/data-flow-runtime.js.map +1 -0
- package/dist/endpoints-BT-Bl1WS.d.cts +20 -0
- package/dist/endpoints-BT-Bl1WS.d.ts +20 -0
- package/dist/external-agent-node.cjs +692 -0
- package/dist/external-agent-node.cjs.map +1 -0
- package/dist/external-agent-node.d.cts +556 -0
- package/dist/external-agent-node.d.ts +556 -0
- package/dist/external-agent-node.js +210 -0
- package/dist/external-agent-node.js.map +1 -0
- package/dist/external-handoff-CWoooqhp.d.cts +720 -0
- package/dist/external-handoff-CWoooqhp.d.ts +720 -0
- package/dist/external-handoff-browser.cjs +163 -0
- package/dist/external-handoff-browser.cjs.map +1 -0
- package/dist/external-handoff-browser.d.cts +32 -0
- package/dist/external-handoff-browser.d.ts +32 -0
- package/dist/external-handoff-browser.js +58 -0
- package/dist/external-handoff-browser.js.map +1 -0
- package/dist/index.cjs +938 -154
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +212 -110
- package/dist/index.d.ts +212 -110
- package/dist/index.js +616 -302
- package/dist/index.js.map +1 -1
- package/package.json +45 -2
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ERROR_CODES,
|
|
3
|
+
SpotPatchError,
|
|
4
|
+
activeAdapterSummarySchema,
|
|
5
|
+
dispatchSummarySchema,
|
|
6
|
+
externalHandoffReportableDispatchPhaseSchema,
|
|
7
|
+
externalHandoffSnapshotSchema,
|
|
8
|
+
externalHandoffSummarySchema
|
|
9
|
+
} from "./chunk-MOGITGPP.js";
|
|
10
|
+
import {
|
|
11
|
+
EXTERNAL_HANDOFF_ACTIVE_ADAPTER_KINDS,
|
|
12
|
+
EXTERNAL_HANDOFF_BROKER_PROTOCOL_VERSION,
|
|
13
|
+
EXTERNAL_HANDOFF_FRAMEWORKS,
|
|
14
|
+
EXTERNAL_HANDOFF_LIMITS
|
|
15
|
+
} from "./chunk-2LVIH7OA.js";
|
|
16
|
+
|
|
17
|
+
// src/external-agent-node.ts
|
|
18
|
+
import { createHash } from "crypto";
|
|
19
|
+
import { lstat, mkdir, realpath } from "fs/promises";
|
|
20
|
+
import os from "os";
|
|
21
|
+
import path from "path";
|
|
22
|
+
import { z } from "zod";
|
|
23
|
+
var SPOTPATCH_BRIDGE_TOKEN_HEADER = "X-SpotPatch-Bridge-Token";
|
|
24
|
+
var SPOTPATCH_BRIDGE_PATHS = Object.freeze({
|
|
25
|
+
status: "/bridge/v1/status",
|
|
26
|
+
current: "/bridge/v1/handoff/current",
|
|
27
|
+
wait: "/bridge/v1/handoff/wait",
|
|
28
|
+
ack: "/bridge/v1/handoff/ack",
|
|
29
|
+
activeClaim: "/bridge/v1/active/claim",
|
|
30
|
+
activeHeartbeat: "/bridge/v1/active/heartbeat",
|
|
31
|
+
activeReport: "/bridge/v1/active/report",
|
|
32
|
+
activeRelease: "/bridge/v1/active/release"
|
|
33
|
+
});
|
|
34
|
+
var EXTERNAL_HANDOFF_PROJECT_KEY_SALT = "spotpatch-external-agent-project-v1";
|
|
35
|
+
var opaqueIdSchema = z.string().min(22).max(128).regex(/^[A-Za-z0-9_-]+$/u);
|
|
36
|
+
var projectKeySchema = z.string().length(64).regex(/^[a-f0-9]+$/u);
|
|
37
|
+
var loopbackEndpointSchema = z.url().refine((value) => {
|
|
38
|
+
const match = /^http:\/\/127\.0\.0\.1:([1-9][0-9]{0,4})$/u.exec(value);
|
|
39
|
+
if (match?.[1] === void 0) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
const port = Number(match[1]);
|
|
43
|
+
return Number.isSafeInteger(port) && port <= 65535;
|
|
44
|
+
});
|
|
45
|
+
var externalHandoffDescriptorSchema = z.strictObject({
|
|
46
|
+
schemaVersion: z.literal(1),
|
|
47
|
+
brokerProtocolVersion: z.literal(EXTERNAL_HANDOFF_BROKER_PROTOCOL_VERSION),
|
|
48
|
+
projectKey: projectKeySchema,
|
|
49
|
+
sessionId: opaqueIdSchema,
|
|
50
|
+
framework: z.enum(EXTERNAL_HANDOFF_FRAMEWORKS),
|
|
51
|
+
endpoint: loopbackEndpointSchema,
|
|
52
|
+
bridgeToken: z.string().min(43).max(128).regex(/^[A-Za-z0-9_-]+$/u),
|
|
53
|
+
pid: z.number().int().positive(),
|
|
54
|
+
createdAt: z.iso.datetime()
|
|
55
|
+
});
|
|
56
|
+
var bridgeStatusRequestSchema = z.strictObject({});
|
|
57
|
+
var bridgeCurrentRequestSchema = z.strictObject({
|
|
58
|
+
cursor: opaqueIdSchema.optional()
|
|
59
|
+
});
|
|
60
|
+
var bridgeWaitRequestSchema = z.strictObject({
|
|
61
|
+
afterCursor: opaqueIdSchema.optional(),
|
|
62
|
+
timeoutMs: z.number().int().positive().max(EXTERNAL_HANDOFF_LIMITS.maximumWaitMs).default(EXTERNAL_HANDOFF_LIMITS.defaultWaitMs)
|
|
63
|
+
});
|
|
64
|
+
var bridgeAckRequestSchema = z.strictObject({
|
|
65
|
+
cursor: opaqueIdSchema,
|
|
66
|
+
connectorInstanceId: opaqueIdSchema
|
|
67
|
+
});
|
|
68
|
+
var bridgeActiveClaimRequestSchema = z.strictObject({
|
|
69
|
+
adapterKind: z.enum(EXTERNAL_HANDOFF_ACTIVE_ADAPTER_KINDS),
|
|
70
|
+
connectorInstanceId: opaqueIdSchema
|
|
71
|
+
});
|
|
72
|
+
var bridgeActiveHeartbeatRequestSchema = z.strictObject({
|
|
73
|
+
leaseToken: opaqueIdSchema
|
|
74
|
+
});
|
|
75
|
+
var bridgeActiveReportRequestSchema = z.strictObject({
|
|
76
|
+
leaseToken: opaqueIdSchema,
|
|
77
|
+
cursor: opaqueIdSchema,
|
|
78
|
+
phase: externalHandoffReportableDispatchPhaseSchema
|
|
79
|
+
});
|
|
80
|
+
var bridgeActiveReleaseRequestSchema = z.strictObject({
|
|
81
|
+
leaseToken: opaqueIdSchema
|
|
82
|
+
});
|
|
83
|
+
var bridgeStatusSchema = z.strictObject({
|
|
84
|
+
brokerProtocolVersion: z.literal(EXTERNAL_HANDOFF_BROKER_PROTOCOL_VERSION),
|
|
85
|
+
projectKey: projectKeySchema,
|
|
86
|
+
sessionId: opaqueIdSchema,
|
|
87
|
+
framework: z.enum(EXTERNAL_HANDOFF_FRAMEWORKS),
|
|
88
|
+
current: externalHandoffSummarySchema.nullable()
|
|
89
|
+
});
|
|
90
|
+
var bridgeCurrentResultSchema = z.strictObject({
|
|
91
|
+
outcome: z.literal("handoff"),
|
|
92
|
+
snapshot: externalHandoffSnapshotSchema
|
|
93
|
+
});
|
|
94
|
+
var bridgeWaitResultSchema = z.discriminatedUnion("outcome", [
|
|
95
|
+
bridgeCurrentResultSchema,
|
|
96
|
+
z.strictObject({ outcome: z.literal("timeout") })
|
|
97
|
+
]);
|
|
98
|
+
var bridgeAckResultSchema = z.strictObject({
|
|
99
|
+
summary: externalHandoffSummarySchema
|
|
100
|
+
});
|
|
101
|
+
var bridgeActiveClaimResultSchema = z.strictObject({
|
|
102
|
+
leaseToken: opaqueIdSchema,
|
|
103
|
+
heartbeatIntervalMs: z.literal(EXTERNAL_HANDOFF_LIMITS.activeHeartbeatIntervalMs),
|
|
104
|
+
baselineCursor: opaqueIdSchema.nullable(),
|
|
105
|
+
activeAdapter: activeAdapterSummarySchema
|
|
106
|
+
});
|
|
107
|
+
var bridgeActiveStateResultSchema = z.strictObject({
|
|
108
|
+
activeAdapter: activeAdapterSummarySchema.nullable(),
|
|
109
|
+
dispatch: dispatchSummarySchema.nullable()
|
|
110
|
+
});
|
|
111
|
+
var bridgeActiveHeartbeatResultSchema = bridgeActiveStateResultSchema;
|
|
112
|
+
var bridgeActiveReportResultSchema = bridgeActiveStateResultSchema;
|
|
113
|
+
var bridgeActiveReleaseResultSchema = bridgeActiveStateResultSchema;
|
|
114
|
+
function currentUid() {
|
|
115
|
+
const uid = process.getuid?.();
|
|
116
|
+
if (uid === void 0) {
|
|
117
|
+
throw new SpotPatchError(ERROR_CODES.BRIDGE_UNAUTHORIZED);
|
|
118
|
+
}
|
|
119
|
+
return uid;
|
|
120
|
+
}
|
|
121
|
+
async function assertPrivateDirectory(directory, uid) {
|
|
122
|
+
const status = await lstat(directory);
|
|
123
|
+
if (!status.isDirectory() || status.isSymbolicLink() || status.uid !== uid || (status.mode & 63) !== 0) {
|
|
124
|
+
throw new SpotPatchError(ERROR_CODES.BRIDGE_UNAUTHORIZED);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
async function ensurePrivateSubdirectory(base, uid, create) {
|
|
128
|
+
const directory = path.join(base, "spotpatch");
|
|
129
|
+
if (create) {
|
|
130
|
+
try {
|
|
131
|
+
await mkdir(directory, { mode: 448 });
|
|
132
|
+
} catch (error) {
|
|
133
|
+
if (error.code !== "EEXIST") {
|
|
134
|
+
throw error;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
await assertPrivateDirectory(directory, uid);
|
|
139
|
+
return directory;
|
|
140
|
+
}
|
|
141
|
+
async function resolveExternalHandoffRuntimeDirectory(create) {
|
|
142
|
+
if (process.platform === "win32") {
|
|
143
|
+
throw new SpotPatchError(ERROR_CODES.BRIDGE_UNAUTHORIZED);
|
|
144
|
+
}
|
|
145
|
+
const uid = currentUid();
|
|
146
|
+
const xdgRuntimeDirectory = process.env.XDG_RUNTIME_DIR;
|
|
147
|
+
if (xdgRuntimeDirectory !== void 0 && !path.isAbsolute(xdgRuntimeDirectory)) {
|
|
148
|
+
throw new SpotPatchError(ERROR_CODES.BRIDGE_UNAUTHORIZED);
|
|
149
|
+
}
|
|
150
|
+
if (xdgRuntimeDirectory !== void 0) {
|
|
151
|
+
try {
|
|
152
|
+
await assertPrivateDirectory(xdgRuntimeDirectory, uid);
|
|
153
|
+
return await ensurePrivateSubdirectory(xdgRuntimeDirectory, uid, create);
|
|
154
|
+
} catch (error) {
|
|
155
|
+
if (!create && error.code === "ENOENT") {
|
|
156
|
+
throw new SpotPatchError(ERROR_CODES.SESSION_NOT_FOUND);
|
|
157
|
+
}
|
|
158
|
+
throw error;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
const fallback = path.join(os.tmpdir(), `spotpatch-${String(uid)}`);
|
|
162
|
+
if (create) {
|
|
163
|
+
try {
|
|
164
|
+
await mkdir(fallback, { mode: 448 });
|
|
165
|
+
} catch (error) {
|
|
166
|
+
if (error.code !== "EEXIST") {
|
|
167
|
+
throw error;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
try {
|
|
172
|
+
await assertPrivateDirectory(fallback, uid);
|
|
173
|
+
} catch (error) {
|
|
174
|
+
if (!create && error.code === "ENOENT") {
|
|
175
|
+
throw new SpotPatchError(ERROR_CODES.SESSION_NOT_FOUND);
|
|
176
|
+
}
|
|
177
|
+
throw error;
|
|
178
|
+
}
|
|
179
|
+
return fallback;
|
|
180
|
+
}
|
|
181
|
+
async function computeExternalHandoffProjectKey(root) {
|
|
182
|
+
const canonicalRoot = await realpath(root);
|
|
183
|
+
return createHash("sha256").update(`${EXTERNAL_HANDOFF_PROJECT_KEY_SALT}\0${canonicalRoot}`).digest("hex");
|
|
184
|
+
}
|
|
185
|
+
export {
|
|
186
|
+
EXTERNAL_HANDOFF_PROJECT_KEY_SALT,
|
|
187
|
+
SPOTPATCH_BRIDGE_PATHS,
|
|
188
|
+
SPOTPATCH_BRIDGE_TOKEN_HEADER,
|
|
189
|
+
bridgeAckRequestSchema,
|
|
190
|
+
bridgeAckResultSchema,
|
|
191
|
+
bridgeActiveClaimRequestSchema,
|
|
192
|
+
bridgeActiveClaimResultSchema,
|
|
193
|
+
bridgeActiveHeartbeatRequestSchema,
|
|
194
|
+
bridgeActiveHeartbeatResultSchema,
|
|
195
|
+
bridgeActiveReleaseRequestSchema,
|
|
196
|
+
bridgeActiveReleaseResultSchema,
|
|
197
|
+
bridgeActiveReportRequestSchema,
|
|
198
|
+
bridgeActiveReportResultSchema,
|
|
199
|
+
bridgeActiveStateResultSchema,
|
|
200
|
+
bridgeCurrentRequestSchema,
|
|
201
|
+
bridgeCurrentResultSchema,
|
|
202
|
+
bridgeStatusRequestSchema,
|
|
203
|
+
bridgeStatusSchema,
|
|
204
|
+
bridgeWaitRequestSchema,
|
|
205
|
+
bridgeWaitResultSchema,
|
|
206
|
+
computeExternalHandoffProjectKey,
|
|
207
|
+
externalHandoffDescriptorSchema,
|
|
208
|
+
resolveExternalHandoffRuntimeDirectory
|
|
209
|
+
};
|
|
210
|
+
//# sourceMappingURL=external-agent-node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/external-agent-node.ts"],"sourcesContent":["/// <reference types=\"node\" />\n\nimport { createHash } from \"node:crypto\";\nimport { lstat, mkdir, realpath } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport { z } from \"zod\";\n\nimport {\n EXTERNAL_HANDOFF_ACTIVE_ADAPTER_KINDS,\n EXTERNAL_HANDOFF_BROKER_PROTOCOL_VERSION,\n EXTERNAL_HANDOFF_FRAMEWORKS,\n EXTERNAL_HANDOFF_LIMITS,\n activeAdapterSummarySchema,\n dispatchSummarySchema,\n externalHandoffReportableDispatchPhaseSchema,\n externalHandoffSnapshotSchema,\n externalHandoffSummarySchema,\n type ActiveAdapterSummary,\n type DispatchSummary,\n type ExternalHandoffSnapshot,\n} from \"./protocol/external-handoff.js\";\nimport { ERROR_CODES } from \"./errors/error-code.js\";\nimport { SpotPatchError } from \"./errors/spotpatch-error.js\";\n\nexport const SPOTPATCH_BRIDGE_TOKEN_HEADER = \"X-SpotPatch-Bridge-Token\" as const;\nexport const SPOTPATCH_BRIDGE_PATHS = Object.freeze({\n status: \"/bridge/v1/status\",\n current: \"/bridge/v1/handoff/current\",\n wait: \"/bridge/v1/handoff/wait\",\n ack: \"/bridge/v1/handoff/ack\",\n activeClaim: \"/bridge/v1/active/claim\",\n activeHeartbeat: \"/bridge/v1/active/heartbeat\",\n activeReport: \"/bridge/v1/active/report\",\n activeRelease: \"/bridge/v1/active/release\",\n});\nexport const EXTERNAL_HANDOFF_PROJECT_KEY_SALT =\n \"spotpatch-external-agent-project-v1\" as const;\n\nconst opaqueIdSchema = z\n .string()\n .min(22)\n .max(128)\n .regex(/^[A-Za-z0-9_-]+$/u);\nconst projectKeySchema = z\n .string()\n .length(64)\n .regex(/^[a-f0-9]+$/u);\nconst loopbackEndpointSchema = z.url().refine((value) => {\n const match = /^http:\\/\\/127\\.0\\.0\\.1:([1-9][0-9]{0,4})$/u.exec(value);\n\n if (match?.[1] === undefined) {\n return false;\n }\n\n const port = Number(match[1]);\n return Number.isSafeInteger(port) && port <= 65_535;\n});\n\nexport const externalHandoffDescriptorSchema = z.strictObject({\n schemaVersion: z.literal(1),\n brokerProtocolVersion: z.literal(EXTERNAL_HANDOFF_BROKER_PROTOCOL_VERSION),\n projectKey: projectKeySchema,\n sessionId: opaqueIdSchema,\n framework: z.enum(EXTERNAL_HANDOFF_FRAMEWORKS),\n endpoint: loopbackEndpointSchema,\n bridgeToken: z\n .string()\n .min(43)\n .max(128)\n .regex(/^[A-Za-z0-9_-]+$/u),\n pid: z.number().int().positive(),\n createdAt: z.iso.datetime(),\n});\n\nexport const bridgeStatusRequestSchema = z.strictObject({});\nexport const bridgeCurrentRequestSchema = z.strictObject({\n cursor: opaqueIdSchema.optional(),\n});\nexport const bridgeWaitRequestSchema = z.strictObject({\n afterCursor: opaqueIdSchema.optional(),\n timeoutMs: z\n .number()\n .int()\n .positive()\n .max(EXTERNAL_HANDOFF_LIMITS.maximumWaitMs)\n .default(EXTERNAL_HANDOFF_LIMITS.defaultWaitMs),\n});\nexport const bridgeAckRequestSchema = z.strictObject({\n cursor: opaqueIdSchema,\n connectorInstanceId: opaqueIdSchema,\n});\nexport const bridgeActiveClaimRequestSchema = z.strictObject({\n adapterKind: z.enum(EXTERNAL_HANDOFF_ACTIVE_ADAPTER_KINDS),\n connectorInstanceId: opaqueIdSchema,\n});\nexport const bridgeActiveHeartbeatRequestSchema = z.strictObject({\n leaseToken: opaqueIdSchema,\n});\nexport const bridgeActiveReportRequestSchema = z.strictObject({\n leaseToken: opaqueIdSchema,\n cursor: opaqueIdSchema,\n phase: externalHandoffReportableDispatchPhaseSchema,\n});\nexport const bridgeActiveReleaseRequestSchema = z.strictObject({\n leaseToken: opaqueIdSchema,\n});\nexport const bridgeStatusSchema = z.strictObject({\n brokerProtocolVersion: z.literal(EXTERNAL_HANDOFF_BROKER_PROTOCOL_VERSION),\n projectKey: projectKeySchema,\n sessionId: opaqueIdSchema,\n framework: z.enum(EXTERNAL_HANDOFF_FRAMEWORKS),\n current: externalHandoffSummarySchema.nullable(),\n});\nexport const bridgeCurrentResultSchema = z.strictObject({\n outcome: z.literal(\"handoff\"),\n snapshot: externalHandoffSnapshotSchema,\n});\nexport const bridgeWaitResultSchema = z.discriminatedUnion(\"outcome\", [\n bridgeCurrentResultSchema,\n z.strictObject({ outcome: z.literal(\"timeout\") }),\n]);\nexport const bridgeAckResultSchema = z.strictObject({\n summary: externalHandoffSummarySchema,\n});\nexport const bridgeActiveClaimResultSchema = z.strictObject({\n leaseToken: opaqueIdSchema,\n heartbeatIntervalMs: z.literal(EXTERNAL_HANDOFF_LIMITS.activeHeartbeatIntervalMs),\n baselineCursor: opaqueIdSchema.nullable(),\n activeAdapter: activeAdapterSummarySchema,\n});\nexport const bridgeActiveStateResultSchema = z.strictObject({\n activeAdapter: activeAdapterSummarySchema.nullable(),\n dispatch: dispatchSummarySchema.nullable(),\n});\nexport const bridgeActiveHeartbeatResultSchema = bridgeActiveStateResultSchema;\nexport const bridgeActiveReportResultSchema = bridgeActiveStateResultSchema;\nexport const bridgeActiveReleaseResultSchema = bridgeActiveStateResultSchema;\n\nexport type ExternalHandoffDescriptor = z.infer<typeof externalHandoffDescriptorSchema>;\nexport type BridgeStatus = z.infer<typeof bridgeStatusSchema>;\nexport type BridgeWaitResult =\n | Readonly<{ outcome: \"handoff\"; snapshot: ExternalHandoffSnapshot }>\n | Readonly<{ outcome: \"timeout\" }>;\nexport interface BridgeActiveClaimResult {\n readonly leaseToken: string;\n readonly heartbeatIntervalMs: typeof EXTERNAL_HANDOFF_LIMITS.activeHeartbeatIntervalMs;\n readonly baselineCursor: string | null;\n readonly activeAdapter: ActiveAdapterSummary;\n}\nexport interface BridgeActiveStateResult {\n readonly activeAdapter: ActiveAdapterSummary | null;\n readonly dispatch: DispatchSummary | null;\n}\n\nfunction currentUid(): number {\n const uid = process.getuid?.();\n\n if (uid === undefined) {\n throw new SpotPatchError(ERROR_CODES.BRIDGE_UNAUTHORIZED);\n }\n\n return uid;\n}\n\nasync function assertPrivateDirectory(directory: string, uid: number): Promise<void> {\n const status = await lstat(directory);\n\n if (\n !status.isDirectory() ||\n status.isSymbolicLink() ||\n status.uid !== uid ||\n (status.mode & 0o077) !== 0\n ) {\n throw new SpotPatchError(ERROR_CODES.BRIDGE_UNAUTHORIZED);\n }\n}\n\nasync function ensurePrivateSubdirectory(\n base: string,\n uid: number,\n create: boolean,\n): Promise<string> {\n const directory = path.join(base, \"spotpatch\");\n\n if (create) {\n try {\n await mkdir(directory, { mode: 0o700 });\n } catch (error: unknown) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") {\n throw error;\n }\n }\n }\n\n await assertPrivateDirectory(directory, uid);\n return directory;\n}\n\nexport async function resolveExternalHandoffRuntimeDirectory(\n create: boolean,\n): Promise<string> {\n if (process.platform === \"win32\") {\n throw new SpotPatchError(ERROR_CODES.BRIDGE_UNAUTHORIZED);\n }\n\n const uid = currentUid();\n const xdgRuntimeDirectory = process.env.XDG_RUNTIME_DIR;\n\n if (xdgRuntimeDirectory !== undefined && !path.isAbsolute(xdgRuntimeDirectory)) {\n throw new SpotPatchError(ERROR_CODES.BRIDGE_UNAUTHORIZED);\n }\n\n if (xdgRuntimeDirectory !== undefined) {\n try {\n await assertPrivateDirectory(xdgRuntimeDirectory, uid);\n return await ensurePrivateSubdirectory(xdgRuntimeDirectory, uid, create);\n } catch (error: unknown) {\n if (!create && (error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new SpotPatchError(ERROR_CODES.SESSION_NOT_FOUND);\n }\n\n throw error;\n }\n }\n\n const fallback = path.join(os.tmpdir(), `spotpatch-${String(uid)}`);\n\n if (create) {\n try {\n await mkdir(fallback, { mode: 0o700 });\n } catch (error: unknown) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") {\n throw error;\n }\n }\n }\n\n try {\n await assertPrivateDirectory(fallback, uid);\n } catch (error: unknown) {\n if (!create && (error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new SpotPatchError(ERROR_CODES.SESSION_NOT_FOUND);\n }\n\n throw error;\n }\n\n return fallback;\n}\n\nexport async function computeExternalHandoffProjectKey(root: string): Promise<string> {\n const canonicalRoot = await realpath(root);\n return createHash(\"sha256\")\n .update(`${EXTERNAL_HANDOFF_PROJECT_KEY_SALT}\\0${canonicalRoot}`)\n .digest(\"hex\");\n}\n"],"mappings":"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","names":[]}
|