@hyperdreamer/pi-webui 1.6.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/LICENSE +23 -0
- package/README.md +148 -0
- package/dist/cli.js +975 -0
- package/dist/cli.js.map +1 -0
- package/dist/client/apple-touch-icon.png +0 -0
- package/dist/client/assets/CodeViewer-aB4ZVzEu.js +4 -0
- package/dist/client/assets/UnifiedDiffViewer-f8X7aTkU.js +39 -0
- package/dist/client/assets/index-Cffeusjy.js +6022 -0
- package/dist/client/assets/vendor-editor-core-vUi74DnD.js +12 -0
- package/dist/client/assets/vendor-editor-languages-DoaXUodB.js +46 -0
- package/dist/client/assets/vendor-editor-legacy-CYBnW6ZU.js +1 -0
- package/dist/client/assets/vendor-terminal-BrP-ENHg.css +1 -0
- package/dist/client/assets/vendor-terminal-D8k4UKM2.js +35 -0
- package/dist/client/favicon.svg +8 -0
- package/dist/client/index.html +65 -0
- package/dist/client/manifest.webmanifest +24 -0
- package/dist/client/pwa-icon-192.png +0 -0
- package/dist/client/pwa-icon-512.png +0 -0
- package/dist/config.js +417 -0
- package/dist/config.js.map +1 -0
- package/dist/docker/piWebUiDockerCommandPlan.js +211 -0
- package/dist/docker/piWebUiDockerCommandPlan.js.map +1 -0
- package/dist/nativeServices/serviceDoctor.js +480 -0
- package/dist/nativeServices/serviceDoctor.js.map +1 -0
- package/dist/nativeServices/serviceInstall.js +35 -0
- package/dist/nativeServices/serviceInstall.js.map +1 -0
- package/dist/nativeServices/servicePlan.js +358 -0
- package/dist/nativeServices/servicePlan.js.map +1 -0
- package/dist/nativeServices/serviceProbe.js +447 -0
- package/dist/nativeServices/serviceProbe.js.map +1 -0
- package/dist/nativeServices/serviceRendering.js +122 -0
- package/dist/nativeServices/serviceRendering.js.map +1 -0
- package/dist/pi-webui-plugins/info/package.json +9 -0
- package/dist/pi-webui-plugins/info/pi-webui-plugin.js +51 -0
- package/dist/pi-webui-plugins/updates/package.json +9 -0
- package/dist/pi-webui-plugins/updates/pi-webui-plugin.js +185 -0
- package/dist/pi-webui-plugins/updates/updatesLogic.js +97 -0
- package/dist/pi-webui-plugins/workspace-tasks/config.js +91 -0
- package/dist/pi-webui-plugins/workspace-tasks/package.json +9 -0
- package/dist/pi-webui-plugins/workspace-tasks/pi-webui-plugin.js +48 -0
- package/dist/pi-webui-plugins/workspace-tasks/taskRunner.js +12 -0
- package/dist/pi-webui-plugins/workspace-tasks/tasksPanelElement.js +288 -0
- package/dist/pi-webui-plugins/workspace-tasks/workspaceTasksClient.js +47 -0
- package/dist/piWebUiVersionReport.js +225 -0
- package/dist/piWebUiVersionReport.js.map +1 -0
- package/dist/plugin-api/unstable.d.ts +22 -0
- package/dist/plugin-api.d.ts +199 -0
- package/dist/server/activeAgentProfileProvider.js +25 -0
- package/dist/server/activeAgentProfileProvider.js.map +1 -0
- package/dist/server/activity/workspaceActivityRoutes.js +4 -0
- package/dist/server/activity/workspaceActivityRoutes.js.map +1 -0
- package/dist/server/activity/workspaceActivityService.js +98 -0
- package/dist/server/activity/workspaceActivityService.js.map +1 -0
- package/dist/server/app.js +211 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/browserMessageProjection.js +56 -0
- package/dist/server/browserMessageProjection.js.map +1 -0
- package/dist/server/configRoutes.js +309 -0
- package/dist/server/configRoutes.js.map +1 -0
- package/dist/server/diagnostics/nodePtyNativeModule.js +36 -0
- package/dist/server/diagnostics/nodePtyNativeModule.js.map +1 -0
- package/dist/server/diagnostics/nodePtySpawnHelper.js +135 -0
- package/dist/server/diagnostics/nodePtySpawnHelper.js.map +1 -0
- package/dist/server/git/gitEnv.js +15 -0
- package/dist/server/git/gitEnv.js.map +1 -0
- package/dist/server/git/gitService.js +123 -0
- package/dist/server/git/gitService.js.map +1 -0
- package/dist/server/gitRoutes.js +23 -0
- package/dist/server/gitRoutes.js.map +1 -0
- package/dist/server/index.js +7 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/machines/machineClient.js +172 -0
- package/dist/server/machines/machineClient.js.map +1 -0
- package/dist/server/machines/machinePluginProxyRoutes.js +190 -0
- package/dist/server/machines/machinePluginProxyRoutes.js.map +1 -0
- package/dist/server/machines/machineProxyRoutes.js +172 -0
- package/dist/server/machines/machineProxyRoutes.js.map +1 -0
- package/dist/server/machines/machineRoutes.js +56 -0
- package/dist/server/machines/machineRoutes.js.map +1 -0
- package/dist/server/machines/machineService.js +238 -0
- package/dist/server/machines/machineService.js.map +1 -0
- package/dist/server/machines/machineStore.js +128 -0
- package/dist/server/machines/machineStore.js.map +1 -0
- package/dist/server/models/modelsConfigRoutes.js +40 -0
- package/dist/server/models/modelsConfigRoutes.js.map +1 -0
- package/dist/server/models/modelsConfigService.js +339 -0
- package/dist/server/models/modelsConfigService.js.map +1 -0
- package/dist/server/piPackagePluginsConfigRoutes.js +86 -0
- package/dist/server/piPackagePluginsConfigRoutes.js.map +1 -0
- package/dist/server/piPackagePluginsConfigService.js +311 -0
- package/dist/server/piPackagePluginsConfigService.js.map +1 -0
- package/dist/server/piPackageRoutes.js +91 -0
- package/dist/server/piPackageRoutes.js.map +1 -0
- package/dist/server/piPackageService.js +101 -0
- package/dist/server/piPackageService.js.map +1 -0
- package/dist/server/piWebUiPluginService.js +326 -0
- package/dist/server/piWebUiPluginService.js.map +1 -0
- package/dist/server/piWebUiReleaseLookupCache.js +37 -0
- package/dist/server/piWebUiReleaseLookupCache.js.map +1 -0
- package/dist/server/piWebUiStatus.js +622 -0
- package/dist/server/piWebUiStatus.js.map +1 -0
- package/dist/server/piWebUiStatusCache.js +45 -0
- package/dist/server/piWebUiStatusCache.js.map +1 -0
- package/dist/server/projects/directorySuggestions.js +37 -0
- package/dist/server/projects/directorySuggestions.js.map +1 -0
- package/dist/server/projects/projectService.js +31 -0
- package/dist/server/projects/projectService.js.map +1 -0
- package/dist/server/realtime/sessionEventHub.js +70 -0
- package/dist/server/realtime/sessionEventHub.js.map +1 -0
- package/dist/server/sessiond/sessionDaemonStartup.js +49 -0
- package/dist/server/sessiond/sessionDaemonStartup.js.map +1 -0
- package/dist/server/sessiond/sessionProxyRoutes.js +87 -0
- package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -0
- package/dist/server/sessiond/skillsGithubToken.js +7 -0
- package/dist/server/sessiond/skillsGithubToken.js.map +1 -0
- package/dist/server/sessiond.js +152 -0
- package/dist/server/sessiond.js.map +1 -0
- package/dist/server/sessions/attachmentService.js +119 -0
- package/dist/server/sessions/attachmentService.js.map +1 -0
- package/dist/server/sessions/authProviderOptions.js +50 -0
- package/dist/server/sessions/authProviderOptions.js.map +1 -0
- package/dist/server/sessions/authRoutes.js +69 -0
- package/dist/server/sessions/authRoutes.js.map +1 -0
- package/dist/server/sessions/authService.js +134 -0
- package/dist/server/sessions/authService.js.map +1 -0
- package/dist/server/sessions/builtinCommands.js +27 -0
- package/dist/server/sessions/builtinCommands.js.map +1 -0
- package/dist/server/sessions/editPreview.js +196 -0
- package/dist/server/sessions/editPreview.js.map +1 -0
- package/dist/server/sessions/messagePaging.js +43 -0
- package/dist/server/sessions/messagePaging.js.map +1 -0
- package/dist/server/sessions/oauthLoginFlowService.js +349 -0
- package/dist/server/sessions/oauthLoginFlowService.js.map +1 -0
- package/dist/server/sessions/piSessionManagerGateway.js +115 -0
- package/dist/server/sessions/piSessionManagerGateway.js.map +1 -0
- package/dist/server/sessions/piSessionService.js +3230 -0
- package/dist/server/sessions/piSessionService.js.map +1 -0
- package/dist/server/sessions/plainTextTheme.js +112 -0
- package/dist/server/sessions/plainTextTheme.js.map +1 -0
- package/dist/server/sessions/sessionArchiveMigration.js +590 -0
- package/dist/server/sessions/sessionArchiveMigration.js.map +1 -0
- package/dist/server/sessions/sessionArchiveStore.js +262 -0
- package/dist/server/sessions/sessionArchiveStore.js.map +1 -0
- package/dist/server/sessions/sessionArchiveTree.js +35 -0
- package/dist/server/sessions/sessionArchiveTree.js.map +1 -0
- package/dist/server/sessions/sessionCleanup.js +157 -0
- package/dist/server/sessions/sessionCleanup.js.map +1 -0
- package/dist/server/sessions/sessionCommandService.js +313 -0
- package/dist/server/sessions/sessionCommandService.js.map +1 -0
- package/dist/server/sessions/sessionDefaultsRoutes.js +65 -0
- package/dist/server/sessions/sessionDefaultsRoutes.js.map +1 -0
- package/dist/server/sessions/sessionDefaultsService.js +90 -0
- package/dist/server/sessions/sessionDefaultsService.js.map +1 -0
- package/dist/server/sessions/sessionHistoryExport.js +115 -0
- package/dist/server/sessions/sessionHistoryExport.js.map +1 -0
- package/dist/server/sessions/sessionMetadataStore.js +102 -0
- package/dist/server/sessions/sessionMetadataStore.js.map +1 -0
- package/dist/server/sessions/sessionNameGenerator.js +90 -0
- package/dist/server/sessions/sessionNameGenerator.js.map +1 -0
- package/dist/server/sessions/sessionNotificationStore.js +484 -0
- package/dist/server/sessions/sessionNotificationStore.js.map +1 -0
- package/dist/server/sessions/sessionRoutes.js +590 -0
- package/dist/server/sessions/sessionRoutes.js.map +1 -0
- package/dist/server/sessions/sessionRuntimeStore.js +2 -0
- package/dist/server/sessions/sessionRuntimeStore.js.map +1 -0
- package/dist/server/sessions/sessionService.js +2 -0
- package/dist/server/sessions/sessionService.js.map +1 -0
- package/dist/server/sessions/sessionTreeProjection.js +250 -0
- package/dist/server/sessions/sessionTreeProjection.js.map +1 -0
- package/dist/server/sessions/sessionUnreadStore.js +520 -0
- package/dist/server/sessions/sessionUnreadStore.js.map +1 -0
- package/dist/server/sessions/spawnSessionTool.js +41 -0
- package/dist/server/sessions/spawnSessionTool.js.map +1 -0
- package/dist/server/sessions/spawnSubsessionTool.js +214 -0
- package/dist/server/sessions/spawnSubsessionTool.js.map +1 -0
- package/dist/server/sessions/spawnTargetResolver.js +36 -0
- package/dist/server/sessions/spawnTargetResolver.js.map +1 -0
- package/dist/server/sessions/subsessionTranscript.js +235 -0
- package/dist/server/sessions/subsessionTranscript.js.map +1 -0
- package/dist/server/skills/runNpx.js +30 -0
- package/dist/server/skills/runNpx.js.map +1 -0
- package/dist/server/skills/skillLock.js +115 -0
- package/dist/server/skills/skillLock.js.map +1 -0
- package/dist/server/skills/skillUpdates.js +194 -0
- package/dist/server/skills/skillUpdates.js.map +1 -0
- package/dist/server/skills/skillsConfigRoutes.js +64 -0
- package/dist/server/skills/skillsConfigRoutes.js.map +1 -0
- package/dist/server/skills/skillsConfigService.js +391 -0
- package/dist/server/skills/skillsConfigService.js.map +1 -0
- package/dist/server/storage/projectStore.js +88 -0
- package/dist/server/storage/projectStore.js.map +1 -0
- package/dist/server/systemInfoRoutes.js +265 -0
- package/dist/server/systemInfoRoutes.js.map +1 -0
- package/dist/server/terminalProxyRoutes.js +140 -0
- package/dist/server/terminalProxyRoutes.js.map +1 -0
- package/dist/server/terminals/terminalRoutes.js +155 -0
- package/dist/server/terminals/terminalRoutes.js.map +1 -0
- package/dist/server/terminals/terminalService.js +305 -0
- package/dist/server/terminals/terminalService.js.map +1 -0
- package/dist/server/terminals/terminalSize.js +17 -0
- package/dist/server/terminals/terminalSize.js.map +1 -0
- package/dist/server/types.js +2 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server/webSocketBridge.js +32 -0
- package/dist/server/webSocketBridge.js.map +1 -0
- package/dist/server/workingDirectory.js +44 -0
- package/dist/server/workingDirectory.js.map +1 -0
- package/dist/server/workspaceExplorerRoutes.js +109 -0
- package/dist/server/workspaceExplorerRoutes.js.map +1 -0
- package/dist/server/workspaces/effectivePathAccess.js +27 -0
- package/dist/server/workspaces/effectivePathAccess.js.map +1 -0
- package/dist/server/workspaces/fileContentService.js +181 -0
- package/dist/server/workspaces/fileContentService.js.map +1 -0
- package/dist/server/workspaces/fileSuggestions.js +520 -0
- package/dist/server/workspaces/fileSuggestions.js.map +1 -0
- package/dist/server/workspaces/fileTreeService.js +35 -0
- package/dist/server/workspaces/fileTreeService.js.map +1 -0
- package/dist/server/workspaces/gitWorktreeDiscovery.js +34 -0
- package/dist/server/workspaces/gitWorktreeDiscovery.js.map +1 -0
- package/dist/server/workspaces/imagePreviewService.js +40 -0
- package/dist/server/workspaces/imagePreviewService.js.map +1 -0
- package/dist/server/workspaces/pathAccessPolicy.js +90 -0
- package/dist/server/workspaces/pathAccessPolicy.js.map +1 -0
- package/dist/server/workspaces/pathSafety.js +45 -0
- package/dist/server/workspaces/pathSafety.js.map +1 -0
- package/dist/server/workspaces/projectPiWebUiConfig.js +61 -0
- package/dist/server/workspaces/projectPiWebUiConfig.js.map +1 -0
- package/dist/server/workspaces/workspaceContext.js +8 -0
- package/dist/server/workspaces/workspaceContext.js.map +1 -0
- package/dist/server/workspaces/workspaceDeletionRoutes.js +113 -0
- package/dist/server/workspaces/workspaceDeletionRoutes.js.map +1 -0
- package/dist/server/workspaces/workspaceService.js +39 -0
- package/dist/server/workspaces/workspaceService.js.map +1 -0
- package/dist/sessiond/activeAgentProfile.js +31 -0
- package/dist/sessiond/activeAgentProfile.js.map +1 -0
- package/dist/sessiond/config.js +9 -0
- package/dist/sessiond/config.js.map +1 -0
- package/dist/sessiond/sessionDaemonClient.js +103 -0
- package/dist/sessiond/sessionDaemonClient.js.map +1 -0
- package/dist/shared/activeAgentProfile.js +76 -0
- package/dist/shared/activeAgentProfile.js.map +1 -0
- package/dist/shared/activity.js +11 -0
- package/dist/shared/activity.js.map +1 -0
- package/dist/shared/apiTypes.d.ts +1212 -0
- package/dist/shared/apiTypes.js +25 -0
- package/dist/shared/apiTypes.js.map +1 -0
- package/dist/shared/capabilities.js +69 -0
- package/dist/shared/capabilities.js.map +1 -0
- package/dist/shared/federatedRoutes.js +109 -0
- package/dist/shared/federatedRoutes.js.map +1 -0
- package/dist/shared/machinePluginIds.js +41 -0
- package/dist/shared/machinePluginIds.js.map +1 -0
- package/dist/shared/piWebUiStatusParsing.js +108 -0
- package/dist/shared/piWebUiStatusParsing.js.map +1 -0
- package/dist/shared/pluginIds.js +5 -0
- package/dist/shared/pluginIds.js.map +1 -0
- package/dist/shared/promptAttachments.js +92 -0
- package/dist/shared/promptAttachments.js.map +1 -0
- package/dist/shared/thinkingLevels.d.ts +27 -0
- package/dist/shared/thinkingLevels.js +31 -0
- package/dist/shared/thinkingLevels.js.map +1 -0
- package/dist/shared/workspaceDeletion.js +12 -0
- package/dist/shared/workspaceDeletion.js.map +1 -0
- package/dist/shared/workspaceFiles.js +3 -0
- package/dist/shared/workspaceFiles.js.map +1 -0
- package/docs/assets/favicon.svg +8 -0
- package/docs/assets/pi-webui-banner.png +0 -0
- package/docs/assets/pi-webui-desktop.png +0 -0
- package/docs/assets/pi-webui-mobile.png +0 -0
- package/docs/assets/pi-webui-tablet.png +0 -0
- package/docs/config.md +265 -0
- package/docs/plugins.md +988 -0
- package/extensions/pi-webui.ts +133 -0
- package/package.json +143 -0
- package/plugin-api/unstable.d.ts +1 -0
- package/plugin-api.d.ts +1 -0
|
@@ -0,0 +1,590 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { constants } from "node:fs";
|
|
3
|
+
import { copyFile, link, lstat, mkdir, open, readFile, readdir, realpath, rm, rmdir, unlink, writeFile, } from "node:fs/promises";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
import { basename, dirname, isAbsolute, join, relative, resolve } from "node:path";
|
|
6
|
+
import { piWebUiDataDir } from "../../config.js";
|
|
7
|
+
import { parseSessionArchiveFile } from "./sessionArchiveStore.js";
|
|
8
|
+
const defaultFileSystem = {
|
|
9
|
+
lstat: async (path) => lstat(path),
|
|
10
|
+
realpath: async (path) => realpath(path),
|
|
11
|
+
readFile: async (path) => readFile(path, "utf8"),
|
|
12
|
+
readdir: async (path) => readdir(path, { withFileTypes: true }),
|
|
13
|
+
mkdir: async (path, options) => {
|
|
14
|
+
await mkdir(path, options);
|
|
15
|
+
},
|
|
16
|
+
copyFile: async (source, destination, mode) => copyFile(source, destination, mode),
|
|
17
|
+
writeFile: async (path, contents) => {
|
|
18
|
+
await writeFile(path, contents, { encoding: "utf8", flag: "wx" });
|
|
19
|
+
},
|
|
20
|
+
link: async (source, destination) => link(source, destination),
|
|
21
|
+
unlink: async (path) => unlink(path),
|
|
22
|
+
rmdir: async (path) => rmdir(path),
|
|
23
|
+
rmOwnedTree: async (path) => {
|
|
24
|
+
await rm(path, { recursive: true, force: true });
|
|
25
|
+
},
|
|
26
|
+
open: async (path) => open(path, "r"),
|
|
27
|
+
};
|
|
28
|
+
export async function inspectLegacySessionArchiveMigration(options = {}) {
|
|
29
|
+
const preflight = await buildMigrationPreflight(options, migrationFileSystem(options));
|
|
30
|
+
if (preflight.status === "skipped")
|
|
31
|
+
return preflight;
|
|
32
|
+
return {
|
|
33
|
+
status: "eligible",
|
|
34
|
+
legacyIndexPath: preflight.plan.legacyIndexPath,
|
|
35
|
+
destinationIndexPath: preflight.plan.destinationIndexPath,
|
|
36
|
+
archiveFileCount: preflight.plan.files.length,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export async function migrateLegacySessionArchive(options = {}) {
|
|
40
|
+
const fileSystem = migrationFileSystem(options);
|
|
41
|
+
const preflight = await buildMigrationPreflight(options, fileSystem);
|
|
42
|
+
if (preflight.status === "skipped")
|
|
43
|
+
return preflight;
|
|
44
|
+
const plan = preflight.plan;
|
|
45
|
+
let phase = "stage";
|
|
46
|
+
let stagingRoot;
|
|
47
|
+
let stagingCreated = false;
|
|
48
|
+
let destinationArchiveCreated = false;
|
|
49
|
+
const ownedDestinationFiles = [];
|
|
50
|
+
try {
|
|
51
|
+
await fileSystem.mkdir(plan.destinationRoot, { recursive: true });
|
|
52
|
+
const currentDestinationRoot = await canonicalizeAllowMissing(plan.destinationRoot, fileSystem);
|
|
53
|
+
if (!pathsEqual(currentDestinationRoot, plan.canonicalDestinationRoot, plan.platform)) {
|
|
54
|
+
throw new Error("Destination data root changed after migration preflight");
|
|
55
|
+
}
|
|
56
|
+
await assertDestinationStateUnchanged(plan, fileSystem);
|
|
57
|
+
const attemptId = safeAttemptId((options.createAttemptId ?? randomUUID)());
|
|
58
|
+
// Keep staging beside, not inside, the authoritative archive directory so an
|
|
59
|
+
// interrupted staging copy cannot be mistaken for destination archive data.
|
|
60
|
+
stagingRoot = join(plan.destinationRoot, `.archived-sessions-migration-${attemptId}`);
|
|
61
|
+
await fileSystem.mkdir(stagingRoot);
|
|
62
|
+
stagingCreated = true;
|
|
63
|
+
const stagingFilesDir = join(stagingRoot, "files");
|
|
64
|
+
await fileSystem.mkdir(stagingFilesDir);
|
|
65
|
+
const stagedFiles = new Map();
|
|
66
|
+
for (const file of plan.files) {
|
|
67
|
+
const stagedPath = join(stagingFilesDir, file.fileName);
|
|
68
|
+
await fileSystem.copyFile(file.sourcePath, stagedPath, constants.COPYFILE_EXCL);
|
|
69
|
+
if (!await filesEqual(file.sourcePath, stagedPath, fileSystem)) {
|
|
70
|
+
throw new Error(`Staged archive file verification failed: ${file.fileName}`);
|
|
71
|
+
}
|
|
72
|
+
stagedFiles.set(file.destinationPath, stagedPath);
|
|
73
|
+
}
|
|
74
|
+
const stagedIndexPath = join(stagingRoot, "archived-sessions.json");
|
|
75
|
+
await fileSystem.writeFile(stagedIndexPath, plan.destinationIndexContents);
|
|
76
|
+
if (await fileSystem.readFile(stagedIndexPath) !== plan.destinationIndexContents) {
|
|
77
|
+
throw new Error("Staged archive index verification failed");
|
|
78
|
+
}
|
|
79
|
+
phase = "publish-files";
|
|
80
|
+
await assertDestinationStateUnchanged(plan, fileSystem);
|
|
81
|
+
if (plan.files.length > 0 && !plan.destinationArchiveDirExists) {
|
|
82
|
+
await fileSystem.mkdir(plan.destinationArchiveDir);
|
|
83
|
+
destinationArchiveCreated = true;
|
|
84
|
+
}
|
|
85
|
+
for (const file of plan.files) {
|
|
86
|
+
const stagedPath = stagedFiles.get(file.destinationPath);
|
|
87
|
+
if (stagedPath === undefined)
|
|
88
|
+
throw new Error(`Missing staged archive file: ${file.fileName}`);
|
|
89
|
+
try {
|
|
90
|
+
await fileSystem.copyFile(stagedPath, file.destinationPath, constants.COPYFILE_EXCL);
|
|
91
|
+
ownedDestinationFiles.push(file.destinationPath);
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
if (!isNodeErrorWithCode(error, "EEXIST"))
|
|
95
|
+
ownedDestinationFiles.push(file.destinationPath);
|
|
96
|
+
throw error;
|
|
97
|
+
}
|
|
98
|
+
if (!await filesEqual(stagedPath, file.destinationPath, fileSystem)) {
|
|
99
|
+
throw new Error(`Published archive file verification failed: ${file.fileName}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
phase = "commit-index";
|
|
103
|
+
await assertPlanReadyToCommit(plan, stagedIndexPath, fileSystem);
|
|
104
|
+
// A same-directory hard link atomically publishes the already-verified index
|
|
105
|
+
// and, unlike rename on POSIX, fails rather than replacing an existing index.
|
|
106
|
+
await fileSystem.link(stagedIndexPath, plan.destinationIndexPath);
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
const rollbackErrors = await rollbackUncommittedDestination({
|
|
110
|
+
stagingRoot,
|
|
111
|
+
stagingCreated,
|
|
112
|
+
destinationArchiveDir: plan.destinationArchiveDir,
|
|
113
|
+
destinationArchiveCreated,
|
|
114
|
+
ownedDestinationFiles,
|
|
115
|
+
}, fileSystem);
|
|
116
|
+
return { status: "failed", phase, error, rollbackErrors };
|
|
117
|
+
}
|
|
118
|
+
const cleanupErrors = [];
|
|
119
|
+
try {
|
|
120
|
+
await fileSystem.rmOwnedTree(stagingRoot);
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
cleanupErrors.push(error);
|
|
124
|
+
}
|
|
125
|
+
cleanupErrors.push(...await removeCommittedLegacyState(plan, fileSystem));
|
|
126
|
+
return cleanupErrors.length === 0
|
|
127
|
+
? { status: "migrated", archiveFileCount: plan.files.length, cleanup: "complete" }
|
|
128
|
+
: { status: "migrated", archiveFileCount: plan.files.length, cleanup: "incomplete", cleanupErrors };
|
|
129
|
+
}
|
|
130
|
+
async function buildMigrationPreflight(options, fileSystem) {
|
|
131
|
+
const env = options.env ?? process.env;
|
|
132
|
+
const configuredDataDir = env["PI_WEBUI_DATA_DIR"];
|
|
133
|
+
if (configuredDataDir === undefined || configuredDataDir.trim() === "") {
|
|
134
|
+
return migrationSkipped("data-dir-not-configured");
|
|
135
|
+
}
|
|
136
|
+
const cwd = options.cwd ?? process.cwd();
|
|
137
|
+
const platform = options.platform ?? process.platform;
|
|
138
|
+
const legacyRoot = resolve(options.homeDir ?? homedir(), ".pi-webui");
|
|
139
|
+
const destinationRoot = piWebUiDataDir(env, cwd);
|
|
140
|
+
const legacyIndexPath = join(legacyRoot, "archived-sessions.json");
|
|
141
|
+
const legacyArchiveDir = join(legacyRoot, "archived-sessions");
|
|
142
|
+
const destinationIndexPath = join(destinationRoot, "archived-sessions.json");
|
|
143
|
+
const destinationArchiveDir = join(destinationRoot, "archived-sessions");
|
|
144
|
+
try {
|
|
145
|
+
const canonicalLegacyRoot = await canonicalizeAllowMissing(legacyRoot, fileSystem);
|
|
146
|
+
const canonicalDestinationRoot = await canonicalizeAllowMissing(destinationRoot, fileSystem);
|
|
147
|
+
if (pathsEqual(canonicalLegacyRoot, canonicalDestinationRoot, platform)) {
|
|
148
|
+
return migrationSkipped("data-dir-not-distinct");
|
|
149
|
+
}
|
|
150
|
+
const legacyIndexStats = await lstatIfExists(legacyIndexPath, fileSystem);
|
|
151
|
+
if (legacyIndexStats === undefined)
|
|
152
|
+
return migrationSkipped("legacy-index-missing");
|
|
153
|
+
if (!legacyIndexStats.isFile() || legacyIndexStats.isSymbolicLink()) {
|
|
154
|
+
return migrationSkipped("legacy-index-invalid");
|
|
155
|
+
}
|
|
156
|
+
const sourceIndexContents = await fileSystem.readFile(legacyIndexPath);
|
|
157
|
+
const parsedDocument = parseArchiveDocument(sourceIndexContents);
|
|
158
|
+
if (parsedDocument === undefined)
|
|
159
|
+
return migrationSkipped("legacy-index-invalid");
|
|
160
|
+
if (await lstatIfExists(destinationIndexPath, fileSystem) !== undefined) {
|
|
161
|
+
return migrationSkipped("destination-index-exists");
|
|
162
|
+
}
|
|
163
|
+
const destinationArchiveStats = await lstatIfExists(destinationArchiveDir, fileSystem);
|
|
164
|
+
let destinationArchiveDirExists = false;
|
|
165
|
+
if (destinationArchiveStats !== undefined) {
|
|
166
|
+
if (!destinationArchiveStats.isDirectory() || destinationArchiveStats.isSymbolicLink()) {
|
|
167
|
+
return migrationSkipped("destination-archive-not-empty-or-invalid");
|
|
168
|
+
}
|
|
169
|
+
if ((await fileSystem.readdir(destinationArchiveDir)).length !== 0) {
|
|
170
|
+
return migrationSkipped("destination-archive-not-empty-or-invalid");
|
|
171
|
+
}
|
|
172
|
+
destinationArchiveDirExists = true;
|
|
173
|
+
}
|
|
174
|
+
const legacyArchiveStats = await lstatIfExists(legacyArchiveDir, fileSystem);
|
|
175
|
+
if (legacyArchiveStats !== undefined && (!legacyArchiveStats.isDirectory() || legacyArchiveStats.isSymbolicLink())) {
|
|
176
|
+
return migrationSkipped("legacy-archive-layout-invalid");
|
|
177
|
+
}
|
|
178
|
+
const legacyArchiveDirExists = legacyArchiveStats !== undefined;
|
|
179
|
+
const canonicalLegacyArchiveDir = legacyArchiveDirExists
|
|
180
|
+
? await fileSystem.realpath(legacyArchiveDir)
|
|
181
|
+
: await canonicalizeAllowMissing(legacyArchiveDir, fileSystem);
|
|
182
|
+
const canonicalDestinationArchiveDir = destinationArchiveDirExists
|
|
183
|
+
? await fileSystem.realpath(destinationArchiveDir)
|
|
184
|
+
: join(canonicalDestinationRoot, "archived-sessions");
|
|
185
|
+
if (pathsOverlap(canonicalLegacyArchiveDir, canonicalDestinationArchiveDir, platform)) {
|
|
186
|
+
return migrationSkipped("data-dir-not-distinct");
|
|
187
|
+
}
|
|
188
|
+
const plannedFiles = await planArchiveFiles({
|
|
189
|
+
sessions: parsedDocument.sessions,
|
|
190
|
+
legacyArchiveDir,
|
|
191
|
+
canonicalLegacyArchiveDir,
|
|
192
|
+
legacyArchiveDirExists,
|
|
193
|
+
destinationArchiveDir,
|
|
194
|
+
canonicalDestinationArchiveDir,
|
|
195
|
+
platform,
|
|
196
|
+
}, fileSystem);
|
|
197
|
+
if (plannedFiles.status === "skipped")
|
|
198
|
+
return plannedFiles;
|
|
199
|
+
if (!await legacyDirectoryMatchesPlan(legacyArchiveDir, legacyArchiveDirExists, plannedFiles.files, platform, fileSystem)) {
|
|
200
|
+
return migrationSkipped("legacy-archive-layout-invalid");
|
|
201
|
+
}
|
|
202
|
+
const rewrittenSessions = parsedDocument.rawSessions.map((record, index) => {
|
|
203
|
+
const destinationPath = plannedFiles.destinationPathsByRecord[index];
|
|
204
|
+
return destinationPath === undefined ? record : { ...record, archivePath: destinationPath };
|
|
205
|
+
});
|
|
206
|
+
const destinationIndexContents = `${JSON.stringify({ ...parsedDocument.rawDocument, sessions: rewrittenSessions }, null, 2)}\n`;
|
|
207
|
+
return {
|
|
208
|
+
status: "eligible",
|
|
209
|
+
plan: {
|
|
210
|
+
legacyRoot,
|
|
211
|
+
canonicalLegacyRoot,
|
|
212
|
+
legacyIndexPath,
|
|
213
|
+
legacyArchiveDir,
|
|
214
|
+
canonicalLegacyArchiveDir,
|
|
215
|
+
legacyArchiveDirExists,
|
|
216
|
+
destinationRoot,
|
|
217
|
+
canonicalDestinationRoot,
|
|
218
|
+
destinationIndexPath,
|
|
219
|
+
destinationArchiveDir,
|
|
220
|
+
canonicalDestinationArchiveDir,
|
|
221
|
+
destinationArchiveDirExists,
|
|
222
|
+
sourceIndexContents,
|
|
223
|
+
destinationIndexContents,
|
|
224
|
+
files: plannedFiles.files,
|
|
225
|
+
platform,
|
|
226
|
+
},
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
catch (error) {
|
|
230
|
+
return migrationSkipped("inspection-failed", error);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
function parseArchiveDocument(contents) {
|
|
234
|
+
try {
|
|
235
|
+
const value = JSON.parse(contents);
|
|
236
|
+
if (!isRecord(value))
|
|
237
|
+
return undefined;
|
|
238
|
+
const rawSessions = recordArray(value["sessions"]);
|
|
239
|
+
if (rawSessions === undefined)
|
|
240
|
+
return undefined;
|
|
241
|
+
const archive = parseSessionArchiveFile(value);
|
|
242
|
+
return { rawDocument: value, rawSessions, sessions: archive.sessions };
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
return undefined;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
async function planArchiveFiles(input, fileSystem) {
|
|
249
|
+
const sessionIds = new Set();
|
|
250
|
+
const sourcePaths = new Set();
|
|
251
|
+
const destinationPaths = new Set();
|
|
252
|
+
const destinationPathsByRecord = Array.from({ length: input.sessions.length });
|
|
253
|
+
const files = [];
|
|
254
|
+
for (const [index, session] of input.sessions.entries()) {
|
|
255
|
+
if (session.sessionId.trim() === "" || sessionIds.has(session.sessionId)) {
|
|
256
|
+
return migrationSkipped("archive-record-conflict");
|
|
257
|
+
}
|
|
258
|
+
sessionIds.add(session.sessionId);
|
|
259
|
+
if (session.archivePath === undefined)
|
|
260
|
+
continue;
|
|
261
|
+
if (!input.legacyArchiveDirExists || !isAbsolute(session.archivePath)) {
|
|
262
|
+
return migrationSkipped("legacy-archive-layout-invalid");
|
|
263
|
+
}
|
|
264
|
+
const sourcePath = resolve(session.archivePath);
|
|
265
|
+
if (!pathsEqual(dirname(sourcePath), input.legacyArchiveDir, input.platform)) {
|
|
266
|
+
return migrationSkipped("legacy-archive-layout-invalid");
|
|
267
|
+
}
|
|
268
|
+
const sourceStats = await lstatIfExists(sourcePath, fileSystem);
|
|
269
|
+
if (sourceStats === undefined || !sourceStats.isFile() || sourceStats.isSymbolicLink()) {
|
|
270
|
+
return migrationSkipped("legacy-archive-layout-invalid");
|
|
271
|
+
}
|
|
272
|
+
const canonicalSourcePath = await fileSystem.realpath(sourcePath);
|
|
273
|
+
if (!pathsEqual(dirname(canonicalSourcePath), input.canonicalLegacyArchiveDir, input.platform)) {
|
|
274
|
+
return migrationSkipped("legacy-archive-layout-invalid");
|
|
275
|
+
}
|
|
276
|
+
const fileName = basename(sourcePath);
|
|
277
|
+
const destinationPath = join(input.destinationArchiveDir, fileName);
|
|
278
|
+
const canonicalDestinationPath = join(input.canonicalDestinationArchiveDir, fileName);
|
|
279
|
+
const sourceKey = pathKey(canonicalSourcePath, input.platform);
|
|
280
|
+
const destinationKey = collisionKey(canonicalDestinationPath);
|
|
281
|
+
if (sourcePaths.has(sourceKey) || destinationPaths.has(destinationKey)) {
|
|
282
|
+
return migrationSkipped("archive-record-conflict");
|
|
283
|
+
}
|
|
284
|
+
sourcePaths.add(sourceKey);
|
|
285
|
+
destinationPaths.add(destinationKey);
|
|
286
|
+
destinationPathsByRecord[index] = destinationPath;
|
|
287
|
+
files.push({ sourcePath, destinationPath, fileName });
|
|
288
|
+
}
|
|
289
|
+
return { status: "planned", files, destinationPathsByRecord };
|
|
290
|
+
}
|
|
291
|
+
async function legacyDirectoryMatchesPlan(legacyArchiveDir, legacyArchiveDirExists, files, platform, fileSystem) {
|
|
292
|
+
const archiveStats = await lstatIfExists(legacyArchiveDir, fileSystem);
|
|
293
|
+
if (!legacyArchiveDirExists)
|
|
294
|
+
return archiveStats === undefined && files.length === 0;
|
|
295
|
+
if (archiveStats === undefined || !archiveStats.isDirectory() || archiveStats.isSymbolicLink())
|
|
296
|
+
return false;
|
|
297
|
+
const entries = await fileSystem.readdir(legacyArchiveDir);
|
|
298
|
+
if (entries.some((entry) => !entry.isFile() || entry.isSymbolicLink()))
|
|
299
|
+
return false;
|
|
300
|
+
const actualNames = new Set(entries.map((entry) => pathNameKey(entry.name, platform)));
|
|
301
|
+
const expectedNames = new Set(files.map((file) => pathNameKey(file.fileName, platform)));
|
|
302
|
+
if (actualNames.size !== entries.length || expectedNames.size !== files.length || actualNames.size !== expectedNames.size)
|
|
303
|
+
return false;
|
|
304
|
+
return [...expectedNames].every((name) => actualNames.has(name));
|
|
305
|
+
}
|
|
306
|
+
async function assertDestinationStateUnchanged(plan, fileSystem) {
|
|
307
|
+
if (await lstatIfExists(plan.destinationIndexPath, fileSystem) !== undefined) {
|
|
308
|
+
throw new Error("Destination archive index appeared after migration preflight");
|
|
309
|
+
}
|
|
310
|
+
const archiveStats = await lstatIfExists(plan.destinationArchiveDir, fileSystem);
|
|
311
|
+
if (!plan.destinationArchiveDirExists) {
|
|
312
|
+
if (archiveStats !== undefined)
|
|
313
|
+
throw new Error("Destination archive directory appeared after migration preflight");
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
if (archiveStats === undefined || !archiveStats.isDirectory() || archiveStats.isSymbolicLink()) {
|
|
317
|
+
throw new Error("Destination archive directory changed after migration preflight");
|
|
318
|
+
}
|
|
319
|
+
if ((await fileSystem.readdir(plan.destinationArchiveDir)).length !== 0) {
|
|
320
|
+
throw new Error("Destination archive directory is no longer empty");
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
async function assertPlanReadyToCommit(plan, stagedIndexPath, fileSystem) {
|
|
324
|
+
const currentLegacyRoot = await canonicalizeAllowMissing(plan.legacyRoot, fileSystem);
|
|
325
|
+
const currentDestinationRoot = await canonicalizeAllowMissing(plan.destinationRoot, fileSystem);
|
|
326
|
+
if (!pathsEqual(currentLegacyRoot, plan.canonicalLegacyRoot, plan.platform)
|
|
327
|
+
|| !pathsEqual(currentDestinationRoot, plan.canonicalDestinationRoot, plan.platform)) {
|
|
328
|
+
throw new Error("Archive data root changed during migration");
|
|
329
|
+
}
|
|
330
|
+
const legacyIndexStats = await lstatIfExists(plan.legacyIndexPath, fileSystem);
|
|
331
|
+
if (legacyIndexStats === undefined || !legacyIndexStats.isFile() || legacyIndexStats.isSymbolicLink()) {
|
|
332
|
+
throw new Error("Legacy archive index changed during migration");
|
|
333
|
+
}
|
|
334
|
+
if (await fileSystem.readFile(plan.legacyIndexPath) !== plan.sourceIndexContents) {
|
|
335
|
+
throw new Error("Legacy archive index changed during migration");
|
|
336
|
+
}
|
|
337
|
+
if (!await legacyDirectoryMatchesPlan(plan.legacyArchiveDir, plan.legacyArchiveDirExists, plan.files, plan.platform, fileSystem)) {
|
|
338
|
+
throw new Error("Legacy archive directory changed during migration");
|
|
339
|
+
}
|
|
340
|
+
if (plan.legacyArchiveDirExists
|
|
341
|
+
&& !pathsEqual(await fileSystem.realpath(plan.legacyArchiveDir), plan.canonicalLegacyArchiveDir, plan.platform)) {
|
|
342
|
+
throw new Error("Legacy archive directory changed during migration");
|
|
343
|
+
}
|
|
344
|
+
if (await lstatIfExists(plan.destinationIndexPath, fileSystem) !== undefined) {
|
|
345
|
+
throw new Error("Destination archive index appeared during migration");
|
|
346
|
+
}
|
|
347
|
+
if (await fileSystem.readFile(stagedIndexPath) !== plan.destinationIndexContents) {
|
|
348
|
+
throw new Error("Staged archive index changed during migration");
|
|
349
|
+
}
|
|
350
|
+
if (plan.files.length === 0) {
|
|
351
|
+
const destinationStats = await lstatIfExists(plan.destinationArchiveDir, fileSystem);
|
|
352
|
+
if (plan.destinationArchiveDirExists) {
|
|
353
|
+
if (destinationStats === undefined || !destinationStats.isDirectory() || destinationStats.isSymbolicLink()
|
|
354
|
+
|| !pathsEqual(await fileSystem.realpath(plan.destinationArchiveDir), plan.canonicalDestinationArchiveDir, plan.platform)
|
|
355
|
+
|| (await fileSystem.readdir(plan.destinationArchiveDir)).length !== 0) {
|
|
356
|
+
throw new Error("Destination archive directory changed during migration");
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
else if (destinationStats !== undefined) {
|
|
360
|
+
throw new Error("Destination archive directory appeared during migration");
|
|
361
|
+
}
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
const destinationStats = await lstatIfExists(plan.destinationArchiveDir, fileSystem);
|
|
365
|
+
if (destinationStats === undefined || !destinationStats.isDirectory() || destinationStats.isSymbolicLink()) {
|
|
366
|
+
throw new Error("Destination archive directory is not a real directory");
|
|
367
|
+
}
|
|
368
|
+
if (!pathsEqual(await fileSystem.realpath(plan.destinationArchiveDir), plan.canonicalDestinationArchiveDir, plan.platform)) {
|
|
369
|
+
throw new Error("Destination archive directory changed during migration");
|
|
370
|
+
}
|
|
371
|
+
const destinationEntries = await fileSystem.readdir(plan.destinationArchiveDir);
|
|
372
|
+
if (destinationEntries.some((entry) => !entry.isFile() || entry.isSymbolicLink())) {
|
|
373
|
+
throw new Error("Destination archive directory contains an unexpected entry");
|
|
374
|
+
}
|
|
375
|
+
const actualNames = new Set(destinationEntries.map((entry) => pathNameKey(entry.name, plan.platform)));
|
|
376
|
+
const expectedNames = new Set(plan.files.map((file) => pathNameKey(file.fileName, plan.platform)));
|
|
377
|
+
if (actualNames.size !== destinationEntries.length || actualNames.size !== expectedNames.size
|
|
378
|
+
|| ![...expectedNames].every((name) => actualNames.has(name))) {
|
|
379
|
+
throw new Error("Destination archive directory does not match the migration plan");
|
|
380
|
+
}
|
|
381
|
+
for (const file of plan.files) {
|
|
382
|
+
const sourceStats = await lstatIfExists(file.sourcePath, fileSystem);
|
|
383
|
+
const destinationFileStats = await lstatIfExists(file.destinationPath, fileSystem);
|
|
384
|
+
if (sourceStats === undefined || !sourceStats.isFile() || sourceStats.isSymbolicLink()
|
|
385
|
+
|| destinationFileStats === undefined || !destinationFileStats.isFile() || destinationFileStats.isSymbolicLink()) {
|
|
386
|
+
throw new Error(`Archive file changed during migration: ${file.fileName}`);
|
|
387
|
+
}
|
|
388
|
+
if (!await filesEqual(file.sourcePath, file.destinationPath, fileSystem)) {
|
|
389
|
+
throw new Error(`Archive file verification failed before commit: ${file.fileName}`);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
async function rollbackUncommittedDestination(state, fileSystem) {
|
|
394
|
+
const errors = [];
|
|
395
|
+
for (const path of [...state.ownedDestinationFiles].reverse()) {
|
|
396
|
+
try {
|
|
397
|
+
await removeFileIfPresent(path, fileSystem);
|
|
398
|
+
}
|
|
399
|
+
catch (error) {
|
|
400
|
+
errors.push(error);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
if (state.destinationArchiveCreated) {
|
|
404
|
+
try {
|
|
405
|
+
await removeDirectoryIfPresent(state.destinationArchiveDir, fileSystem);
|
|
406
|
+
}
|
|
407
|
+
catch (error) {
|
|
408
|
+
errors.push(error);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
if (state.stagingCreated && state.stagingRoot !== undefined) {
|
|
412
|
+
try {
|
|
413
|
+
await fileSystem.rmOwnedTree(state.stagingRoot);
|
|
414
|
+
}
|
|
415
|
+
catch (error) {
|
|
416
|
+
errors.push(error);
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
return errors;
|
|
420
|
+
}
|
|
421
|
+
async function removeCommittedLegacyState(plan, fileSystem) {
|
|
422
|
+
const errors = [];
|
|
423
|
+
// Remove the index last. If any file/directory cleanup fails, the complete
|
|
424
|
+
// legacy index remains as a recovery marker while the destination is valid.
|
|
425
|
+
for (const file of plan.files) {
|
|
426
|
+
try {
|
|
427
|
+
await removeFileIfPresent(file.sourcePath, fileSystem);
|
|
428
|
+
}
|
|
429
|
+
catch (error) {
|
|
430
|
+
errors.push(error);
|
|
431
|
+
return errors;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
if (plan.legacyArchiveDirExists) {
|
|
435
|
+
try {
|
|
436
|
+
await removeDirectoryIfPresent(plan.legacyArchiveDir, fileSystem);
|
|
437
|
+
}
|
|
438
|
+
catch (error) {
|
|
439
|
+
errors.push(error);
|
|
440
|
+
return errors;
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
try {
|
|
444
|
+
await removeFileIfPresent(plan.legacyIndexPath, fileSystem);
|
|
445
|
+
}
|
|
446
|
+
catch (error) {
|
|
447
|
+
errors.push(error);
|
|
448
|
+
}
|
|
449
|
+
return errors;
|
|
450
|
+
}
|
|
451
|
+
async function filesEqual(firstPath, secondPath, fileSystem) {
|
|
452
|
+
const first = await fileSystem.open(firstPath);
|
|
453
|
+
try {
|
|
454
|
+
const second = await fileSystem.open(secondPath);
|
|
455
|
+
try {
|
|
456
|
+
const firstBuffer = Buffer.allocUnsafe(64 * 1024);
|
|
457
|
+
const secondBuffer = Buffer.allocUnsafe(64 * 1024);
|
|
458
|
+
for (;;) {
|
|
459
|
+
const [firstBytes, secondBytes] = await Promise.all([
|
|
460
|
+
readChunk(first, firstBuffer),
|
|
461
|
+
readChunk(second, secondBuffer),
|
|
462
|
+
]);
|
|
463
|
+
if (firstBytes !== secondBytes)
|
|
464
|
+
return false;
|
|
465
|
+
if (firstBytes === 0)
|
|
466
|
+
return true;
|
|
467
|
+
if (!firstBuffer.subarray(0, firstBytes).equals(secondBuffer.subarray(0, secondBytes)))
|
|
468
|
+
return false;
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
finally {
|
|
472
|
+
await second.close();
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
finally {
|
|
476
|
+
await first.close();
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
async function readChunk(handle, buffer) {
|
|
480
|
+
let total = 0;
|
|
481
|
+
while (total < buffer.length) {
|
|
482
|
+
const { bytesRead } = await handle.read(buffer, total, buffer.length - total, null);
|
|
483
|
+
if (bytesRead === 0)
|
|
484
|
+
break;
|
|
485
|
+
total += bytesRead;
|
|
486
|
+
}
|
|
487
|
+
return total;
|
|
488
|
+
}
|
|
489
|
+
async function canonicalizeAllowMissing(path, fileSystem) {
|
|
490
|
+
let cursor = resolve(path);
|
|
491
|
+
const missingParts = [];
|
|
492
|
+
for (;;) {
|
|
493
|
+
try {
|
|
494
|
+
const canonical = await fileSystem.realpath(cursor);
|
|
495
|
+
return resolve(canonical, ...missingParts);
|
|
496
|
+
}
|
|
497
|
+
catch (error) {
|
|
498
|
+
if (!isNodeErrorWithCode(error, "ENOENT"))
|
|
499
|
+
throw error;
|
|
500
|
+
if (await lstatIfExists(cursor, fileSystem) !== undefined) {
|
|
501
|
+
throw new Error(`Cannot resolve existing path: ${cursor}`, { cause: error });
|
|
502
|
+
}
|
|
503
|
+
const parent = dirname(cursor);
|
|
504
|
+
if (parent === cursor)
|
|
505
|
+
throw error;
|
|
506
|
+
missingParts.unshift(basename(cursor));
|
|
507
|
+
cursor = parent;
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
async function lstatIfExists(path, fileSystem) {
|
|
512
|
+
try {
|
|
513
|
+
return await fileSystem.lstat(path);
|
|
514
|
+
}
|
|
515
|
+
catch (error) {
|
|
516
|
+
if (isNodeErrorWithCode(error, "ENOENT"))
|
|
517
|
+
return undefined;
|
|
518
|
+
throw error;
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
async function removeFileIfPresent(path, fileSystem) {
|
|
522
|
+
try {
|
|
523
|
+
await fileSystem.unlink(path);
|
|
524
|
+
}
|
|
525
|
+
catch (error) {
|
|
526
|
+
if (!isNodeErrorWithCode(error, "ENOENT"))
|
|
527
|
+
throw error;
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
async function removeDirectoryIfPresent(path, fileSystem) {
|
|
531
|
+
try {
|
|
532
|
+
await fileSystem.rmdir(path);
|
|
533
|
+
}
|
|
534
|
+
catch (error) {
|
|
535
|
+
if (!isNodeErrorWithCode(error, "ENOENT"))
|
|
536
|
+
throw error;
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
function migrationFileSystem(options) {
|
|
540
|
+
return { ...defaultFileSystem, ...options.fileSystem };
|
|
541
|
+
}
|
|
542
|
+
function migrationSkipped(reason, error) {
|
|
543
|
+
return error === undefined ? { status: "skipped", reason } : { status: "skipped", reason, error };
|
|
544
|
+
}
|
|
545
|
+
function pathsOverlap(first, second, platform) {
|
|
546
|
+
return pathContains(first, second, platform) || pathContains(second, first, platform);
|
|
547
|
+
}
|
|
548
|
+
function pathContains(parent, candidate, platform) {
|
|
549
|
+
const parentPath = pathKey(parent, platform);
|
|
550
|
+
const candidatePath = pathKey(candidate, platform);
|
|
551
|
+
const pathFromParent = relative(parentPath, candidatePath);
|
|
552
|
+
const firstSegment = pathFromParent.split(/[\\/]/, 1)[0];
|
|
553
|
+
return pathFromParent === "" || (firstSegment !== ".." && !isAbsolute(pathFromParent));
|
|
554
|
+
}
|
|
555
|
+
function pathsEqual(first, second, platform) {
|
|
556
|
+
return pathKey(first, platform) === pathKey(second, platform);
|
|
557
|
+
}
|
|
558
|
+
function pathKey(path, platform) {
|
|
559
|
+
const normalized = resolve(path);
|
|
560
|
+
return platform === "win32" ? normalized.toLowerCase() : normalized;
|
|
561
|
+
}
|
|
562
|
+
function pathNameKey(name, platform) {
|
|
563
|
+
return platform === "win32" ? name.toLowerCase() : name;
|
|
564
|
+
}
|
|
565
|
+
function collisionKey(path) {
|
|
566
|
+
// Conservatively reject case/normalization variants even when the source
|
|
567
|
+
// platform happens to allow them; the destination filesystem may not.
|
|
568
|
+
return resolve(path).normalize("NFC").toLowerCase();
|
|
569
|
+
}
|
|
570
|
+
function safeAttemptId(value) {
|
|
571
|
+
return value.replace(/[^a-zA-Z0-9._-]/g, "_") || "attempt";
|
|
572
|
+
}
|
|
573
|
+
function recordArray(value) {
|
|
574
|
+
if (!Array.isArray(value))
|
|
575
|
+
return undefined;
|
|
576
|
+
const records = [];
|
|
577
|
+
for (const item of value) {
|
|
578
|
+
if (!isRecord(item))
|
|
579
|
+
return undefined;
|
|
580
|
+
records.push(item);
|
|
581
|
+
}
|
|
582
|
+
return records;
|
|
583
|
+
}
|
|
584
|
+
function isRecord(value) {
|
|
585
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
586
|
+
}
|
|
587
|
+
function isNodeErrorWithCode(error, code) {
|
|
588
|
+
return error instanceof Error && "code" in error && error.code === code;
|
|
589
|
+
}
|
|
590
|
+
//# sourceMappingURL=sessionArchiveMigration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionArchiveMigration.js","sourceRoot":"","sources":["../../../src/server/sessions/sessionArchiveMigration.ts"],"names":[],"mappings":"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"}
|