@jmfederico/pi-web 1.202608.2 → 1.202609.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 +3 -3
- package/dist/.plugins-ready +1 -0
- package/dist/cli.js +5 -2
- package/dist/cli.js.map +1 -1
- package/dist/client/apple-touch-icon-dev.png +0 -0
- package/dist/client/assets/index-AroYaCLx.js +4130 -0
- package/dist/client/assets/vendor-editor-core-YWog6mAR.js +10 -0
- package/dist/client/assets/vendor-editor-languages-DOCw3vc9.js +28 -0
- package/dist/client/favicon-dev.svg +8 -0
- package/dist/client/index.html +5 -5
- package/dist/client/pwa-icon-dev-192.png +0 -0
- package/dist/client/pwa-icon-dev-512.png +0 -0
- package/dist/config.js +20 -0
- package/dist/config.js.map +1 -1
- package/dist/docker/piWebDockerCommandPlan.js +9 -1
- package/dist/docker/piWebDockerCommandPlan.js.map +1 -1
- package/dist/nativeServices/installedServiceDefinitions.js +25 -19
- package/dist/nativeServices/installedServiceDefinitions.js.map +1 -1
- package/dist/nativeServices/serviceAction.js +38 -26
- package/dist/nativeServices/serviceAction.js.map +1 -1
- package/dist/nativeServices/servicePlan.js +3 -3
- package/dist/nativeServices/servicePlan.js.map +1 -1
- package/dist/pi-packages/captains-log/README.md +11 -0
- package/dist/pi-packages/captains-log/dist/browser/channelProtocol.js +29 -0
- package/dist/pi-packages/captains-log/dist/browser/index.js +144 -0
- package/dist/pi-packages/captains-log/dist/browser/markdown.js +67 -0
- package/dist/pi-packages/captains-log/dist/browser/panel.js +105 -0
- package/dist/pi-packages/captains-log/dist/browser/protocol.js +26 -0
- package/dist/pi-packages/captains-log/dist/companion.js +126 -0
- package/dist/pi-packages/captains-log/dist/roundtrip.js +62 -0
- package/dist/pi-packages/captains-log/dist/server.js +210 -0
- package/dist/pi-packages/captains-log/dist/store.js +75 -0
- package/dist/pi-packages/captains-log/docs/usage.md +30 -0
- package/dist/pi-packages/captains-log/package.json +35 -0
- package/dist/pi-packages/captains-log/tsconfig.json +21 -0
- package/dist/pi-packages/captains-log/vite.config.mjs +28 -0
- package/dist/pi-packages/relays/package.json +1 -1
- package/dist/pi-packages/relays/pi-web-plugin.js +1 -1
- package/dist/pi-packages/relays/prompts/relay-worktree.md +13 -142
- package/dist/pi-packages/relays/prompts/relay.md +25 -132
- package/dist/pi-packages/relays/relayDiscovery.js +2 -2
- package/dist/pi-packages/relays/relaysPanelElement.js +1 -1
- package/dist/pi-packages/relays/skills/relay/SKILL.md +59 -88
- package/dist/pi-packages/relays/skills/relay-runner/SKILL.md +253 -0
- package/dist/pi-web-plugins/files/browser/assets/files-icon-DZObYhxb.svg +3 -0
- package/dist/pi-web-plugins/files/browser/pi-web-plugin.js +439 -0
- package/dist/pi-web-plugins/files/package.json +15 -0
- package/dist/pi-web-plugins/git/browser/git-panel.js +54 -24
- package/dist/pi-web-plugins/git/browser/pi-web-plugin.js +1 -1
- package/dist/pi-web-plugins/git/git-backend.js +5 -5
- package/dist/pi-web-plugins/git/server-plugin.js +5 -3
- package/dist/pi-web-plugins/info/pi-web-plugin.js +1 -1
- package/dist/pi-web-plugins/mermaid/browser/mermaid-engine.js +3590 -0
- package/dist/pi-web-plugins/mermaid/browser/pi-web-plugin.js +6 -0
- package/dist/pi-web-plugins/mermaid/package.json +13 -0
- package/dist/pi-web-plugins/terminal/browser/pi-web-plugin.js +210 -0
- package/dist/pi-web-plugins/terminal/package.json +16 -0
- package/dist/pi-web-plugins/terminal/server-plugin.js +365 -0
- package/dist/{server/terminals → pi-web-plugins/terminal}/terminalService.js +162 -65
- package/dist/pi-web-plugins/updates/pi-web-plugin.js +45 -35
- package/dist/pi-web-plugins/workspace-tasks/pi-web-plugin.js +1 -1
- package/dist/piWebVersionReport.js +12 -4
- package/dist/piWebVersionReport.js.map +1 -1
- package/dist/plugin-api.d.ts +222 -23
- package/dist/plugin-api.js +1 -0
- package/dist/pluginRecoveryCli.js +3 -2
- package/dist/pluginRecoveryCli.js.map +1 -1
- package/dist/server/activity/workspaceActivityService.js.map +1 -1
- package/dist/server/app.js +33 -12
- package/dist/server/app.js.map +1 -1
- package/dist/server/configRoutes.js +6 -1
- package/dist/server/configRoutes.js.map +1 -1
- package/dist/server/deploymentIdentity.js +67 -0
- package/dist/server/deploymentIdentity.js.map +1 -0
- package/dist/server/deploymentIdentityRoutes.js +22 -0
- package/dist/server/deploymentIdentityRoutes.js.map +1 -0
- package/dist/server/knownAutoInstallPiPackages.js +1 -1
- package/dist/server/knownAutoInstallPiPackages.js.map +1 -1
- package/dist/server/knownPiPackages.js +12 -0
- package/dist/server/knownPiPackages.js.map +1 -0
- package/dist/server/machines/machineClient.js +2 -2
- package/dist/server/machines/machineClient.js.map +1 -1
- package/dist/server/machines/machinePluginProxyRoutes.js +53 -11
- package/dist/server/machines/machinePluginProxyRoutes.js.map +1 -1
- package/dist/server/machines/machineProxyRoutes.js +70 -7
- package/dist/server/machines/machineProxyRoutes.js.map +1 -1
- package/dist/server/notices/serverNoticeRoutes.js +34 -0
- package/dist/server/notices/serverNoticeRoutes.js.map +1 -0
- package/dist/server/notices/serverNoticeService.js +26 -0
- package/dist/server/notices/serverNoticeService.js.map +1 -0
- package/dist/server/notices/serverNoticeStore.js +119 -0
- package/dist/server/notices/serverNoticeStore.js.map +1 -0
- package/dist/server/piPackageService.js +5 -5
- package/dist/server/piPackageService.js.map +1 -1
- package/dist/server/piWebPluginCatalog.js +46 -12
- package/dist/server/piWebPluginCatalog.js.map +1 -1
- package/dist/server/piWebPluginLifecycle.js +26 -3
- package/dist/server/piWebPluginLifecycle.js.map +1 -1
- package/dist/server/piWebPluginService.js +37 -2
- package/dist/server/piWebPluginService.js.map +1 -1
- package/dist/server/piWebStatus.js +1 -1
- package/dist/server/piWebStatus.js.map +1 -1
- package/dist/server/pluginCallbackDrain.js +35 -0
- package/dist/server/pluginCallbackDrain.js.map +1 -0
- package/dist/server/plugins/pluginBackendChannelProxyAdmission.js +84 -0
- package/dist/server/plugins/pluginBackendChannelProxyAdmission.js.map +1 -0
- package/dist/server/plugins/pluginBackendChannelProxyCoordinator.js +234 -0
- package/dist/server/plugins/pluginBackendChannelProxyCoordinator.js.map +1 -0
- package/dist/server/plugins/pluginBackendChannelProxyRoutes.js +52 -0
- package/dist/server/plugins/pluginBackendChannelProxyRoutes.js.map +1 -0
- package/dist/server/plugins/pluginBackendProxyRoutes.js +38 -31
- package/dist/server/plugins/pluginBackendProxyRoutes.js.map +1 -1
- package/dist/server/plugins/pluginBackendRegistry.js +740 -0
- package/dist/server/plugins/pluginBackendRegistry.js.map +1 -0
- package/dist/server/plugins/serverPluginPiSessionEventsCapability.js +34 -0
- package/dist/server/plugins/serverPluginPiSessionEventsCapability.js.map +1 -0
- package/dist/server/plugins/serverPluginPiSessionsCapability.js +185 -0
- package/dist/server/plugins/serverPluginPiSessionsCapability.js.map +1 -0
- package/dist/server/plugins/serverPluginRuntime.js +1028 -107
- package/dist/server/plugins/serverPluginRuntime.js.map +1 -1
- package/dist/server/plugins/serverPluginWorkspacesCapability.js +114 -0
- package/dist/server/plugins/serverPluginWorkspacesCapability.js.map +1 -0
- package/dist/server/sessiond/pluginBackendChannelRoutes.js +393 -0
- package/dist/server/sessiond/pluginBackendChannelRoutes.js.map +1 -0
- package/dist/server/sessiond/pluginBackendRoutes.js +10 -7
- package/dist/server/sessiond/pluginBackendRoutes.js.map +1 -1
- package/dist/server/sessiond/sessionDaemonShutdown.js +9 -2
- package/dist/server/sessiond/sessionDaemonShutdown.js.map +1 -1
- package/dist/server/sessiond/sessionProxyRoutes.js +2 -0
- package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -1
- package/dist/server/sessiond/sessionServiceDependencies.js +1 -0
- package/dist/server/sessiond/sessionServiceDependencies.js.map +1 -1
- package/dist/server/sessiond.js +82 -21
- package/dist/server/sessiond.js.map +1 -1
- package/dist/server/sessions/attachmentService.js +1 -5
- package/dist/server/sessions/attachmentService.js.map +1 -1
- package/dist/server/sessions/builtinCommands.js +2 -2
- package/dist/server/sessions/builtinCommands.js.map +1 -1
- package/dist/server/sessions/clientSessionPreview.js +14 -0
- package/dist/server/sessions/clientSessionPreview.js.map +1 -0
- package/dist/server/sessions/piSessionEventConnections.js +65 -0
- package/dist/server/sessions/piSessionEventConnections.js.map +1 -0
- package/dist/server/sessions/piSessionManagerGateway.js +171 -1
- package/dist/server/sessions/piSessionManagerGateway.js.map +1 -1
- package/dist/server/sessions/piSessionService.js +442 -90
- package/dist/server/sessions/piSessionService.js.map +1 -1
- package/dist/server/sessions/sessionActivityMarker.js +105 -0
- package/dist/server/sessions/sessionActivityMarker.js.map +1 -0
- package/dist/server/sessions/sessionEnvironmentFacts.js +5 -4
- package/dist/server/sessions/sessionEnvironmentFacts.js.map +1 -1
- package/dist/server/sessions/sessionNameGenerator.js +3 -2
- package/dist/server/sessions/sessionNameGenerator.js.map +1 -1
- package/dist/server/sessions/sessionRoutes.js +18 -0
- package/dist/server/sessions/sessionRoutes.js.map +1 -1
- package/dist/server/sessions/spawnSessionTool.js +1 -1
- package/dist/server/sessions/spawnSessionTool.js.map +1 -1
- package/dist/server/sessions/spawnSubsessionTool.js +1 -1
- package/dist/server/sessions/spawnSubsessionTool.js.map +1 -1
- package/dist/server/sessions/transcriptBranchCache.js +81 -0
- package/dist/server/sessions/transcriptBranchCache.js.map +1 -0
- package/dist/server/sessions/transcriptMessages.js +54 -0
- package/dist/server/sessions/transcriptMessages.js.map +1 -0
- package/dist/server/terminals/requiredTerminalService.js +103 -0
- package/dist/server/terminals/requiredTerminalService.js.map +1 -0
- package/dist/server/webSocketBridge.js +339 -0
- package/dist/server/webSocketBridge.js.map +1 -1
- package/dist/server/workspaces/projectPiWebConfig.js +6 -1
- package/dist/server/workspaces/projectPiWebConfig.js.map +1 -1
- package/dist/server/workspaces/sessionDaemonWorkspaceCatalog.js +23 -3
- package/dist/server/workspaces/sessionDaemonWorkspaceCatalog.js.map +1 -1
- package/dist/server/workspaces/workspaceCatalog.js +3 -1
- package/dist/server/workspaces/workspaceCatalog.js.map +1 -1
- package/dist/server/workspaces/workspaceProviderRegistry.js +64 -149
- package/dist/server/workspaces/workspaceProviderRegistry.js.map +1 -1
- package/dist/server/workspaces/workspaceRemovalService.js +38 -5
- package/dist/server/workspaces/workspaceRemovalService.js.map +1 -1
- package/dist/server-plugin-api.d.ts +216 -22
- package/dist/server-plugin-api.js +319 -2
- package/dist/server-plugin-api.js.map +1 -1
- package/dist/serverPluginRecovery.js +4 -0
- package/dist/serverPluginRecovery.js.map +1 -1
- package/dist/sessiond/sessionDaemonClient.js +3 -3
- package/dist/sessiond/sessionDaemonClient.js.map +1 -1
- package/dist/shared/apiTypes.js +1 -1
- package/dist/shared/apiTypes.js.map +1 -1
- package/dist/shared/federatedRoutes.js +47 -17
- package/dist/shared/federatedRoutes.js.map +1 -1
- package/dist/shared/machinePluginIds.js +28 -7
- package/dist/shared/machinePluginIds.js.map +1 -1
- package/dist/shared/pluginApiTypes.d.ts +21 -1
- package/dist/shared/pluginApiTypes.js +0 -1
- package/dist/shared/pluginBackendProtocol.js +163 -2
- package/dist/shared/pluginBackendProtocol.js.map +1 -1
- package/dist/shared/pluginIds.js +8 -1
- package/dist/shared/pluginIds.js.map +1 -1
- package/dist/shared/requiredTerminalPlugin.js +6 -0
- package/dist/shared/requiredTerminalPlugin.js.map +1 -0
- package/dist/shared/serverNoticeContract.js +88 -0
- package/dist/shared/serverNoticeContract.js.map +1 -0
- package/dist/shared/sessionDefaults.js +41 -0
- package/dist/shared/sessionDefaults.js.map +1 -0
- package/docs/config.md +77 -37
- package/docs/plugins.md +146 -1213
- package/examples/session-bridge-plugin/README.md +20 -0
- package/examples/session-bridge-plugin/docs/usage.md +54 -0
- package/examples/session-bridge-plugin/package.json +26 -0
- package/examples/session-bridge-plugin/src/browser/index.ts +84 -0
- package/examples/session-bridge-plugin/src/browser/protocol.ts +24 -0
- package/examples/session-bridge-plugin/src/companion.ts +65 -0
- package/examples/session-bridge-plugin/src/reviewRun.ts +39 -0
- package/examples/session-bridge-plugin/src/server.ts +85 -0
- package/examples/session-bridge-plugin/src/store.ts +57 -0
- package/examples/session-bridge-plugin/tsconfig.json +21 -0
- package/examples/workspace-provider-plugin/README.md +4 -4
- package/examples/workspace-provider-plugin/package.json +1 -1
- package/examples/workspace-provider-plugin/src/browser/index.ts +9 -9
- package/examples/workspace-provider-plugin/src/server.ts +15 -11
- package/package.json +17 -11
- package/dist/client/assets/CodeViewer-BMWwxG7q.js +0 -4
- package/dist/client/assets/TerminalPanel-CacQDIYn.js +0 -187
- package/dist/client/assets/index-DUW2xnoV.js +0 -4279
- package/dist/client/assets/vendor-editor-core-CXO8gGab.js +0 -12
- package/dist/client/assets/vendor-editor-languages-CpW4sJsX.js +0 -46
- package/dist/client/assets/vendor-editor-legacy-CYBnW6ZU.js +0 -1
- package/dist/client/assets/vendor-terminal-BrP-ENHg.css +0 -1
- package/dist/client/assets/vendor-terminal-D8k4UKM2.js +0 -35
- package/dist/server/terminalProxyRoutes.js +0 -141
- package/dist/server/terminalProxyRoutes.js.map +0 -1
- package/dist/server/terminals/terminalRoutes.js +0 -155
- package/dist/server/terminals/terminalRoutes.js.map +0 -1
- package/dist/server/terminals/terminalService.js.map +0 -1
- package/dist/server/terminals/terminalSize.js +0 -17
- package/dist/server/terminals/terminalSize.js.map +0 -1
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { REQUIRED_TERMINAL_PLUGIN_ID } from "../../shared/requiredTerminalPlugin.js";
|
|
2
|
+
/** Core's typed view of the bundled Terminal service capability. */
|
|
3
|
+
export const REQUIRED_TERMINAL_SERVICE_CAPABILITY = Object.freeze({
|
|
4
|
+
pluginId: REQUIRED_TERMINAL_PLUGIN_ID,
|
|
5
|
+
id: "service",
|
|
6
|
+
version: 1,
|
|
7
|
+
parse: snapshotRequiredTerminalService,
|
|
8
|
+
});
|
|
9
|
+
export class RequiredTerminalUnavailableError extends Error {
|
|
10
|
+
constructor() {
|
|
11
|
+
super(...arguments);
|
|
12
|
+
this.name = "RequiredTerminalUnavailableError";
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export function snapshotRequiredTerminalService(value) {
|
|
16
|
+
if (!isRecord(value))
|
|
17
|
+
throw new Error("Required Terminal server entry did not provide its composition service");
|
|
18
|
+
const closeForCwd = value["closeForCwd"];
|
|
19
|
+
const runCommand = value["runCommand"];
|
|
20
|
+
const bindActivitySink = value["bindActivitySink"];
|
|
21
|
+
if (typeof closeForCwd !== "function" || typeof runCommand !== "function" || typeof bindActivitySink !== "function") {
|
|
22
|
+
throw new Error("Required Terminal server entry did not provide its composition service");
|
|
23
|
+
}
|
|
24
|
+
return Object.freeze({
|
|
25
|
+
closeForCwd: (cwd) => { Reflect.apply(closeForCwd, value, [cwd]); },
|
|
26
|
+
runCommand: (options) => requireCommandRun(Reflect.apply(runCommand, value, [options])),
|
|
27
|
+
bindActivitySink: (sink) => {
|
|
28
|
+
Reflect.apply(bindActivitySink, value, [Object.freeze({
|
|
29
|
+
updateTerminal: (terminal) => { sink.updateTerminal(terminal); },
|
|
30
|
+
removeTerminal: (terminalId, cwd) => { sink.removeTerminal(terminalId, cwd); },
|
|
31
|
+
})]);
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
export function unavailableRequiredTerminalService() {
|
|
36
|
+
const unavailable = () => {
|
|
37
|
+
throw new RequiredTerminalUnavailableError("Required Terminal plugin is unavailable in recovery safe start; workspace removal cannot continue");
|
|
38
|
+
};
|
|
39
|
+
return Object.freeze({
|
|
40
|
+
closeForCwd: unavailable,
|
|
41
|
+
runCommand: unavailable,
|
|
42
|
+
bindActivitySink: () => undefined,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
function requireCommandRun(value) {
|
|
46
|
+
if (!isRecord(value))
|
|
47
|
+
throw invalidCommandRun();
|
|
48
|
+
const status = value["status"];
|
|
49
|
+
const exitCode = optionalFiniteNumber(value["exitCode"]);
|
|
50
|
+
const startedAt = optionalString(value["startedAt"]);
|
|
51
|
+
const completedAt = optionalString(value["completedAt"]);
|
|
52
|
+
if (typeof value["id"] !== "string"
|
|
53
|
+
|| typeof value["origin"] !== "string"
|
|
54
|
+
|| typeof value["projectId"] !== "string"
|
|
55
|
+
|| typeof value["workspaceId"] !== "string"
|
|
56
|
+
|| typeof value["terminalId"] !== "string"
|
|
57
|
+
|| typeof value["title"] !== "string"
|
|
58
|
+
|| typeof value["command"] !== "string"
|
|
59
|
+
|| (status !== "queued" && status !== "running" && status !== "succeeded" && status !== "failed")
|
|
60
|
+
|| exitCode === invalidOptionalField
|
|
61
|
+
|| typeof value["createdAt"] !== "string"
|
|
62
|
+
|| startedAt === invalidOptionalField
|
|
63
|
+
|| completedAt === invalidOptionalField
|
|
64
|
+
|| !isStringRecord(value["metadata"])) {
|
|
65
|
+
throw invalidCommandRun();
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
id: value["id"],
|
|
69
|
+
origin: value["origin"],
|
|
70
|
+
projectId: value["projectId"],
|
|
71
|
+
workspaceId: value["workspaceId"],
|
|
72
|
+
terminalId: value["terminalId"],
|
|
73
|
+
title: value["title"],
|
|
74
|
+
command: value["command"],
|
|
75
|
+
status,
|
|
76
|
+
...(exitCode === undefined ? {} : { exitCode }),
|
|
77
|
+
createdAt: value["createdAt"],
|
|
78
|
+
...(startedAt === undefined ? {} : { startedAt }),
|
|
79
|
+
...(completedAt === undefined ? {} : { completedAt }),
|
|
80
|
+
metadata: { ...value["metadata"] },
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
const invalidOptionalField = Symbol("invalid optional Terminal field");
|
|
84
|
+
function optionalFiniteNumber(value) {
|
|
85
|
+
if (value === undefined)
|
|
86
|
+
return undefined;
|
|
87
|
+
return typeof value === "number" && Number.isFinite(value) ? value : invalidOptionalField;
|
|
88
|
+
}
|
|
89
|
+
function optionalString(value) {
|
|
90
|
+
if (value === undefined)
|
|
91
|
+
return undefined;
|
|
92
|
+
return typeof value === "string" ? value : invalidOptionalField;
|
|
93
|
+
}
|
|
94
|
+
function isStringRecord(value) {
|
|
95
|
+
return isRecord(value) && Object.values(value).every((child) => typeof child === "string");
|
|
96
|
+
}
|
|
97
|
+
function invalidCommandRun() {
|
|
98
|
+
return new Error("Required Terminal server entry returned an invalid command run");
|
|
99
|
+
}
|
|
100
|
+
function isRecord(value) {
|
|
101
|
+
return typeof value === "object" && value !== null;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=requiredTerminalService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requiredTerminalService.js","sourceRoot":"","sources":["../../../src/server/terminals/requiredTerminalService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,59 @@
|
|
|
1
1
|
import { WebSocket } from "ws";
|
|
2
|
+
import { boundedPluginBackendChannelCloseReason, PLUGIN_BACKEND_CHANNEL_DATA_FRAME_MAX_BYTES, PLUGIN_BACKEND_CHANNEL_DRAIN_TIMEOUT_MS, PLUGIN_BACKEND_CHANNEL_OPEN_FRAME_MAX_BYTES, PLUGIN_BACKEND_CHANNEL_QUEUE_MAX_BYTES, PLUGIN_BACKEND_CHANNEL_QUEUE_MAX_FRAMES, PLUGIN_BACKEND_CHANNEL_SERVER_TO_BROWSER_QUEUE_MAX_BYTES, PLUGIN_BACKEND_CHANNEL_TEARDOWN_TIMEOUT_MS, utf8ByteLength, } from "../shared/pluginBackendProtocol.js";
|
|
3
|
+
const pluginChannelLimitedServers = new WeakSet();
|
|
4
|
+
const pendingPluginBackendChannelUpgrades = new WeakSet();
|
|
5
|
+
export class PluginBackendChannelTransportFrameError extends Error {
|
|
6
|
+
constructor(closeCode, message, options) {
|
|
7
|
+
super(message, options);
|
|
8
|
+
this.closeCode = closeCode;
|
|
9
|
+
this.name = "PluginBackendChannelTransportFrameError";
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/** Decode one opaque text frame while enforcing only physical-hop bounds. */
|
|
13
|
+
export function decodeBoundedPluginBackendChannelTextFrame(data, isBinary, maxBytes, label) {
|
|
14
|
+
if (isBinary) {
|
|
15
|
+
throw new PluginBackendChannelTransportFrameError(1003, "Plugin backend channels accept text frames only");
|
|
16
|
+
}
|
|
17
|
+
if (typeof data === "string") {
|
|
18
|
+
if (utf8ByteLength(data) > maxBytes) {
|
|
19
|
+
throw new PluginBackendChannelTransportFrameError(1009, `${label} exceeds the ${String(maxBytes)} byte transport limit`);
|
|
20
|
+
}
|
|
21
|
+
return data;
|
|
22
|
+
}
|
|
23
|
+
const bytes = data instanceof ArrayBuffer
|
|
24
|
+
? new Uint8Array(data)
|
|
25
|
+
: Array.isArray(data)
|
|
26
|
+
? Buffer.concat(data)
|
|
27
|
+
: data;
|
|
28
|
+
if (bytes.byteLength > maxBytes) {
|
|
29
|
+
throw new PluginBackendChannelTransportFrameError(1009, `${label} exceeds the ${String(maxBytes)} byte transport limit`);
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
throw new PluginBackendChannelTransportFrameError(1007, `${label} must be valid UTF-8 text`, { cause: error });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/** Mark a Fastify-matched paired-channel request before ws allocates its receiver. */
|
|
39
|
+
export function markPluginBackendChannelUpgradeRequest(request) {
|
|
40
|
+
pendingPluginBackendChannelUpgrades.add(request);
|
|
41
|
+
}
|
|
42
|
+
/** Select the plugin-channel ingress cap before ws allocates its receiver. */
|
|
43
|
+
export function installPluginBackendChannelWebSocketPayloadLimit(server) {
|
|
44
|
+
if (pluginChannelLimitedServers.has(server))
|
|
45
|
+
return;
|
|
46
|
+
pluginChannelLimitedServers.add(server);
|
|
47
|
+
const defaultMaxPayload = server.options.maxPayload;
|
|
48
|
+
server.on("headers", (_headers, request) => {
|
|
49
|
+
// The ws `headers` event runs synchronously immediately before setSocket()
|
|
50
|
+
// reads this option. Reset every unrelated upgrade so session protocols keep
|
|
51
|
+
// the server's configured allowance.
|
|
52
|
+
server.options.maxPayload = pendingPluginBackendChannelUpgrades.delete(request)
|
|
53
|
+
? PLUGIN_BACKEND_CHANNEL_OPEN_FRAME_MAX_BYTES
|
|
54
|
+
: defaultMaxPayload;
|
|
55
|
+
});
|
|
56
|
+
}
|
|
2
57
|
export function bridgeSockets(client, upstream) {
|
|
3
58
|
const sendToClient = createBufferedSender(client);
|
|
4
59
|
const sendToUpstream = createBufferedSender(upstream);
|
|
@@ -29,4 +84,288 @@ export function createBufferedSender(socket) {
|
|
|
29
84
|
queue.push(data);
|
|
30
85
|
};
|
|
31
86
|
}
|
|
87
|
+
/** One-at-a-time sender whose connecting and socket-write queue is explicitly bounded. */
|
|
88
|
+
export function createBoundedTextWebSocketSender(socket, options = {}) {
|
|
89
|
+
const maxFrames = options.maxFrames ?? PLUGIN_BACKEND_CHANNEL_QUEUE_MAX_FRAMES;
|
|
90
|
+
const maxBytes = options.maxBytes ?? PLUGIN_BACKEND_CHANNEL_QUEUE_MAX_BYTES;
|
|
91
|
+
const queue = [];
|
|
92
|
+
const drainWaiters = new Set();
|
|
93
|
+
let queuedBytes = 0;
|
|
94
|
+
let sending = false;
|
|
95
|
+
let failure;
|
|
96
|
+
const settleDrainWaiters = () => {
|
|
97
|
+
if (failure === undefined && (sending || queue.length !== 0))
|
|
98
|
+
return;
|
|
99
|
+
for (const waiter of drainWaiters) {
|
|
100
|
+
clearTimeout(waiter.timer);
|
|
101
|
+
if (failure === undefined)
|
|
102
|
+
waiter.resolve();
|
|
103
|
+
else
|
|
104
|
+
waiter.reject(failure);
|
|
105
|
+
}
|
|
106
|
+
drainWaiters.clear();
|
|
107
|
+
};
|
|
108
|
+
const fail = (error) => {
|
|
109
|
+
if (failure !== undefined)
|
|
110
|
+
return;
|
|
111
|
+
failure = error;
|
|
112
|
+
options.onOverflow?.(error);
|
|
113
|
+
settleDrainWaiters();
|
|
114
|
+
};
|
|
115
|
+
const flush = () => {
|
|
116
|
+
if (sending || failure !== undefined || socket.readyState !== WebSocket.OPEN)
|
|
117
|
+
return;
|
|
118
|
+
const frame = queue[0];
|
|
119
|
+
if (frame === undefined) {
|
|
120
|
+
settleDrainWaiters();
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
sending = true;
|
|
124
|
+
try {
|
|
125
|
+
socket.send(frame.text, { binary: false }, (error) => {
|
|
126
|
+
sending = false;
|
|
127
|
+
if (queue[0] === frame) {
|
|
128
|
+
queue.shift();
|
|
129
|
+
queuedBytes -= frame.bytes;
|
|
130
|
+
}
|
|
131
|
+
if (error) {
|
|
132
|
+
fail(new Error(`Plugin backend channel socket send failed: ${error.message}`, { cause: error }));
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
flush();
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
sending = false;
|
|
140
|
+
if (queue[0] === frame) {
|
|
141
|
+
queue.shift();
|
|
142
|
+
queuedBytes -= frame.bytes;
|
|
143
|
+
}
|
|
144
|
+
fail(error instanceof Error ? error : new Error(String(error)));
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
if (socket.readyState === WebSocket.CONNECTING)
|
|
148
|
+
socket.once("open", flush);
|
|
149
|
+
const send = (text) => {
|
|
150
|
+
if (failure !== undefined || (socket.readyState !== WebSocket.OPEN && socket.readyState !== WebSocket.CONNECTING)) {
|
|
151
|
+
throw new Error("Plugin backend channel socket is not open");
|
|
152
|
+
}
|
|
153
|
+
const bytes = utf8ByteLength(text);
|
|
154
|
+
if (queue.length >= maxFrames || queuedBytes + bytes > maxBytes) {
|
|
155
|
+
const error = new Error("Plugin backend channel socket queue limit was exceeded");
|
|
156
|
+
fail(error);
|
|
157
|
+
throw error;
|
|
158
|
+
}
|
|
159
|
+
queue.push({ text, bytes });
|
|
160
|
+
queuedBytes += bytes;
|
|
161
|
+
flush();
|
|
162
|
+
};
|
|
163
|
+
const drain = (timeoutMs = PLUGIN_BACKEND_CHANNEL_DRAIN_TIMEOUT_MS) => {
|
|
164
|
+
if (failure !== undefined)
|
|
165
|
+
return Promise.reject(failure);
|
|
166
|
+
if (!sending && queue.length === 0)
|
|
167
|
+
return Promise.resolve();
|
|
168
|
+
return new Promise((resolve, reject) => {
|
|
169
|
+
const waiter = {
|
|
170
|
+
resolve,
|
|
171
|
+
reject,
|
|
172
|
+
timer: setTimeout(() => {
|
|
173
|
+
drainWaiters.delete(waiter);
|
|
174
|
+
reject(new Error(`Plugin backend channel socket drain timed out after ${String(timeoutMs)}ms`));
|
|
175
|
+
}, timeoutMs),
|
|
176
|
+
};
|
|
177
|
+
waiter.timer.unref();
|
|
178
|
+
drainWaiters.add(waiter);
|
|
179
|
+
});
|
|
180
|
+
};
|
|
181
|
+
return Object.assign(send, { drain });
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Boundedly bridge opaque generic-channel text without reading plugin or host
|
|
185
|
+
* envelope semantics. The returned lifetime resolves only after both physical
|
|
186
|
+
* sockets have closed and accepted clean-close frames have drained.
|
|
187
|
+
*/
|
|
188
|
+
export function bridgePluginBackendChannelSockets(client, upstream, options = {}) {
|
|
189
|
+
setPluginBackendChannelSocketPayloadLimit(client, PLUGIN_BACKEND_CHANNEL_OPEN_FRAME_MAX_BYTES);
|
|
190
|
+
let closing = false;
|
|
191
|
+
let closeNotified = false;
|
|
192
|
+
let receivedClientFrame = false;
|
|
193
|
+
let resolveCompletion = () => undefined;
|
|
194
|
+
const completion = new Promise((resolve) => { resolveCompletion = resolve; });
|
|
195
|
+
const isClosing = () => closing;
|
|
196
|
+
const detachBridgeListeners = () => {
|
|
197
|
+
client.off("message", onClientMessage);
|
|
198
|
+
upstream.off("message", onUpstreamMessage);
|
|
199
|
+
client.off("close", onClientClose);
|
|
200
|
+
upstream.off("close", onUpstreamClose);
|
|
201
|
+
client.off("error", onClientError);
|
|
202
|
+
upstream.off("error", onUpstreamError);
|
|
203
|
+
};
|
|
204
|
+
const notifyClosed = () => {
|
|
205
|
+
if (closeNotified)
|
|
206
|
+
return;
|
|
207
|
+
closeNotified = true;
|
|
208
|
+
detachBridgeListeners();
|
|
209
|
+
resolveCompletion();
|
|
210
|
+
};
|
|
211
|
+
const fail = (code, reason) => {
|
|
212
|
+
if (closing)
|
|
213
|
+
return;
|
|
214
|
+
closing = true;
|
|
215
|
+
void Promise.allSettled([
|
|
216
|
+
closePluginBackendChannelWebSocket(client, code, reason),
|
|
217
|
+
closePluginBackendChannelWebSocket(upstream, code, reason),
|
|
218
|
+
]).finally(notifyClosed);
|
|
219
|
+
};
|
|
220
|
+
const sendToClient = createBoundedTextWebSocketSender(client, {
|
|
221
|
+
maxBytes: PLUGIN_BACKEND_CHANNEL_SERVER_TO_BROWSER_QUEUE_MAX_BYTES,
|
|
222
|
+
onOverflow: (error) => { fail(1013, error.message); },
|
|
223
|
+
});
|
|
224
|
+
const sendToUpstream = createBoundedTextWebSocketSender(upstream, {
|
|
225
|
+
onOverflow: (error) => { fail(1013, error.message); },
|
|
226
|
+
});
|
|
227
|
+
const forwardClientFrame = (data, isBinary) => {
|
|
228
|
+
const firstFrame = !receivedClientFrame;
|
|
229
|
+
const text = decodeBoundedPluginBackendChannelTextFrame(data, isBinary, firstFrame ? PLUGIN_BACKEND_CHANNEL_OPEN_FRAME_MAX_BYTES : PLUGIN_BACKEND_CHANNEL_DATA_FRAME_MAX_BYTES, firstFrame ? "Plugin backend channel first client frame" : "Plugin backend channel client frame");
|
|
230
|
+
if (firstFrame) {
|
|
231
|
+
receivedClientFrame = true;
|
|
232
|
+
setPluginBackendChannelSocketPayloadLimit(client, PLUGIN_BACKEND_CHANNEL_DATA_FRAME_MAX_BYTES);
|
|
233
|
+
}
|
|
234
|
+
sendToUpstream(text);
|
|
235
|
+
};
|
|
236
|
+
function onClientMessage(data, isBinary) {
|
|
237
|
+
try {
|
|
238
|
+
forwardClientFrame(data, isBinary);
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
fail(transportFrameCloseCode(error), bridgeErrorMessage(error));
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
function onUpstreamMessage(data, isBinary) {
|
|
245
|
+
try {
|
|
246
|
+
const text = decodeBoundedPluginBackendChannelTextFrame(data, isBinary, PLUGIN_BACKEND_CHANNEL_DATA_FRAME_MAX_BYTES, "Plugin backend channel upstream frame");
|
|
247
|
+
sendToClient(text);
|
|
248
|
+
}
|
|
249
|
+
catch (error) {
|
|
250
|
+
fail(transportFrameCloseCode(error), bridgeErrorMessage(error));
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
function onClientClose(code, reason) {
|
|
254
|
+
if (closing)
|
|
255
|
+
return;
|
|
256
|
+
closing = true;
|
|
257
|
+
void propagatePluginChannelClose(upstream, sendToUpstream, code, decodeCloseReason(reason)).finally(notifyClosed);
|
|
258
|
+
}
|
|
259
|
+
function onUpstreamClose(code, reason) {
|
|
260
|
+
if (closing)
|
|
261
|
+
return;
|
|
262
|
+
closing = true;
|
|
263
|
+
void propagatePluginChannelClose(client, sendToClient, code, decodeCloseReason(reason)).finally(notifyClosed);
|
|
264
|
+
}
|
|
265
|
+
function onClientError(error) {
|
|
266
|
+
fail(1011, `Plugin backend channel client transport failed: ${bridgeErrorMessage(error)}`);
|
|
267
|
+
}
|
|
268
|
+
function onUpstreamError(error) {
|
|
269
|
+
fail(1011, `Plugin backend channel upstream transport failed: ${bridgeErrorMessage(error)}`);
|
|
270
|
+
}
|
|
271
|
+
client.on("message", onClientMessage);
|
|
272
|
+
upstream.on("message", onUpstreamMessage);
|
|
273
|
+
client.once("close", onClientClose);
|
|
274
|
+
upstream.once("close", onUpstreamClose);
|
|
275
|
+
client.once("error", onClientError);
|
|
276
|
+
upstream.once("error", onUpstreamError);
|
|
277
|
+
for (const text of options.initialClientFrames ?? []) {
|
|
278
|
+
if (isClosing())
|
|
279
|
+
break;
|
|
280
|
+
try {
|
|
281
|
+
forwardClientFrame(text, false);
|
|
282
|
+
}
|
|
283
|
+
catch (error) {
|
|
284
|
+
fail(transportFrameCloseCode(error), bridgeErrorMessage(error));
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return completion;
|
|
288
|
+
}
|
|
289
|
+
async function propagatePluginChannelClose(target, sender, code, reason) {
|
|
290
|
+
const closeCode = transferableCloseCode(code);
|
|
291
|
+
if (closeCode === 1000) {
|
|
292
|
+
try {
|
|
293
|
+
await sender.drain();
|
|
294
|
+
}
|
|
295
|
+
catch (error) {
|
|
296
|
+
await closePluginBackendChannelWebSocket(target, 1011, `Plugin backend channel clean-close drain failed: ${bridgeErrorMessage(error)}`);
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
await closePluginBackendChannelWebSocket(target, closeCode, reason);
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* `@fastify/websocket` owns one ws server for unrelated routes, so its public
|
|
304
|
+
* maxPayload option cannot express this route's smaller protocol bound. Update
|
|
305
|
+
* the ws receiver before route listeners run, then tighten it after the larger
|
|
306
|
+
* first open frame. Keep this compatibility seam isolated and fail loudly if a
|
|
307
|
+
* future ws version changes the receiver shape.
|
|
308
|
+
*/
|
|
309
|
+
export function setPluginBackendChannelSocketPayloadLimit(socket, maxPayload) {
|
|
310
|
+
const receiver = Reflect.get(socket, "_receiver");
|
|
311
|
+
if (typeof receiver !== "object" || receiver === null || typeof Reflect.get(receiver, "_maxPayload") !== "number") {
|
|
312
|
+
throw new Error("Plugin backend channel transport cannot apply its payload limit");
|
|
313
|
+
}
|
|
314
|
+
if (!Reflect.set(receiver, "_maxPayload", maxPayload)) {
|
|
315
|
+
throw new Error("Plugin backend channel transport cannot apply its payload limit");
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
function transportFrameCloseCode(error) {
|
|
319
|
+
return error instanceof PluginBackendChannelTransportFrameError ? error.closeCode : 1011;
|
|
320
|
+
}
|
|
321
|
+
function decodeCloseReason(reason) {
|
|
322
|
+
try {
|
|
323
|
+
return new TextDecoder("utf-8", { fatal: true }).decode(reason);
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
return "Invalid close reason";
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
function transferableCloseCode(code) {
|
|
330
|
+
return code === 1000 || (code >= 1001 && code <= 1014 && code !== 1004 && code !== 1005 && code !== 1006)
|
|
331
|
+
? code
|
|
332
|
+
: 1011;
|
|
333
|
+
}
|
|
334
|
+
/** Resolve only after the physical socket closes, terminating a non-cooperating peer at the hard deadline. */
|
|
335
|
+
export function closePluginBackendChannelWebSocket(socket, code, reason, options = {}) {
|
|
336
|
+
if (socket.readyState === WebSocket.CLOSED)
|
|
337
|
+
return Promise.resolve();
|
|
338
|
+
return new Promise((resolve) => {
|
|
339
|
+
let settled = false;
|
|
340
|
+
const consumeExpectedError = () => undefined;
|
|
341
|
+
const finish = () => {
|
|
342
|
+
if (settled)
|
|
343
|
+
return;
|
|
344
|
+
settled = true;
|
|
345
|
+
clearTimeout(timer);
|
|
346
|
+
socket.off("close", finish);
|
|
347
|
+
socket.off("error", consumeExpectedError);
|
|
348
|
+
resolve();
|
|
349
|
+
};
|
|
350
|
+
const timer = setTimeout(() => {
|
|
351
|
+
if (socket.readyState !== WebSocket.CLOSED)
|
|
352
|
+
socket.terminate();
|
|
353
|
+
}, options.teardownTimeoutMs ?? PLUGIN_BACKEND_CHANNEL_TEARDOWN_TIMEOUT_MS);
|
|
354
|
+
timer.unref();
|
|
355
|
+
socket.once("close", finish);
|
|
356
|
+
socket.once("error", consumeExpectedError);
|
|
357
|
+
if (options.terminateImmediately === true || socket.readyState === WebSocket.CONNECTING) {
|
|
358
|
+
socket.terminate();
|
|
359
|
+
}
|
|
360
|
+
else if (socket.readyState === WebSocket.OPEN) {
|
|
361
|
+
socket.close(code, boundedPluginBackendChannelCloseReason(reason));
|
|
362
|
+
}
|
|
363
|
+
if (socket.readyState === WebSocket.CLOSED)
|
|
364
|
+
finish();
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
function bridgeErrorMessage(error) {
|
|
368
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
369
|
+
return boundedPluginBackendChannelCloseReason(message);
|
|
370
|
+
}
|
|
32
371
|
//# sourceMappingURL=webSocketBridge.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webSocketBridge.js","sourceRoot":"","sources":["../../src/server/webSocketBridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAa,MAAM,IAAI,CAAC;AAE1C,MAAM,UAAU,aAAa,CAAC,MAAiB,EAAE,QAAmB;IAClE,MAAM,YAAY,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,cAAc,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACtD,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,OAAO,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;YAC3B,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAO;YAC/B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC;IACF,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACzB,OAAO,CAAC,IAAI,EAAE,EAAE;QACd,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO;QACT,CAAC;QACD,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,UAAU;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"webSocketBridge.js","sourceRoot":"","sources":["../../src/server/webSocketBridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { readFile } from "node:fs/promises";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
-
import { effectiveUploadsConfig, parsePathAccessConfig, parseUploadsConfig } from "../../config.js";
|
|
3
|
+
import { effectiveAttachmentsConfig, effectiveUploadsConfig, parseAttachmentsConfig, parsePathAccessConfig, parseUploadsConfig } from "../../config.js";
|
|
4
4
|
export const PROJECT_PI_WEB_CONFIG_PATH = ".pi-web/config.json";
|
|
5
5
|
export async function loadProjectPiWebConfig(projectPath) {
|
|
6
6
|
const path = join(projectPath, PROJECT_PI_WEB_CONFIG_PATH);
|
|
@@ -24,6 +24,10 @@ export async function loadEffectiveProjectUploadsConfig(projectPath, globalConfi
|
|
|
24
24
|
const projectConfig = await loadProjectPiWebConfig(projectPath);
|
|
25
25
|
return effectiveUploadsConfig({ uploads: { ...(globalConfig.uploads ?? {}), ...(projectConfig.config.uploads ?? {}) } });
|
|
26
26
|
}
|
|
27
|
+
export async function loadEffectiveProjectAttachmentsConfig(projectPath, globalConfig) {
|
|
28
|
+
const projectConfig = await loadProjectPiWebConfig(projectPath);
|
|
29
|
+
return effectiveAttachmentsConfig({ attachments: { ...(globalConfig.attachments ?? {}), ...(projectConfig.config.attachments ?? {}) } });
|
|
30
|
+
}
|
|
27
31
|
export function mergePathAccessConfigs(...configs) {
|
|
28
32
|
const allowedPaths = dedupe(configs.flatMap((config) => config?.allowedPaths ?? []));
|
|
29
33
|
return allowedPaths.length === 0 ? undefined : { allowedPaths };
|
|
@@ -34,6 +38,7 @@ function parseProjectPiWebConfig(value, path) {
|
|
|
34
38
|
...(version !== undefined ? { version: parseProjectConfigVersion(version, path) } : {}),
|
|
35
39
|
...(value["pathAccess"] !== undefined ? { pathAccess: parsePathAccessConfig(value["pathAccess"], path) } : {}),
|
|
36
40
|
...(value["uploads"] !== undefined ? { uploads: parseUploadsConfig(value["uploads"], path) } : {}),
|
|
41
|
+
...(value["attachments"] !== undefined ? { attachments: parseAttachmentsConfig(value["attachments"], path) } : {}),
|
|
37
42
|
};
|
|
38
43
|
}
|
|
39
44
|
function parseProjectConfigVersion(value, path) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projectPiWebConfig.js","sourceRoot":"","sources":["../../../src/server/workspaces/projectPiWebConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,kBAAkB,EAAoB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"projectPiWebConfig.js","sourceRoot":"","sources":["../../../src/server/workspaces/projectPiWebConfig.ts"],"names":[],"mappings":"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"}
|
|
@@ -169,7 +169,6 @@ function parseProvider(value, workspaceLabel) {
|
|
|
169
169
|
return Object.freeze({
|
|
170
170
|
pluginId: requirePluginId(value, "pluginId", label),
|
|
171
171
|
capabilities: Object.freeze({
|
|
172
|
-
request: requireBoolean(capabilities, "request", `${label} capabilities`),
|
|
173
172
|
remove: requireBoolean(capabilities, "remove", `${label} capabilities`),
|
|
174
173
|
}),
|
|
175
174
|
...(metadata === undefined ? {} : { metadata }),
|
|
@@ -191,12 +190,17 @@ function parseProviderRuntimeSnapshot(value) {
|
|
|
191
190
|
if (value["protocolVersion"] !== WORKSPACE_PROVIDER_RUNTIME_PROTOCOL_VERSION) {
|
|
192
191
|
throw protocolError("provider runtime protocol is unsupported; restart or upgrade the session daemon");
|
|
193
192
|
}
|
|
193
|
+
const terminalMode = parseTerminalMode(value["terminalMode"]);
|
|
194
194
|
const safeStart = parseSafeStart(value["safeStart"]);
|
|
195
|
+
if ((safeStart === "none") !== (terminalMode === "recovery-disabled")) {
|
|
196
|
+
throw protocolError("provider runtime terminalMode does not match safeStart");
|
|
197
|
+
}
|
|
195
198
|
const records = parseArray(value["records"], "provider runtime records", parseRuntimeRecord);
|
|
196
199
|
const health = parseArray(value["health"], "provider runtime health", parseHealthInspection);
|
|
197
200
|
const diagnostics = parseArray(value["diagnostics"], "provider runtime diagnostics", parseCatalogDiagnostic);
|
|
198
201
|
return Object.freeze({
|
|
199
202
|
protocolVersion: WORKSPACE_PROVIDER_RUNTIME_PROTOCOL_VERSION,
|
|
203
|
+
terminalMode,
|
|
200
204
|
...(safeStart === undefined ? {} : { safeStart }),
|
|
201
205
|
records: Object.freeze(records),
|
|
202
206
|
health: Object.freeze(health),
|
|
@@ -220,6 +224,8 @@ function parseRuntimeRecord(value, index) {
|
|
|
220
224
|
const name = optionalString(value, "name", label);
|
|
221
225
|
const message = optionalString(value, "message", label);
|
|
222
226
|
const browserRevision = optionalString(value, "browserRevision", label);
|
|
227
|
+
const pairedRequestVersion = parsePairedCapabilityVersion(value["pairedRequestVersion"], label, "request");
|
|
228
|
+
const pairedChannelVersion = parsePairedCapabilityVersion(value["pairedChannelVersion"], label, "channel");
|
|
223
229
|
return Object.freeze({
|
|
224
230
|
pluginId: requirePluginId(value, "pluginId", label),
|
|
225
231
|
source: requireString(value, "source", label),
|
|
@@ -228,12 +234,21 @@ function parseRuntimeRecord(value, index) {
|
|
|
228
234
|
...(browserRevision === undefined ? {} : { browserRevision }),
|
|
229
235
|
settingsRevision: requireString(value, "settingsRevision", label),
|
|
230
236
|
machineSpecific: requireBoolean(value, "machineSpecific", label),
|
|
237
|
+
...(pairedRequestVersion === undefined ? {} : { pairedRequestVersion }),
|
|
238
|
+
...(pairedChannelVersion === undefined ? {} : { pairedChannelVersion }),
|
|
231
239
|
state,
|
|
232
240
|
...(name === undefined ? {} : { name }),
|
|
233
241
|
...(phase === undefined ? {} : { phase }),
|
|
234
242
|
...(message === undefined ? {} : { message }),
|
|
235
243
|
});
|
|
236
244
|
}
|
|
245
|
+
function parsePairedCapabilityVersion(value, label, capability) {
|
|
246
|
+
if (value === undefined)
|
|
247
|
+
return undefined;
|
|
248
|
+
if (value !== 1)
|
|
249
|
+
throw protocolError(`${label} paired ${capability} version is invalid`);
|
|
250
|
+
return value;
|
|
251
|
+
}
|
|
237
252
|
function parseCatalogDiagnostic(value, index) {
|
|
238
253
|
const label = `provider runtime diagnostic ${String(index + 1)}`;
|
|
239
254
|
if (!isRecord(value))
|
|
@@ -280,6 +295,11 @@ function parseHealth(value, inspectionLabel) {
|
|
|
280
295
|
...(details === undefined ? {} : { details }),
|
|
281
296
|
});
|
|
282
297
|
}
|
|
298
|
+
function parseTerminalMode(value) {
|
|
299
|
+
if (value === "required" || value === "recovery-disabled")
|
|
300
|
+
return value;
|
|
301
|
+
throw protocolError("provider runtime terminalMode is invalid");
|
|
302
|
+
}
|
|
283
303
|
function parseSafeStart(value) {
|
|
284
304
|
if (value === undefined)
|
|
285
305
|
return undefined;
|
|
@@ -349,10 +369,10 @@ function isRuntimeState(value) {
|
|
|
349
369
|
return value === "active" || value === "failed" || value === "incompatible" || value === "disabled";
|
|
350
370
|
}
|
|
351
371
|
function isLifecyclePhase(value) {
|
|
352
|
-
return value === "import" || value === "activate" || value === "validate" || value === "start" || value === "health" || value === "
|
|
372
|
+
return value === "import" || value === "activate" || value === "validate" || value === "start" || value === "health" || value === "dispose";
|
|
353
373
|
}
|
|
354
374
|
function isCatalogDiagnosticCode(value) {
|
|
355
|
-
return value === "invalid-package" || value === "duplicate-id";
|
|
375
|
+
return value === "invalid-package" || value === "reserved-id" || value === "duplicate-id" || value === "required-plugin-config";
|
|
356
376
|
}
|
|
357
377
|
function encodedId(value, label) {
|
|
358
378
|
if (value === "")
|