@adaptive-ds/project-registry 0.2.3
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 +22 -0
- package/README.md +40 -0
- package/dist/access/Actor.d.ts +7 -0
- package/dist/access/Actor.d.ts.map +1 -0
- package/dist/access/Actor.js +2 -0
- package/dist/access/Actor.js.map +1 -0
- package/dist/access/ProjectAccess.d.ts +8 -0
- package/dist/access/ProjectAccess.d.ts.map +1 -0
- package/dist/access/ProjectAccess.js +2 -0
- package/dist/access/ProjectAccess.js.map +1 -0
- package/dist/access/ProjectAccessCreateOptions.d.ts +27 -0
- package/dist/access/ProjectAccessCreateOptions.d.ts.map +1 -0
- package/dist/access/ProjectAccessCreateOptions.js +2 -0
- package/dist/access/ProjectAccessCreateOptions.js.map +1 -0
- package/dist/access/Role.d.ts +2 -0
- package/dist/access/Role.d.ts.map +1 -0
- package/dist/access/Role.js +2 -0
- package/dist/access/Role.js.map +1 -0
- package/dist/access/SuperadminOperation.d.ts +2 -0
- package/dist/access/SuperadminOperation.d.ts.map +1 -0
- package/dist/access/SuperadminOperation.js +2 -0
- package/dist/access/SuperadminOperation.js.map +1 -0
- package/dist/access/projectAccessCreate.d.ts +4 -0
- package/dist/access/projectAccessCreate.d.ts.map +1 -0
- package/dist/access/projectAccessCreate.js +180 -0
- package/dist/access/projectAccessCreate.js.map +1 -0
- package/dist/access/projectAuthorize.d.ts +5 -0
- package/dist/access/projectAuthorize.d.ts.map +1 -0
- package/dist/access/projectAuthorize.js +34 -0
- package/dist/access/projectAuthorize.js.map +1 -0
- package/dist/access/roleResolve.d.ts +4 -0
- package/dist/access/roleResolve.d.ts.map +1 -0
- package/dist/access/roleResolve.js +21 -0
- package/dist/access/roleResolve.js.map +1 -0
- package/dist/access/serviceAuthorize.d.ts +5 -0
- package/dist/access/serviceAuthorize.d.ts.map +1 -0
- package/dist/access/serviceAuthorize.js +10 -0
- package/dist/access/serviceAuthorize.js.map +1 -0
- package/dist/access/superadminAuthorize.d.ts +5 -0
- package/dist/access/superadminAuthorize.d.ts.map +1 -0
- package/dist/access/superadminAuthorize.js +24 -0
- package/dist/access/superadminAuthorize.js.map +1 -0
- package/dist/access/visibleUserList.d.ts +6 -0
- package/dist/access/visibleUserList.d.ts.map +1 -0
- package/dist/access/visibleUserList.js +51 -0
- package/dist/access/visibleUserList.js.map +1 -0
- package/dist/access-log/ProjectAccessLogRecord.d.ts +8 -0
- package/dist/access-log/ProjectAccessLogRecord.d.ts.map +1 -0
- package/dist/access-log/ProjectAccessLogRecord.js +2 -0
- package/dist/access-log/ProjectAccessLogRecord.js.map +1 -0
- package/dist/access-log/ProjectAccessLogSource.d.ts +22 -0
- package/dist/access-log/ProjectAccessLogSource.d.ts.map +1 -0
- package/dist/access-log/ProjectAccessLogSource.js +2 -0
- package/dist/access-log/ProjectAccessLogSource.js.map +1 -0
- package/dist/access-log/projectAccessLogCaddyRetention.d.ts +5 -0
- package/dist/access-log/projectAccessLogCaddyRetention.d.ts.map +1 -0
- package/dist/access-log/projectAccessLogCaddyRetention.js +5 -0
- package/dist/access-log/projectAccessLogCaddyRetention.js.map +1 -0
- package/dist/access-log/projectAccessLogCursor.d.ts +22 -0
- package/dist/access-log/projectAccessLogCursor.d.ts.map +1 -0
- package/dist/access-log/projectAccessLogCursor.js +148 -0
- package/dist/access-log/projectAccessLogCursor.js.map +1 -0
- package/dist/access-log/projectAccessLogId.d.ts +3 -0
- package/dist/access-log/projectAccessLogId.d.ts.map +1 -0
- package/dist/access-log/projectAccessLogId.js +6 -0
- package/dist/access-log/projectAccessLogId.js.map +1 -0
- package/dist/access-log/projectAccessLogListUseCase.d.ts +14 -0
- package/dist/access-log/projectAccessLogListUseCase.d.ts.map +1 -0
- package/dist/access-log/projectAccessLogListUseCase.js +74 -0
- package/dist/access-log/projectAccessLogListUseCase.js.map +1 -0
- package/dist/access-log/projectAccessLogOpenat2.d.ts +12 -0
- package/dist/access-log/projectAccessLogOpenat2.d.ts.map +1 -0
- package/dist/access-log/projectAccessLogOpenat2.js +123 -0
- package/dist/access-log/projectAccessLogOpenat2.js.map +1 -0
- package/dist/access-log/projectAccessLogParser.d.ts +4 -0
- package/dist/access-log/projectAccessLogParser.d.ts.map +1 -0
- package/dist/access-log/projectAccessLogParser.js +88 -0
- package/dist/access-log/projectAccessLogParser.js.map +1 -0
- package/dist/access-log/projectAccessLogPath.d.ts +4 -0
- package/dist/access-log/projectAccessLogPath.d.ts.map +1 -0
- package/dist/access-log/projectAccessLogPath.js +11 -0
- package/dist/access-log/projectAccessLogPath.js.map +1 -0
- package/dist/access-log/projectAccessLogRetentionMaximumActiveProjectIds.d.ts +2 -0
- package/dist/access-log/projectAccessLogRetentionMaximumActiveProjectIds.d.ts.map +1 -0
- package/dist/access-log/projectAccessLogRetentionMaximumActiveProjectIds.js +2 -0
- package/dist/access-log/projectAccessLogRetentionMaximumActiveProjectIds.js.map +1 -0
- package/dist/access-log/projectAccessLogRetentionReconcile.d.ts +19 -0
- package/dist/access-log/projectAccessLogRetentionReconcile.d.ts.map +1 -0
- package/dist/access-log/projectAccessLogRetentionReconcile.js +1365 -0
- package/dist/access-log/projectAccessLogRetentionReconcile.js.map +1 -0
- package/dist/access-log/projectAccessLogRootSchema.d.ts +3 -0
- package/dist/access-log/projectAccessLogRootSchema.d.ts.map +1 -0
- package/dist/access-log/projectAccessLogRootSchema.js +4 -0
- package/dist/access-log/projectAccessLogRootSchema.js.map +1 -0
- package/dist/access-log/projectAccessLogRootValidate.d.ts +3 -0
- package/dist/access-log/projectAccessLogRootValidate.d.ts.map +1 -0
- package/dist/access-log/projectAccessLogRootValidate.js +18 -0
- package/dist/access-log/projectAccessLogRootValidate.js.map +1 -0
- package/dist/access-log/projectAccessLogSourceFileCreate.d.ts +22 -0
- package/dist/access-log/projectAccessLogSourceFileCreate.d.ts.map +1 -0
- package/dist/access-log/projectAccessLogSourceFileCreate.js +871 -0
- package/dist/access-log/projectAccessLogSourceFileCreate.js.map +1 -0
- package/dist/api/projectRegistryApiHandlerCreate.d.ts +18 -0
- package/dist/api/projectRegistryApiHandlerCreate.d.ts.map +1 -0
- package/dist/api/projectRegistryApiHandlerCreate.js +738 -0
- package/dist/api/projectRegistryApiHandlerCreate.js.map +1 -0
- package/dist/caddy/CaddyAdminLoadOptions.d.ts +10 -0
- package/dist/caddy/CaddyAdminLoadOptions.d.ts.map +1 -0
- package/dist/caddy/CaddyAdminLoadOptions.js +2 -0
- package/dist/caddy/CaddyAdminLoadOptions.js.map +1 -0
- package/dist/caddy/CaddyApplication.d.ts +12 -0
- package/dist/caddy/CaddyApplication.d.ts.map +1 -0
- package/dist/caddy/CaddyApplication.js +2 -0
- package/dist/caddy/CaddyApplication.js.map +1 -0
- package/dist/caddy/CaddyApplicationOptions.d.ts +24 -0
- package/dist/caddy/CaddyApplicationOptions.d.ts.map +1 -0
- package/dist/caddy/CaddyApplicationOptions.js +2 -0
- package/dist/caddy/CaddyApplicationOptions.js.map +1 -0
- package/dist/caddy/CaddyApplicationQueue.d.ts +4 -0
- package/dist/caddy/CaddyApplicationQueue.d.ts.map +1 -0
- package/dist/caddy/CaddyApplicationQueue.js +2 -0
- package/dist/caddy/CaddyApplicationQueue.js.map +1 -0
- package/dist/caddy/CaddyApplicationResult.d.ts +8 -0
- package/dist/caddy/CaddyApplicationResult.d.ts.map +1 -0
- package/dist/caddy/CaddyApplicationResult.js +2 -0
- package/dist/caddy/CaddyApplicationResult.js.map +1 -0
- package/dist/caddy/CaddyApplicationStatus.d.ts +11 -0
- package/dist/caddy/CaddyApplicationStatus.d.ts.map +1 -0
- package/dist/caddy/CaddyApplicationStatus.js +2 -0
- package/dist/caddy/CaddyApplicationStatus.js.map +1 -0
- package/dist/caddy/CaddyClock.d.ts +2 -0
- package/dist/caddy/CaddyClock.d.ts.map +1 -0
- package/dist/caddy/CaddyClock.js +2 -0
- package/dist/caddy/CaddyClock.js.map +1 -0
- package/dist/caddy/CaddyConfig.d.ts +38 -0
- package/dist/caddy/CaddyConfig.d.ts.map +1 -0
- package/dist/caddy/CaddyConfig.js +2 -0
- package/dist/caddy/CaddyConfig.js.map +1 -0
- package/dist/caddy/CaddyConfigInspectUseCaseOptions.d.ts +6 -0
- package/dist/caddy/CaddyConfigInspectUseCaseOptions.d.ts.map +1 -0
- package/dist/caddy/CaddyConfigInspectUseCaseOptions.js +2 -0
- package/dist/caddy/CaddyConfigInspectUseCaseOptions.js.map +1 -0
- package/dist/caddy/CaddyConfigInspection.d.ts +10 -0
- package/dist/caddy/CaddyConfigInspection.d.ts.map +1 -0
- package/dist/caddy/CaddyConfigInspection.js +2 -0
- package/dist/caddy/CaddyConfigInspection.js.map +1 -0
- package/dist/caddy/CaddyConfigSummaryEntry.d.ts +9 -0
- package/dist/caddy/CaddyConfigSummaryEntry.d.ts.map +1 -0
- package/dist/caddy/CaddyConfigSummaryEntry.js +2 -0
- package/dist/caddy/CaddyConfigSummaryEntry.js.map +1 -0
- package/dist/caddy/CaddyConfigValidateOptions.d.ts +10 -0
- package/dist/caddy/CaddyConfigValidateOptions.d.ts.map +1 -0
- package/dist/caddy/CaddyConfigValidateOptions.js +2 -0
- package/dist/caddy/CaddyConfigValidateOptions.js.map +1 -0
- package/dist/caddy/CaddyDocsUrlsUseCaseOptions.d.ts +8 -0
- package/dist/caddy/CaddyDocsUrlsUseCaseOptions.d.ts.map +1 -0
- package/dist/caddy/CaddyDocsUrlsUseCaseOptions.js +2 -0
- package/dist/caddy/CaddyDocsUrlsUseCaseOptions.js.map +1 -0
- package/dist/caddy/CaddyFetch.d.ts +2 -0
- package/dist/caddy/CaddyFetch.d.ts.map +1 -0
- package/dist/caddy/CaddyFetch.js +2 -0
- package/dist/caddy/CaddyFetch.js.map +1 -0
- package/dist/caddy/CaddyInspectionOptions.d.ts +10 -0
- package/dist/caddy/CaddyInspectionOptions.d.ts.map +1 -0
- package/dist/caddy/CaddyInspectionOptions.js +2 -0
- package/dist/caddy/CaddyInspectionOptions.js.map +1 -0
- package/dist/caddy/CaddyProcessRunOptions.d.ts +5 -0
- package/dist/caddy/CaddyProcessRunOptions.d.ts.map +1 -0
- package/dist/caddy/CaddyProcessRunOptions.js +2 -0
- package/dist/caddy/CaddyProcessRunOptions.js.map +1 -0
- package/dist/caddy/CaddyProcessRunner.d.ts +8 -0
- package/dist/caddy/CaddyProcessRunner.d.ts.map +1 -0
- package/dist/caddy/CaddyProcessRunner.js +2 -0
- package/dist/caddy/CaddyProcessRunner.js.map +1 -0
- package/dist/caddy/CaddyProjectListAccess.d.ts +7 -0
- package/dist/caddy/CaddyProjectListAccess.d.ts.map +1 -0
- package/dist/caddy/CaddyProjectListAccess.js +2 -0
- package/dist/caddy/CaddyProjectListAccess.js.map +1 -0
- package/dist/caddy/CaddyTimer.d.ts +8 -0
- package/dist/caddy/CaddyTimer.d.ts.map +1 -0
- package/dist/caddy/CaddyTimer.js +2 -0
- package/dist/caddy/CaddyTimer.js.map +1 -0
- package/dist/caddy/caddyAdminLoad.d.ts +6 -0
- package/dist/caddy/caddyAdminLoad.d.ts.map +1 -0
- package/dist/caddy/caddyAdminLoad.js +222 -0
- package/dist/caddy/caddyAdminLoad.js.map +1 -0
- package/dist/caddy/caddyAdminReload.d.ts +3 -0
- package/dist/caddy/caddyAdminReload.d.ts.map +1 -0
- package/dist/caddy/caddyAdminReload.js +5 -0
- package/dist/caddy/caddyAdminReload.js.map +1 -0
- package/dist/caddy/caddyApplicationCreate.d.ts +6 -0
- package/dist/caddy/caddyApplicationCreate.d.ts.map +1 -0
- package/dist/caddy/caddyApplicationCreate.js +776 -0
- package/dist/caddy/caddyApplicationCreate.js.map +1 -0
- package/dist/caddy/caddyApplicationQueueCreate.d.ts +3 -0
- package/dist/caddy/caddyApplicationQueueCreate.d.ts.map +1 -0
- package/dist/caddy/caddyApplicationQueueCreate.js +11 -0
- package/dist/caddy/caddyApplicationQueueCreate.js.map +1 -0
- package/dist/caddy/caddyConfigGenerate.d.ts +4 -0
- package/dist/caddy/caddyConfigGenerate.d.ts.map +1 -0
- package/dist/caddy/caddyConfigGenerate.js +390 -0
- package/dist/caddy/caddyConfigGenerate.js.map +1 -0
- package/dist/caddy/caddyConfigInspect.d.ts +4 -0
- package/dist/caddy/caddyConfigInspect.d.ts.map +1 -0
- package/dist/caddy/caddyConfigInspect.js +61 -0
- package/dist/caddy/caddyConfigInspect.js.map +1 -0
- package/dist/caddy/caddyConfigInspectUseCase.d.ts +5 -0
- package/dist/caddy/caddyConfigInspectUseCase.d.ts.map +1 -0
- package/dist/caddy/caddyConfigInspectUseCase.js +19 -0
- package/dist/caddy/caddyConfigInspectUseCase.js.map +1 -0
- package/dist/caddy/caddyConfigOptionsFromEnv.d.ts +4 -0
- package/dist/caddy/caddyConfigOptionsFromEnv.d.ts.map +1 -0
- package/dist/caddy/caddyConfigOptionsFromEnv.js +44 -0
- package/dist/caddy/caddyConfigOptionsFromEnv.js.map +1 -0
- package/dist/caddy/caddyConfigOptionsSchema.d.ts +47 -0
- package/dist/caddy/caddyConfigOptionsSchema.d.ts.map +1 -0
- package/dist/caddy/caddyConfigOptionsSchema.js +24 -0
- package/dist/caddy/caddyConfigOptionsSchema.js.map +1 -0
- package/dist/caddy/caddyConfigSelect.d.ts +5 -0
- package/dist/caddy/caddyConfigSelect.d.ts.map +1 -0
- package/dist/caddy/caddyConfigSelect.js +128 -0
- package/dist/caddy/caddyConfigSelect.js.map +1 -0
- package/dist/caddy/caddyConfigSerialize.d.ts +3 -0
- package/dist/caddy/caddyConfigSerialize.d.ts.map +1 -0
- package/dist/caddy/caddyConfigSerialize.js +121 -0
- package/dist/caddy/caddyConfigSerialize.js.map +1 -0
- package/dist/caddy/caddyConfigSummary.d.ts +4 -0
- package/dist/caddy/caddyConfigSummary.d.ts.map +1 -0
- package/dist/caddy/caddyConfigSummary.js +47 -0
- package/dist/caddy/caddyConfigSummary.js.map +1 -0
- package/dist/caddy/caddyConfigValidate.d.ts +6 -0
- package/dist/caddy/caddyConfigValidate.d.ts.map +1 -0
- package/dist/caddy/caddyConfigValidate.js +214 -0
- package/dist/caddy/caddyConfigValidate.js.map +1 -0
- package/dist/caddy/caddyDocsTemplate.d.ts +2 -0
- package/dist/caddy/caddyDocsTemplate.d.ts.map +1 -0
- package/dist/caddy/caddyDocsTemplate.js +6 -0
- package/dist/caddy/caddyDocsTemplate.js.map +1 -0
- package/dist/caddy/caddyProcessRun.d.ts +13 -0
- package/dist/caddy/caddyProcessRun.d.ts.map +1 -0
- package/dist/caddy/caddyProcessRun.js +128 -0
- package/dist/caddy/caddyProcessRun.js.map +1 -0
- package/dist/caddy/caddyProcessRunnerAsUser.d.ts +3 -0
- package/dist/caddy/caddyProcessRunnerAsUser.d.ts.map +1 -0
- package/dist/caddy/caddyProcessRunnerAsUser.js +5 -0
- package/dist/caddy/caddyProcessRunnerAsUser.js.map +1 -0
- package/dist/caddy/caddyVisibleProjects.d.ts +5 -0
- package/dist/caddy/caddyVisibleProjects.d.ts.map +1 -0
- package/dist/caddy/caddyVisibleProjects.js +54 -0
- package/dist/caddy/caddyVisibleProjects.js.map +1 -0
- package/dist/caddy/projectDocsUrls.d.ts +6 -0
- package/dist/caddy/projectDocsUrls.d.ts.map +1 -0
- package/dist/caddy/projectDocsUrls.js +47 -0
- package/dist/caddy/projectDocsUrls.js.map +1 -0
- package/dist/caddy/projectDocsUrlsUseCase.d.ts +5 -0
- package/dist/caddy/projectDocsUrlsUseCase.d.ts.map +1 -0
- package/dist/caddy/projectDocsUrlsUseCase.js +38 -0
- package/dist/caddy/projectDocsUrlsUseCase.js.map +1 -0
- package/dist/cli/ProjectRegistryCliCaddyOptions.d.ts +14 -0
- package/dist/cli/ProjectRegistryCliCaddyOptions.d.ts.map +1 -0
- package/dist/cli/ProjectRegistryCliCaddyOptions.js +2 -0
- package/dist/cli/ProjectRegistryCliCaddyOptions.js.map +1 -0
- package/dist/cli/ProjectRegistryCliFetch.d.ts +4 -0
- package/dist/cli/ProjectRegistryCliFetch.d.ts.map +1 -0
- package/dist/cli/ProjectRegistryCliFetch.js +2 -0
- package/dist/cli/ProjectRegistryCliFetch.js.map +1 -0
- package/dist/cli/ProjectRegistryCliInvocation.d.ts +59 -0
- package/dist/cli/ProjectRegistryCliInvocation.d.ts.map +1 -0
- package/dist/cli/ProjectRegistryCliInvocation.js +2 -0
- package/dist/cli/ProjectRegistryCliInvocation.js.map +1 -0
- package/dist/cli/projectNameFromPath.d.ts +8 -0
- package/dist/cli/projectNameFromPath.d.ts.map +1 -0
- package/dist/cli/projectNameFromPath.js +29 -0
- package/dist/cli/projectNameFromPath.js.map +1 -0
- package/dist/cli/projectRegistryCliArgumentsParse.d.ts +4 -0
- package/dist/cli/projectRegistryCliArgumentsParse.d.ts.map +1 -0
- package/dist/cli/projectRegistryCliArgumentsParse.js +386 -0
- package/dist/cli/projectRegistryCliArgumentsParse.js.map +1 -0
- package/dist/cli/projectRegistryCliHelp.d.ts +2 -0
- package/dist/cli/projectRegistryCliHelp.d.ts.map +1 -0
- package/dist/cli/projectRegistryCliHelp.js +38 -0
- package/dist/cli/projectRegistryCliHelp.js.map +1 -0
- package/dist/cli/projectRegistryCliOutputFormat.d.ts +4 -0
- package/dist/cli/projectRegistryCliOutputFormat.d.ts.map +1 -0
- package/dist/cli/projectRegistryCliOutputFormat.js +208 -0
- package/dist/cli/projectRegistryCliOutputFormat.js.map +1 -0
- package/dist/cli/projectRegistryCliRequest.d.ts +9 -0
- package/dist/cli/projectRegistryCliRequest.d.ts.map +1 -0
- package/dist/cli/projectRegistryCliRequest.js +75 -0
- package/dist/cli/projectRegistryCliRequest.js.map +1 -0
- package/dist/cli/projectRegistryCliRun.d.ts +10 -0
- package/dist/cli/projectRegistryCliRun.d.ts.map +1 -0
- package/dist/cli/projectRegistryCliRun.js +200 -0
- package/dist/cli/projectRegistryCliRun.js.map +1 -0
- package/dist/cli/projectRegistryCliSocketResolve.d.ts +3 -0
- package/dist/cli/projectRegistryCliSocketResolve.d.ts.map +1 -0
- package/dist/cli/projectRegistryCliSocketResolve.js +21 -0
- package/dist/cli/projectRegistryCliSocketResolve.js.map +1 -0
- package/dist/cli/projectRegistryCliVersion.d.ts +2 -0
- package/dist/cli/projectRegistryCliVersion.d.ts.map +1 -0
- package/dist/cli/projectRegistryCliVersion.js +2 -0
- package/dist/cli/projectRegistryCliVersion.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +4 -0
- package/dist/cli.js.map +1 -0
- package/dist/daemon.d.ts +3 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +40 -0
- package/dist/daemon.js.map +1 -0
- package/dist/identity/IdentityDirectory.d.ts +8 -0
- package/dist/identity/IdentityDirectory.d.ts.map +1 -0
- package/dist/identity/IdentityDirectory.js +2 -0
- package/dist/identity/IdentityDirectory.js.map +1 -0
- package/dist/identity/IdentityDirectoryUser.d.ts +5 -0
- package/dist/identity/IdentityDirectoryUser.d.ts.map +1 -0
- package/dist/identity/IdentityDirectoryUser.js +2 -0
- package/dist/identity/IdentityDirectoryUser.js.map +1 -0
- package/dist/identity/MappedUser.d.ts +7 -0
- package/dist/identity/MappedUser.d.ts.map +1 -0
- package/dist/identity/MappedUser.js +2 -0
- package/dist/identity/MappedUser.js.map +1 -0
- package/dist/identity/PosixUserDirectory.d.ts +5 -0
- package/dist/identity/PosixUserDirectory.d.ts.map +1 -0
- package/dist/identity/PosixUserDirectory.js +2 -0
- package/dist/identity/PosixUserDirectory.js.map +1 -0
- package/dist/identity/VisibleUser.d.ts +7 -0
- package/dist/identity/VisibleUser.d.ts.map +1 -0
- package/dist/identity/VisibleUser.js +2 -0
- package/dist/identity/VisibleUser.js.map +1 -0
- package/dist/identity/VisibleUserDirectoryListOptions.d.ts +12 -0
- package/dist/identity/VisibleUserDirectoryListOptions.d.ts.map +1 -0
- package/dist/identity/VisibleUserDirectoryListOptions.js +2 -0
- package/dist/identity/VisibleUserDirectoryListOptions.js.map +1 -0
- package/dist/identity/posixUserDirectoryCreate.d.ts +4 -0
- package/dist/identity/posixUserDirectoryCreate.d.ts.map +1 -0
- package/dist/identity/posixUserDirectoryCreate.js +47 -0
- package/dist/identity/posixUserDirectoryCreate.js.map +1 -0
- package/dist/identity/preferredUsernameMap.d.ts +7 -0
- package/dist/identity/preferredUsernameMap.d.ts.map +1 -0
- package/dist/identity/preferredUsernameMap.js +19 -0
- package/dist/identity/preferredUsernameMap.js.map +1 -0
- package/dist/identity/userRoleResolve.d.ts +8 -0
- package/dist/identity/userRoleResolve.d.ts.map +1 -0
- package/dist/identity/userRoleResolve.js +31 -0
- package/dist/identity/userRoleResolve.js.map +1 -0
- package/dist/identity/visibleUserDirectoryList.d.ts +6 -0
- package/dist/identity/visibleUserDirectoryList.d.ts.map +1 -0
- package/dist/identity/visibleUserDirectoryList.js +70 -0
- package/dist/identity/visibleUserDirectoryList.js.map +1 -0
- package/dist/index.d.ts +192 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +90 -0
- package/dist/index.js.map +1 -0
- package/dist/project/Project.d.ts +2 -0
- package/dist/project/Project.d.ts.map +1 -0
- package/dist/project/Project.js +2 -0
- package/dist/project/Project.js.map +1 -0
- package/dist/project/ProjectMutationOptions.d.ts +5 -0
- package/dist/project/ProjectMutationOptions.d.ts.map +1 -0
- package/dist/project/ProjectMutationOptions.js +2 -0
- package/dist/project/ProjectMutationOptions.js.map +1 -0
- package/dist/project/ProjectUseCaseOptions.d.ts +9 -0
- package/dist/project/ProjectUseCaseOptions.d.ts.map +1 -0
- package/dist/project/ProjectUseCaseOptions.js +2 -0
- package/dist/project/ProjectUseCaseOptions.js.map +1 -0
- package/dist/project/projectCollisions.d.ts +10 -0
- package/dist/project/projectCollisions.d.ts.map +1 -0
- package/dist/project/projectCollisions.js +67 -0
- package/dist/project/projectCollisions.js.map +1 -0
- package/dist/project/projectCreate.d.ts +6 -0
- package/dist/project/projectCreate.d.ts.map +1 -0
- package/dist/project/projectCreate.js +40 -0
- package/dist/project/projectCreate.js.map +1 -0
- package/dist/project/projectDelete.d.ts +7 -0
- package/dist/project/projectDelete.d.ts.map +1 -0
- package/dist/project/projectDelete.js +24 -0
- package/dist/project/projectDelete.js.map +1 -0
- package/dist/project/projectDomainNormalize.d.ts +2 -0
- package/dist/project/projectDomainNormalize.d.ts.map +1 -0
- package/dist/project/projectDomainNormalize.js +4 -0
- package/dist/project/projectDomainNormalize.js.map +1 -0
- package/dist/project/projectEdit.d.ts +7 -0
- package/dist/project/projectEdit.d.ts.map +1 -0
- package/dist/project/projectEdit.js +85 -0
- package/dist/project/projectEdit.js.map +1 -0
- package/dist/project/projectGet.d.ts +5 -0
- package/dist/project/projectGet.d.ts.map +1 -0
- package/dist/project/projectGet.js +12 -0
- package/dist/project/projectGet.js.map +1 -0
- package/dist/project/projectGetUseCase.d.ts +6 -0
- package/dist/project/projectGetUseCase.d.ts.map +1 -0
- package/dist/project/projectGetUseCase.js +19 -0
- package/dist/project/projectGetUseCase.js.map +1 -0
- package/dist/project/projectHeaderUpSchema.d.ts +3 -0
- package/dist/project/projectHeaderUpSchema.d.ts.map +1 -0
- package/dist/project/projectHeaderUpSchema.js +28 -0
- package/dist/project/projectHeaderUpSchema.js.map +1 -0
- package/dist/project/projectHistory.d.ts +6 -0
- package/dist/project/projectHistory.d.ts.map +1 -0
- package/dist/project/projectHistory.js +11 -0
- package/dist/project/projectHistory.js.map +1 -0
- package/dist/project/projectInputSchema.d.ts +36 -0
- package/dist/project/projectInputSchema.d.ts.map +1 -0
- package/dist/project/projectInputSchema.js +42 -0
- package/dist/project/projectInputSchema.js.map +1 -0
- package/dist/project/projectKey.d.ts +4 -0
- package/dist/project/projectKey.d.ts.map +1 -0
- package/dist/project/projectKey.js +4 -0
- package/dist/project/projectKey.js.map +1 -0
- package/dist/project/projectKeyEqual.d.ts +3 -0
- package/dist/project/projectKeyEqual.d.ts.map +1 -0
- package/dist/project/projectKeyEqual.js +4 -0
- package/dist/project/projectKeyEqual.js.map +1 -0
- package/dist/project/projectList.d.ts +4 -0
- package/dist/project/projectList.d.ts.map +1 -0
- package/dist/project/projectList.js +6 -0
- package/dist/project/projectList.js.map +1 -0
- package/dist/project/projectListUseCase.d.ts +12 -0
- package/dist/project/projectListUseCase.d.ts.map +1 -0
- package/dist/project/projectListUseCase.js +78 -0
- package/dist/project/projectListUseCase.js.map +1 -0
- package/dist/project/projectMutationExpectedRevision.d.ts +4 -0
- package/dist/project/projectMutationExpectedRevision.d.ts.map +1 -0
- package/dist/project/projectMutationExpectedRevision.js +21 -0
- package/dist/project/projectMutationExpectedRevision.js.map +1 -0
- package/dist/project/projectNormalize.d.ts +12 -0
- package/dist/project/projectNormalize.d.ts.map +1 -0
- package/dist/project/projectNormalize.js +174 -0
- package/dist/project/projectNormalize.js.map +1 -0
- package/dist/project/projectOwnerAuthorize.d.ts +5 -0
- package/dist/project/projectOwnerAuthorize.d.ts.map +1 -0
- package/dist/project/projectOwnerAuthorize.js +12 -0
- package/dist/project/projectOwnerAuthorize.js.map +1 -0
- package/dist/project/projectPortCollision.d.ts +4 -0
- package/dist/project/projectPortCollision.d.ts.map +1 -0
- package/dist/project/projectPortCollision.js +12 -0
- package/dist/project/projectPortCollision.js.map +1 -0
- package/dist/project/projectPortNext.d.ts +9 -0
- package/dist/project/projectPortNext.d.ts.map +1 -0
- package/dist/project/projectPortNext.js +32 -0
- package/dist/project/projectPortNext.js.map +1 -0
- package/dist/project/projectRevisionValidate.d.ts +4 -0
- package/dist/project/projectRevisionValidate.d.ts.map +1 -0
- package/dist/project/projectRevisionValidate.js +9 -0
- package/dist/project/projectRevisionValidate.js.map +1 -0
- package/dist/project/projectSchema.d.ts +36 -0
- package/dist/project/projectSchema.d.ts.map +1 -0
- package/dist/project/projectSchema.js +43 -0
- package/dist/project/projectSchema.js.map +1 -0
- package/dist/project/projectSort.d.ts +3 -0
- package/dist/project/projectSort.d.ts.map +1 -0
- package/dist/project/projectSort.js +24 -0
- package/dist/project/projectSort.js.map +1 -0
- package/dist/project/projectValidate.d.ts +10 -0
- package/dist/project/projectValidate.d.ts.map +1 -0
- package/dist/project/projectValidate.js +26 -0
- package/dist/project/projectValidate.js.map +1 -0
- package/dist/project-store/ProjectRepository.d.ts +20 -0
- package/dist/project-store/ProjectRepository.d.ts.map +1 -0
- package/dist/project-store/ProjectRepository.js +2 -0
- package/dist/project-store/ProjectRepository.js.map +1 -0
- package/dist/project-store/ProjectRepositoryEntry.d.ts +7 -0
- package/dist/project-store/ProjectRepositoryEntry.d.ts.map +1 -0
- package/dist/project-store/ProjectRepositoryEntry.js +2 -0
- package/dist/project-store/ProjectRepositoryEntry.js.map +1 -0
- package/dist/project-store/ProjectRepositoryMutation.d.ts +18 -0
- package/dist/project-store/ProjectRepositoryMutation.d.ts.map +1 -0
- package/dist/project-store/ProjectRepositoryMutation.js +2 -0
- package/dist/project-store/ProjectRepositoryMutation.js.map +1 -0
- package/dist/project-store/ProjectRepositoryMutationOptions.d.ts +6 -0
- package/dist/project-store/ProjectRepositoryMutationOptions.d.ts.map +1 -0
- package/dist/project-store/ProjectRepositoryMutationOptions.js +2 -0
- package/dist/project-store/ProjectRepositoryMutationOptions.js.map +1 -0
- package/dist/project-store/ProjectRepositoryOptions.d.ts +8 -0
- package/dist/project-store/ProjectRepositoryOptions.d.ts.map +1 -0
- package/dist/project-store/ProjectRepositoryOptions.js +7 -0
- package/dist/project-store/ProjectRepositoryOptions.js.map +1 -0
- package/dist/project-store/ProjectRepositoryReadiness.d.ts +8 -0
- package/dist/project-store/ProjectRepositoryReadiness.d.ts.map +1 -0
- package/dist/project-store/ProjectRepositoryReadiness.js +2 -0
- package/dist/project-store/ProjectRepositoryReadiness.js.map +1 -0
- package/dist/project-store/ProjectRepositoryRevision.d.ts +2 -0
- package/dist/project-store/ProjectRepositoryRevision.d.ts.map +1 -0
- package/dist/project-store/ProjectRepositoryRevision.js +2 -0
- package/dist/project-store/ProjectRepositoryRevision.js.map +1 -0
- package/dist/project-store/ProjectRepositorySnapshot.d.ts +7 -0
- package/dist/project-store/ProjectRepositorySnapshot.d.ts.map +1 -0
- package/dist/project-store/ProjectRepositorySnapshot.js +2 -0
- package/dist/project-store/ProjectRepositorySnapshot.js.map +1 -0
- package/dist/project-store/projectRepositoryOpen.d.ts +4 -0
- package/dist/project-store/projectRepositoryOpen.d.ts.map +1 -0
- package/dist/project-store/projectRepositoryOpen.js +813 -0
- package/dist/project-store/projectRepositoryOpen.js.map +1 -0
- package/dist/project-store/projectRepositoryOwnerPath.d.ts +3 -0
- package/dist/project-store/projectRepositoryOwnerPath.d.ts.map +1 -0
- package/dist/project-store/projectRepositoryOwnerPath.js +25 -0
- package/dist/project-store/projectRepositoryOwnerPath.js.map +1 -0
- package/dist/project-store/projectRepositoryPath.d.ts +4 -0
- package/dist/project-store/projectRepositoryPath.d.ts.map +1 -0
- package/dist/project-store/projectRepositoryPath.js +21 -0
- package/dist/project-store/projectRepositoryPath.js.map +1 -0
- package/dist/runtime/ProjectRegistryDaemon.d.ts +19 -0
- package/dist/runtime/ProjectRegistryDaemon.d.ts.map +1 -0
- package/dist/runtime/ProjectRegistryDaemon.js +2 -0
- package/dist/runtime/ProjectRegistryDaemon.js.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonBrowserAuth.d.ts +14 -0
- package/dist/runtime/ProjectRegistryDaemonBrowserAuth.d.ts.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonBrowserAuth.js +2 -0
- package/dist/runtime/ProjectRegistryDaemonBrowserAuth.js.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonConfig.d.ts +38 -0
- package/dist/runtime/ProjectRegistryDaemonConfig.d.ts.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonConfig.js +2 -0
- package/dist/runtime/ProjectRegistryDaemonConfig.js.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonFileStat.d.ts +7 -0
- package/dist/runtime/ProjectRegistryDaemonFileStat.d.ts.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonFileStat.js +2 -0
- package/dist/runtime/ProjectRegistryDaemonFileStat.js.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonFilesystem.d.ts +13 -0
- package/dist/runtime/ProjectRegistryDaemonFilesystem.d.ts.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonFilesystem.js +2 -0
- package/dist/runtime/ProjectRegistryDaemonFilesystem.js.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonHealth.d.ts +6 -0
- package/dist/runtime/ProjectRegistryDaemonHealth.d.ts.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonHealth.js +2 -0
- package/dist/runtime/ProjectRegistryDaemonHealth.js.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonMappedUser.d.ts +6 -0
- package/dist/runtime/ProjectRegistryDaemonMappedUser.d.ts.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonMappedUser.js +2 -0
- package/dist/runtime/ProjectRegistryDaemonMappedUser.js.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonMappedUsersResolve.d.ts +4 -0
- package/dist/runtime/ProjectRegistryDaemonMappedUsersResolve.d.ts.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonMappedUsersResolve.js +2 -0
- package/dist/runtime/ProjectRegistryDaemonMappedUsersResolve.js.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonOptions.d.ts +39 -0
- package/dist/runtime/ProjectRegistryDaemonOptions.d.ts.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonOptions.js +2 -0
- package/dist/runtime/ProjectRegistryDaemonOptions.js.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonPosix.d.ts +7 -0
- package/dist/runtime/ProjectRegistryDaemonPosix.d.ts.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonPosix.js +2 -0
- package/dist/runtime/ProjectRegistryDaemonPosix.js.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonReadiness.d.ts +11 -0
- package/dist/runtime/ProjectRegistryDaemonReadiness.d.ts.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonReadiness.js +2 -0
- package/dist/runtime/ProjectRegistryDaemonReadiness.js.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonRequestContext.d.ts +10 -0
- package/dist/runtime/ProjectRegistryDaemonRequestContext.d.ts.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonRequestContext.js +2 -0
- package/dist/runtime/ProjectRegistryDaemonRequestContext.js.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonRequestHandler.d.ts +3 -0
- package/dist/runtime/ProjectRegistryDaemonRequestHandler.d.ts.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonRequestHandler.js +2 -0
- package/dist/runtime/ProjectRegistryDaemonRequestHandler.js.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonServer.d.ts +6 -0
- package/dist/runtime/ProjectRegistryDaemonServer.d.ts.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonServer.js +2 -0
- package/dist/runtime/ProjectRegistryDaemonServer.js.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonServerFactory.d.ts +4 -0
- package/dist/runtime/ProjectRegistryDaemonServerFactory.d.ts.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonServerFactory.js +2 -0
- package/dist/runtime/ProjectRegistryDaemonServerFactory.js.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonServerOptions.d.ts +7 -0
- package/dist/runtime/ProjectRegistryDaemonServerOptions.d.ts.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonServerOptions.js +2 -0
- package/dist/runtime/ProjectRegistryDaemonServerOptions.js.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonSignals.d.ts +4 -0
- package/dist/runtime/ProjectRegistryDaemonSignals.d.ts.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonSignals.js +2 -0
- package/dist/runtime/ProjectRegistryDaemonSignals.js.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonSocketAccessResolve.d.ts +4 -0
- package/dist/runtime/ProjectRegistryDaemonSocketAccessResolve.d.ts.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonSocketAccessResolve.js +2 -0
- package/dist/runtime/ProjectRegistryDaemonSocketAccessResolve.js.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonSocketRefresh.d.ts +7 -0
- package/dist/runtime/ProjectRegistryDaemonSocketRefresh.d.ts.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonSocketRefresh.js +2 -0
- package/dist/runtime/ProjectRegistryDaemonSocketRefresh.js.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonState.d.ts +2 -0
- package/dist/runtime/ProjectRegistryDaemonState.d.ts.map +1 -0
- package/dist/runtime/ProjectRegistryDaemonState.js +2 -0
- package/dist/runtime/ProjectRegistryDaemonState.js.map +1 -0
- package/dist/runtime/clockNowResolve.d.ts +3 -0
- package/dist/runtime/clockNowResolve.d.ts.map +1 -0
- package/dist/runtime/clockNowResolve.js +18 -0
- package/dist/runtime/clockNowResolve.js.map +1 -0
- package/dist/runtime/projectRegistryDaemonConfigFromEnv.d.ts +4 -0
- package/dist/runtime/projectRegistryDaemonConfigFromEnv.d.ts.map +1 -0
- package/dist/runtime/projectRegistryDaemonConfigFromEnv.js +158 -0
- package/dist/runtime/projectRegistryDaemonConfigFromEnv.js.map +1 -0
- package/dist/runtime/projectRegistryDaemonConfigSchema.d.ts +57 -0
- package/dist/runtime/projectRegistryDaemonConfigSchema.d.ts.map +1 -0
- package/dist/runtime/projectRegistryDaemonConfigSchema.js +79 -0
- package/dist/runtime/projectRegistryDaemonConfigSchema.js.map +1 -0
- package/dist/runtime/projectRegistryDaemonConfigValidate.d.ts +4 -0
- package/dist/runtime/projectRegistryDaemonConfigValidate.d.ts.map +1 -0
- package/dist/runtime/projectRegistryDaemonConfigValidate.js +59 -0
- package/dist/runtime/projectRegistryDaemonConfigValidate.js.map +1 -0
- package/dist/runtime/projectRegistryDaemonCreate.d.ts +5 -0
- package/dist/runtime/projectRegistryDaemonCreate.d.ts.map +1 -0
- package/dist/runtime/projectRegistryDaemonCreate.js +1251 -0
- package/dist/runtime/projectRegistryDaemonCreate.js.map +1 -0
- package/dist/runtime/projectRegistryDaemonFilesystemDefault.d.ts +3 -0
- package/dist/runtime/projectRegistryDaemonFilesystemDefault.d.ts.map +1 -0
- package/dist/runtime/projectRegistryDaemonFilesystemDefault.js +62 -0
- package/dist/runtime/projectRegistryDaemonFilesystemDefault.js.map +1 -0
- package/dist/runtime/projectRegistryDaemonOpen.d.ts +5 -0
- package/dist/runtime/projectRegistryDaemonOpen.d.ts.map +1 -0
- package/dist/runtime/projectRegistryDaemonOpen.js +132 -0
- package/dist/runtime/projectRegistryDaemonOpen.js.map +1 -0
- package/dist/runtime/projectRegistryDaemonPosixDefault.d.ts +3 -0
- package/dist/runtime/projectRegistryDaemonPosixDefault.d.ts.map +1 -0
- package/dist/runtime/projectRegistryDaemonPosixDefault.js +30 -0
- package/dist/runtime/projectRegistryDaemonPosixDefault.js.map +1 -0
- package/dist/runtime/projectRegistryDaemonServerDefault.d.ts +3 -0
- package/dist/runtime/projectRegistryDaemonServerDefault.d.ts.map +1 -0
- package/dist/runtime/projectRegistryDaemonServerDefault.js +20 -0
- package/dist/runtime/projectRegistryDaemonServerDefault.js.map +1 -0
- package/dist/runtime/projectRegistryDaemonSignalsDefault.d.ts +3 -0
- package/dist/runtime/projectRegistryDaemonSignalsDefault.d.ts.map +1 -0
- package/dist/runtime/projectRegistryDaemonSignalsDefault.js +9 -0
- package/dist/runtime/projectRegistryDaemonSignalsDefault.js.map +1 -0
- package/dist/runtime/promiseBoundedRace.d.ts +6 -0
- package/dist/runtime/promiseBoundedRace.d.ts.map +1 -0
- package/dist/runtime/promiseBoundedRace.js +52 -0
- package/dist/runtime/promiseBoundedRace.js.map +1 -0
- package/dist/runtime/randomBytesResultResolve.d.ts +3 -0
- package/dist/runtime/randomBytesResultResolve.d.ts.map +1 -0
- package/dist/runtime/randomBytesResultResolve.js +25 -0
- package/dist/runtime/randomBytesResultResolve.js.map +1 -0
- package/dist/runtime/timeExpiryResolve.d.ts +3 -0
- package/dist/runtime/timeExpiryResolve.d.ts.map +1 -0
- package/dist/runtime/timeExpiryResolve.js +15 -0
- package/dist/runtime/timeExpiryResolve.js.map +1 -0
- package/dist/runtime/timeMillisecondsValidate.d.ts +2 -0
- package/dist/runtime/timeMillisecondsValidate.d.ts.map +1 -0
- package/dist/runtime/timeMillisecondsValidate.js +4 -0
- package/dist/runtime/timeMillisecondsValidate.js.map +1 -0
- package/dist/runtime/timeSecondsValidate.d.ts +2 -0
- package/dist/runtime/timeSecondsValidate.d.ts.map +1 -0
- package/dist/runtime/timeSecondsValidate.js +5 -0
- package/dist/runtime/timeSecondsValidate.js.map +1 -0
- package/dist/session/Clock.d.ts +2 -0
- package/dist/session/Clock.d.ts.map +1 -0
- package/dist/session/Clock.js +2 -0
- package/dist/session/Clock.js.map +1 -0
- package/dist/session/CsrfTokenStore.d.ts +7 -0
- package/dist/session/CsrfTokenStore.d.ts.map +1 -0
- package/dist/session/CsrfTokenStore.js +2 -0
- package/dist/session/CsrfTokenStore.js.map +1 -0
- package/dist/session/CsrfTokenStoreOptions.d.ts +9 -0
- package/dist/session/CsrfTokenStoreOptions.d.ts.map +1 -0
- package/dist/session/CsrfTokenStoreOptions.js +2 -0
- package/dist/session/CsrfTokenStoreOptions.js.map +1 -0
- package/dist/session/RandomBytes.d.ts +3 -0
- package/dist/session/RandomBytes.d.ts.map +1 -0
- package/dist/session/RandomBytes.js +2 -0
- package/dist/session/RandomBytes.js.map +1 -0
- package/dist/session/SessionActorResolveOptions.d.ts +15 -0
- package/dist/session/SessionActorResolveOptions.d.ts.map +1 -0
- package/dist/session/SessionActorResolveOptions.js +2 -0
- package/dist/session/SessionActorResolveOptions.js.map +1 -0
- package/dist/session/SessionCookieOptions.d.ts +5 -0
- package/dist/session/SessionCookieOptions.d.ts.map +1 -0
- package/dist/session/SessionCookieOptions.js +2 -0
- package/dist/session/SessionCookieOptions.js.map +1 -0
- package/dist/session/SessionCreateInput.d.ts +6 -0
- package/dist/session/SessionCreateInput.d.ts.map +1 -0
- package/dist/session/SessionCreateInput.js +2 -0
- package/dist/session/SessionCreateInput.js.map +1 -0
- package/dist/session/SessionLogoutOptions.d.ts +12 -0
- package/dist/session/SessionLogoutOptions.d.ts.map +1 -0
- package/dist/session/SessionLogoutOptions.js +2 -0
- package/dist/session/SessionLogoutOptions.js.map +1 -0
- package/dist/session/SessionRecord.d.ts +9 -0
- package/dist/session/SessionRecord.d.ts.map +1 -0
- package/dist/session/SessionRecord.js +2 -0
- package/dist/session/SessionRecord.js.map +1 -0
- package/dist/session/SessionStore.d.ts +11 -0
- package/dist/session/SessionStore.d.ts.map +1 -0
- package/dist/session/SessionStore.js +2 -0
- package/dist/session/SessionStore.js.map +1 -0
- package/dist/session/SessionStoreOptions.d.ts +11 -0
- package/dist/session/SessionStoreOptions.d.ts.map +1 -0
- package/dist/session/SessionStoreOptions.js +2 -0
- package/dist/session/SessionStoreOptions.js.map +1 -0
- package/dist/session/TokenReferenceStore.d.ts +10 -0
- package/dist/session/TokenReferenceStore.d.ts.map +1 -0
- package/dist/session/TokenReferenceStore.js +2 -0
- package/dist/session/TokenReferenceStore.js.map +1 -0
- package/dist/session/TokenReferenceStoreOptions.d.ts +8 -0
- package/dist/session/TokenReferenceStoreOptions.d.ts.map +1 -0
- package/dist/session/TokenReferenceStoreOptions.js +2 -0
- package/dist/session/TokenReferenceStoreOptions.js.map +1 -0
- package/dist/session/TokenReferenceTokens.d.ts +6 -0
- package/dist/session/TokenReferenceTokens.d.ts.map +1 -0
- package/dist/session/TokenReferenceTokens.js +2 -0
- package/dist/session/TokenReferenceTokens.js.map +1 -0
- package/dist/session/csrfTokenIssue.d.ts +4 -0
- package/dist/session/csrfTokenIssue.d.ts.map +1 -0
- package/dist/session/csrfTokenIssue.js +4 -0
- package/dist/session/csrfTokenIssue.js.map +1 -0
- package/dist/session/csrfTokenStoreCreate.d.ts +4 -0
- package/dist/session/csrfTokenStoreCreate.d.ts.map +1 -0
- package/dist/session/csrfTokenStoreCreate.js +179 -0
- package/dist/session/csrfTokenStoreCreate.js.map +1 -0
- package/dist/session/csrfTokenValidate.d.ts +4 -0
- package/dist/session/csrfTokenValidate.d.ts.map +1 -0
- package/dist/session/csrfTokenValidate.js +16 -0
- package/dist/session/csrfTokenValidate.js.map +1 -0
- package/dist/session/randomBytesGenerate.d.ts +3 -0
- package/dist/session/randomBytesGenerate.d.ts.map +1 -0
- package/dist/session/randomBytesGenerate.js +16 -0
- package/dist/session/randomBytesGenerate.js.map +1 -0
- package/dist/session/sessionActorResolve.d.ts +5 -0
- package/dist/session/sessionActorResolve.d.ts.map +1 -0
- package/dist/session/sessionActorResolve.js +98 -0
- package/dist/session/sessionActorResolve.js.map +1 -0
- package/dist/session/sessionCookieClear.d.ts +4 -0
- package/dist/session/sessionCookieClear.d.ts.map +1 -0
- package/dist/session/sessionCookieClear.js +20 -0
- package/dist/session/sessionCookieClear.js.map +1 -0
- package/dist/session/sessionCookieParse.d.ts +4 -0
- package/dist/session/sessionCookieParse.d.ts.map +1 -0
- package/dist/session/sessionCookieParse.js +42 -0
- package/dist/session/sessionCookieParse.js.map +1 -0
- package/dist/session/sessionCookieSerialize.d.ts +4 -0
- package/dist/session/sessionCookieSerialize.d.ts.map +1 -0
- package/dist/session/sessionCookieSerialize.js +28 -0
- package/dist/session/sessionCookieSerialize.js.map +1 -0
- package/dist/session/sessionLogout.d.ts +8 -0
- package/dist/session/sessionLogout.d.ts.map +1 -0
- package/dist/session/sessionLogout.js +74 -0
- package/dist/session/sessionLogout.js.map +1 -0
- package/dist/session/sessionRecordValidate.d.ts +4 -0
- package/dist/session/sessionRecordValidate.d.ts.map +1 -0
- package/dist/session/sessionRecordValidate.js +44 -0
- package/dist/session/sessionRecordValidate.js.map +1 -0
- package/dist/session/sessionRequestResolve.d.ts +9 -0
- package/dist/session/sessionRequestResolve.d.ts.map +1 -0
- package/dist/session/sessionRequestResolve.js +23 -0
- package/dist/session/sessionRequestResolve.js.map +1 -0
- package/dist/session/sessionStoreCreate.d.ts +4 -0
- package/dist/session/sessionStoreCreate.d.ts.map +1 -0
- package/dist/session/sessionStoreCreate.js +220 -0
- package/dist/session/sessionStoreCreate.js.map +1 -0
- package/dist/session/tokenReferenceIdValidate.d.ts +3 -0
- package/dist/session/tokenReferenceIdValidate.d.ts.map +1 -0
- package/dist/session/tokenReferenceIdValidate.js +10 -0
- package/dist/session/tokenReferenceIdValidate.js.map +1 -0
- package/dist/session/tokenReferenceStoreCreate.d.ts +4 -0
- package/dist/session/tokenReferenceStoreCreate.d.ts.map +1 -0
- package/dist/session/tokenReferenceStoreCreate.js +96 -0
- package/dist/session/tokenReferenceStoreCreate.js.map +1 -0
- package/dist/session/tokenReferenceTokensValidate.d.ts +4 -0
- package/dist/session/tokenReferenceTokensValidate.d.ts.map +1 -0
- package/dist/session/tokenReferenceTokensValidate.js +26 -0
- package/dist/session/tokenReferenceTokensValidate.js.map +1 -0
- package/dist/ui/assets/index-C5h9COjm.css +1 -0
- package/dist/ui/assets/index-CwUhaCYM.js +1 -0
- package/dist/ui/index.html +13 -0
- package/dist/web-server/MutationSecurityOptions.d.ts +11 -0
- package/dist/web-server/MutationSecurityOptions.d.ts.map +1 -0
- package/dist/web-server/MutationSecurityOptions.js +2 -0
- package/dist/web-server/MutationSecurityOptions.js.map +1 -0
- package/dist/web-server/mutationOriginValidate.d.ts +3 -0
- package/dist/web-server/mutationOriginValidate.d.ts.map +1 -0
- package/dist/web-server/mutationOriginValidate.js +30 -0
- package/dist/web-server/mutationOriginValidate.js.map +1 -0
- package/dist/web-server/mutationSecurityValidate.d.ts +4 -0
- package/dist/web-server/mutationSecurityValidate.d.ts.map +1 -0
- package/dist/web-server/mutationSecurityValidate.js +27 -0
- package/dist/web-server/mutationSecurityValidate.js.map +1 -0
- package/dist/zitadel/LoginTransaction.d.ts +9 -0
- package/dist/zitadel/LoginTransaction.d.ts.map +1 -0
- package/dist/zitadel/LoginTransaction.js +2 -0
- package/dist/zitadel/LoginTransaction.js.map +1 -0
- package/dist/zitadel/LoginTransactionStore.d.ts +7 -0
- package/dist/zitadel/LoginTransactionStore.d.ts.map +1 -0
- package/dist/zitadel/LoginTransactionStore.js +2 -0
- package/dist/zitadel/LoginTransactionStore.js.map +1 -0
- package/dist/zitadel/LoginTransactionStoreOptions.d.ts +6 -0
- package/dist/zitadel/LoginTransactionStoreOptions.d.ts.map +1 -0
- package/dist/zitadel/LoginTransactionStoreOptions.js +2 -0
- package/dist/zitadel/LoginTransactionStoreOptions.js.map +1 -0
- package/dist/zitadel/ZitadelCallbackOptions.d.ts +28 -0
- package/dist/zitadel/ZitadelCallbackOptions.d.ts.map +1 -0
- package/dist/zitadel/ZitadelCallbackOptions.js +2 -0
- package/dist/zitadel/ZitadelCallbackOptions.js.map +1 -0
- package/dist/zitadel/ZitadelCallbackResult.d.ts +8 -0
- package/dist/zitadel/ZitadelCallbackResult.d.ts.map +1 -0
- package/dist/zitadel/ZitadelCallbackResult.js +2 -0
- package/dist/zitadel/ZitadelCallbackResult.js.map +1 -0
- package/dist/zitadel/ZitadelDiscoveryDocument.d.ts +7 -0
- package/dist/zitadel/ZitadelDiscoveryDocument.d.ts.map +1 -0
- package/dist/zitadel/ZitadelDiscoveryDocument.js +2 -0
- package/dist/zitadel/ZitadelDiscoveryDocument.js.map +1 -0
- package/dist/zitadel/ZitadelHttp.d.ts +2 -0
- package/dist/zitadel/ZitadelHttp.d.ts.map +1 -0
- package/dist/zitadel/ZitadelHttp.js +2 -0
- package/dist/zitadel/ZitadelHttp.js.map +1 -0
- package/dist/zitadel/ZitadelHttpOptions.d.ts +6 -0
- package/dist/zitadel/ZitadelHttpOptions.d.ts.map +1 -0
- package/dist/zitadel/ZitadelHttpOptions.js +2 -0
- package/dist/zitadel/ZitadelHttpOptions.js.map +1 -0
- package/dist/zitadel/ZitadelIdentityClaims.d.ts +6 -0
- package/dist/zitadel/ZitadelIdentityClaims.d.ts.map +1 -0
- package/dist/zitadel/ZitadelIdentityClaims.js +2 -0
- package/dist/zitadel/ZitadelIdentityClaims.js.map +1 -0
- package/dist/zitadel/ZitadelIdentityDirectoryOptions.d.ts +11 -0
- package/dist/zitadel/ZitadelIdentityDirectoryOptions.d.ts.map +1 -0
- package/dist/zitadel/ZitadelIdentityDirectoryOptions.js +2 -0
- package/dist/zitadel/ZitadelIdentityDirectoryOptions.js.map +1 -0
- package/dist/zitadel/ZitadelJwk.d.ts +12 -0
- package/dist/zitadel/ZitadelJwk.d.ts.map +1 -0
- package/dist/zitadel/ZitadelJwk.js +2 -0
- package/dist/zitadel/ZitadelJwk.js.map +1 -0
- package/dist/zitadel/ZitadelJwks.d.ts +5 -0
- package/dist/zitadel/ZitadelJwks.d.ts.map +1 -0
- package/dist/zitadel/ZitadelJwks.js +2 -0
- package/dist/zitadel/ZitadelJwks.js.map +1 -0
- package/dist/zitadel/ZitadelLoginStartOptions.d.ts +17 -0
- package/dist/zitadel/ZitadelLoginStartOptions.d.ts.map +1 -0
- package/dist/zitadel/ZitadelLoginStartOptions.js +2 -0
- package/dist/zitadel/ZitadelLoginStartOptions.js.map +1 -0
- package/dist/zitadel/ZitadelLoginStartResult.d.ts +6 -0
- package/dist/zitadel/ZitadelLoginStartResult.d.ts.map +1 -0
- package/dist/zitadel/ZitadelLoginStartResult.js +2 -0
- package/dist/zitadel/ZitadelLoginStartResult.js.map +1 -0
- package/dist/zitadel/ZitadelOidcConfig.d.ts +10 -0
- package/dist/zitadel/ZitadelOidcConfig.d.ts.map +1 -0
- package/dist/zitadel/ZitadelOidcConfig.js +2 -0
- package/dist/zitadel/ZitadelOidcConfig.js.map +1 -0
- package/dist/zitadel/ZitadelPreAuthCookieOptions.d.ts +4 -0
- package/dist/zitadel/ZitadelPreAuthCookieOptions.d.ts.map +1 -0
- package/dist/zitadel/ZitadelPreAuthCookieOptions.js +2 -0
- package/dist/zitadel/ZitadelPreAuthCookieOptions.js.map +1 -0
- package/dist/zitadel/ZitadelTokenExchangeOptions.d.ts +17 -0
- package/dist/zitadel/ZitadelTokenExchangeOptions.d.ts.map +1 -0
- package/dist/zitadel/ZitadelTokenExchangeOptions.js +2 -0
- package/dist/zitadel/ZitadelTokenExchangeOptions.js.map +1 -0
- package/dist/zitadel/ZitadelTokens.d.ts +7 -0
- package/dist/zitadel/ZitadelTokens.d.ts.map +1 -0
- package/dist/zitadel/ZitadelTokens.js +2 -0
- package/dist/zitadel/ZitadelTokens.js.map +1 -0
- package/dist/zitadel/zitadelCallbackHandle.d.ts +5 -0
- package/dist/zitadel/zitadelCallbackHandle.d.ts.map +1 -0
- package/dist/zitadel/zitadelCallbackHandle.js +255 -0
- package/dist/zitadel/zitadelCallbackHandle.js.map +1 -0
- package/dist/zitadel/zitadelConfigValidate.d.ts +4 -0
- package/dist/zitadel/zitadelConfigValidate.d.ts.map +1 -0
- package/dist/zitadel/zitadelConfigValidate.js +88 -0
- package/dist/zitadel/zitadelConfigValidate.js.map +1 -0
- package/dist/zitadel/zitadelDiscoveryFetch.d.ts +7 -0
- package/dist/zitadel/zitadelDiscoveryFetch.d.ts.map +1 -0
- package/dist/zitadel/zitadelDiscoveryFetch.js +55 -0
- package/dist/zitadel/zitadelDiscoveryFetch.js.map +1 -0
- package/dist/zitadel/zitadelDiscoveryValidate.d.ts +4 -0
- package/dist/zitadel/zitadelDiscoveryValidate.d.ts.map +1 -0
- package/dist/zitadel/zitadelDiscoveryValidate.js +43 -0
- package/dist/zitadel/zitadelDiscoveryValidate.js.map +1 -0
- package/dist/zitadel/zitadelHttpJsonFetch.d.ts +8 -0
- package/dist/zitadel/zitadelHttpJsonFetch.d.ts.map +1 -0
- package/dist/zitadel/zitadelHttpJsonFetch.js +118 -0
- package/dist/zitadel/zitadelHttpJsonFetch.js.map +1 -0
- package/dist/zitadel/zitadelIdTokenValidate.d.ts +7 -0
- package/dist/zitadel/zitadelIdTokenValidate.d.ts.map +1 -0
- package/dist/zitadel/zitadelIdTokenValidate.js +170 -0
- package/dist/zitadel/zitadelIdTokenValidate.js.map +1 -0
- package/dist/zitadel/zitadelIdentityDirectoryCreate.d.ts +5 -0
- package/dist/zitadel/zitadelIdentityDirectoryCreate.d.ts.map +1 -0
- package/dist/zitadel/zitadelIdentityDirectoryCreate.js +268 -0
- package/dist/zitadel/zitadelIdentityDirectoryCreate.js.map +1 -0
- package/dist/zitadel/zitadelJwksFetch.d.ts +6 -0
- package/dist/zitadel/zitadelJwksFetch.d.ts.map +1 -0
- package/dist/zitadel/zitadelJwksFetch.js +36 -0
- package/dist/zitadel/zitadelJwksFetch.js.map +1 -0
- package/dist/zitadel/zitadelJwksValidate.d.ts +4 -0
- package/dist/zitadel/zitadelJwksValidate.d.ts.map +1 -0
- package/dist/zitadel/zitadelJwksValidate.js +69 -0
- package/dist/zitadel/zitadelJwksValidate.js.map +1 -0
- package/dist/zitadel/zitadelLoginStart.d.ts +5 -0
- package/dist/zitadel/zitadelLoginStart.d.ts.map +1 -0
- package/dist/zitadel/zitadelLoginStart.js +102 -0
- package/dist/zitadel/zitadelLoginStart.js.map +1 -0
- package/dist/zitadel/zitadelLoginTransactionStoreCreate.d.ts +4 -0
- package/dist/zitadel/zitadelLoginTransactionStoreCreate.d.ts.map +1 -0
- package/dist/zitadel/zitadelLoginTransactionStoreCreate.js +82 -0
- package/dist/zitadel/zitadelLoginTransactionStoreCreate.js.map +1 -0
- package/dist/zitadel/zitadelPreAuthCookieClear.d.ts +3 -0
- package/dist/zitadel/zitadelPreAuthCookieClear.d.ts.map +1 -0
- package/dist/zitadel/zitadelPreAuthCookieClear.js +6 -0
- package/dist/zitadel/zitadelPreAuthCookieClear.js.map +1 -0
- package/dist/zitadel/zitadelPreAuthCookieHash.d.ts +3 -0
- package/dist/zitadel/zitadelPreAuthCookieHash.d.ts.map +1 -0
- package/dist/zitadel/zitadelPreAuthCookieHash.js +20 -0
- package/dist/zitadel/zitadelPreAuthCookieHash.js.map +1 -0
- package/dist/zitadel/zitadelPreAuthCookieParse.d.ts +3 -0
- package/dist/zitadel/zitadelPreAuthCookieParse.d.ts.map +1 -0
- package/dist/zitadel/zitadelPreAuthCookieParse.js +33 -0
- package/dist/zitadel/zitadelPreAuthCookieParse.js.map +1 -0
- package/dist/zitadel/zitadelPreAuthCookieSerialize.d.ts +4 -0
- package/dist/zitadel/zitadelPreAuthCookieSerialize.d.ts.map +1 -0
- package/dist/zitadel/zitadelPreAuthCookieSerialize.js +20 -0
- package/dist/zitadel/zitadelPreAuthCookieSerialize.js.map +1 -0
- package/dist/zitadel/zitadelTokenExchange.d.ts +5 -0
- package/dist/zitadel/zitadelTokenExchange.d.ts.map +1 -0
- package/dist/zitadel/zitadelTokenExchange.js +92 -0
- package/dist/zitadel/zitadelTokenExchange.js.map +1 -0
- package/package.json +137 -0
|
@@ -0,0 +1,1251 @@
|
|
|
1
|
+
import { join, relative, resolve } from "node:path";
|
|
2
|
+
import { createResult, createResultError } from "#result";
|
|
3
|
+
import { projectAccessCreate } from "../access/projectAccessCreate.js";
|
|
4
|
+
import { projectAccessLogSourceFileCreate } from "../access-log/projectAccessLogSourceFileCreate.js";
|
|
5
|
+
import { projectRegistryApiHandlerCreate } from "../api/projectRegistryApiHandlerCreate.js";
|
|
6
|
+
import { sessionActorResolve } from "../session/sessionActorResolve.js";
|
|
7
|
+
import { sessionRequestResolve } from "../session/sessionRequestResolve.js";
|
|
8
|
+
import { projectRegistryDaemonConfigValidate } from "./projectRegistryDaemonConfigValidate.js";
|
|
9
|
+
import { projectRegistryDaemonFilesystemDefault } from "./projectRegistryDaemonFilesystemDefault.js";
|
|
10
|
+
import { projectRegistryDaemonPosixDefault } from "./projectRegistryDaemonPosixDefault.js";
|
|
11
|
+
import { projectRegistryDaemonServerDefault } from "./projectRegistryDaemonServerDefault.js";
|
|
12
|
+
import { projectRegistryDaemonSignalsDefault } from "./projectRegistryDaemonSignalsDefault.js";
|
|
13
|
+
const socketMode = 0o600;
|
|
14
|
+
const directoryMode = 0o755;
|
|
15
|
+
const maximumPosixId = 0xffffffff;
|
|
16
|
+
const maximumUsernameLength = 255;
|
|
17
|
+
function errorMessage(error) {
|
|
18
|
+
return error instanceof Error ? error.message : String(error);
|
|
19
|
+
}
|
|
20
|
+
function usernameIsSafe(username) {
|
|
21
|
+
return username.length <= maximumUsernameLength && /^[A-Za-z_][A-Za-z0-9_.-]*\$?$/.test(username);
|
|
22
|
+
}
|
|
23
|
+
function mappedUserIsValid(user) {
|
|
24
|
+
try {
|
|
25
|
+
if (typeof user !== "object" || user === null || Array.isArray(user))
|
|
26
|
+
return false;
|
|
27
|
+
const value = user;
|
|
28
|
+
return (typeof value.username === "string" &&
|
|
29
|
+
usernameIsSafe(value.username) &&
|
|
30
|
+
Number.isSafeInteger(value.uid) &&
|
|
31
|
+
value.uid >= 0 &&
|
|
32
|
+
value.uid <= maximumPosixId &&
|
|
33
|
+
Number.isSafeInteger(value.gid) &&
|
|
34
|
+
value.gid >= 0 &&
|
|
35
|
+
value.gid <= maximumPosixId);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function mappedUserValidate(value, op) {
|
|
42
|
+
try {
|
|
43
|
+
if (!mappedUserIsValid(value))
|
|
44
|
+
return createResultError(op, "mapped user data is invalid");
|
|
45
|
+
const user = value;
|
|
46
|
+
return createResult({ username: user.username, uid: user.uid, gid: user.gid });
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return createResultError(op, "mapped user data is invalid");
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function mappedUsersValidate(value, op) {
|
|
53
|
+
try {
|
|
54
|
+
if (!Array.isArray(value))
|
|
55
|
+
return createResultError(op, "mapped user resolver returned invalid user data");
|
|
56
|
+
const users = [];
|
|
57
|
+
const usernames = new Set();
|
|
58
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
59
|
+
const userR = mappedUserValidate(value[index], op);
|
|
60
|
+
if (!userR.success)
|
|
61
|
+
return userR;
|
|
62
|
+
if (usernames.has(userR.data.username)) {
|
|
63
|
+
return createResultError(op, `mapped user ${userR.data.username} is duplicated`);
|
|
64
|
+
}
|
|
65
|
+
usernames.add(userR.data.username);
|
|
66
|
+
users.push(userR.data);
|
|
67
|
+
}
|
|
68
|
+
return createResult(users);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return createResultError(op, "mapped user resolver returned invalid user data");
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function resultErrorMessage(value) {
|
|
75
|
+
try {
|
|
76
|
+
if (typeof value !== "object" || value === null)
|
|
77
|
+
return undefined;
|
|
78
|
+
const result = value;
|
|
79
|
+
if (result.success !== false || typeof result.op !== "string" || typeof result.errorMessage !== "string") {
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
return result.errorMessage;
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
function mappedUserResultValidate(value) {
|
|
89
|
+
const op = "projectRegistryDaemonUserResolve";
|
|
90
|
+
try {
|
|
91
|
+
if (typeof value !== "object" || value === null)
|
|
92
|
+
return createResultError(op, "user resolver returned an invalid result");
|
|
93
|
+
const result = value;
|
|
94
|
+
if (result.success === false) {
|
|
95
|
+
const message = resultErrorMessage(value);
|
|
96
|
+
return message === undefined
|
|
97
|
+
? createResultError(op, "user resolver returned an invalid result")
|
|
98
|
+
: createResultError(op, message);
|
|
99
|
+
}
|
|
100
|
+
if (result.success !== true || !("data" in result)) {
|
|
101
|
+
return createResultError(op, "user resolver returned an invalid result");
|
|
102
|
+
}
|
|
103
|
+
return mappedUserValidate(result.data, op);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return createResultError(op, "user resolver returned an invalid result");
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
function mappedUsersResultValidate(value) {
|
|
110
|
+
const op = "projectRegistryDaemonMappedUsers";
|
|
111
|
+
try {
|
|
112
|
+
if (typeof value !== "object" || value === null)
|
|
113
|
+
return createResultError(op, "mapped user resolver returned an invalid result");
|
|
114
|
+
const result = value;
|
|
115
|
+
if (result.success === false) {
|
|
116
|
+
const message = resultErrorMessage(value);
|
|
117
|
+
return message === undefined
|
|
118
|
+
? createResultError(op, "mapped user resolver returned an invalid result")
|
|
119
|
+
: createResultError(op, message);
|
|
120
|
+
}
|
|
121
|
+
if (result.success !== true || !("data" in result)) {
|
|
122
|
+
return createResultError(op, "mapped user resolver returned an invalid result");
|
|
123
|
+
}
|
|
124
|
+
return mappedUsersValidate(result.data, op);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
return createResultError(op, "mapped user resolver returned an invalid result");
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
function socketPath(directory, username) {
|
|
131
|
+
const op = "projectRegistryDaemonSocketPath";
|
|
132
|
+
if (!usernameIsSafe(username))
|
|
133
|
+
return createResultError(op, "mapped user name is not safe", username);
|
|
134
|
+
const path = join(directory, `${username}.sock`);
|
|
135
|
+
if (resolve(path) !== path || relative(directory, path).startsWith("..")) {
|
|
136
|
+
return createResultError(op, "socket path escapes its directory", path);
|
|
137
|
+
}
|
|
138
|
+
return createResult(path);
|
|
139
|
+
}
|
|
140
|
+
function statIsSocketOwned(stat, mapping) {
|
|
141
|
+
return stat.type === "socket" && stat.uid === mapping.uid && stat.gid === mapping.gid;
|
|
142
|
+
}
|
|
143
|
+
function statModeIsPrivate(stat) {
|
|
144
|
+
return (stat.mode & 0o7777) === socketMode;
|
|
145
|
+
}
|
|
146
|
+
function defaultTimer() {
|
|
147
|
+
return {
|
|
148
|
+
setInterval: (callback, delayMs) => globalThis.setInterval(callback, delayMs),
|
|
149
|
+
clearInterval: (handle) => globalThis.clearInterval(handle),
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
function serverStop(server) {
|
|
153
|
+
return Promise.resolve().then(() => server.stop({ closeActiveConnections: true }));
|
|
154
|
+
}
|
|
155
|
+
export function projectRegistryDaemonCreate(options) {
|
|
156
|
+
const op = "projectRegistryDaemonCreate";
|
|
157
|
+
if (typeof options !== "object" || options === null)
|
|
158
|
+
return createResultError(op, "daemon options are required");
|
|
159
|
+
let configInput;
|
|
160
|
+
let repositoryOption;
|
|
161
|
+
let caddyApplicationOption;
|
|
162
|
+
let accessLogSourceOption;
|
|
163
|
+
let browserAuthOption;
|
|
164
|
+
let socketAccessResolveOption;
|
|
165
|
+
let mappedUsersResolveOption;
|
|
166
|
+
let requestHandlerOption;
|
|
167
|
+
let filesystemOption;
|
|
168
|
+
let posixOption;
|
|
169
|
+
let serverFactoryOption;
|
|
170
|
+
let signalsOption;
|
|
171
|
+
let timerOption;
|
|
172
|
+
let requireRootOption;
|
|
173
|
+
try {
|
|
174
|
+
configInput = options.config;
|
|
175
|
+
repositoryOption = options.repository;
|
|
176
|
+
caddyApplicationOption = options.caddyApplication;
|
|
177
|
+
accessLogSourceOption = options.projectAccessLogSource;
|
|
178
|
+
browserAuthOption = options.browserAuth;
|
|
179
|
+
socketAccessResolveOption = options.socketAccessResolve;
|
|
180
|
+
mappedUsersResolveOption = options.mappedUsersResolve;
|
|
181
|
+
requestHandlerOption = options.requestHandler;
|
|
182
|
+
filesystemOption = options.filesystem;
|
|
183
|
+
posixOption = options.posix;
|
|
184
|
+
serverFactoryOption = options.serverFactory;
|
|
185
|
+
signalsOption = options.signals;
|
|
186
|
+
timerOption = options.timer;
|
|
187
|
+
requireRootOption = options.requireRoot;
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
return createResultError(op, error instanceof Error ? error.message : "invalid daemon options");
|
|
191
|
+
}
|
|
192
|
+
if (requireRootOption !== undefined && typeof requireRootOption !== "boolean") {
|
|
193
|
+
return createResultError(op, "requireRoot must be a boolean");
|
|
194
|
+
}
|
|
195
|
+
const configR = projectRegistryDaemonConfigValidate(configInput);
|
|
196
|
+
if (!configR.success)
|
|
197
|
+
return configR;
|
|
198
|
+
if (repositoryOption === undefined)
|
|
199
|
+
return createResultError(op, "project repository is required");
|
|
200
|
+
if (caddyApplicationOption === undefined)
|
|
201
|
+
return createResultError(op, "Caddy application is required");
|
|
202
|
+
const config = configR.data;
|
|
203
|
+
const repository = repositoryOption;
|
|
204
|
+
const caddyApplication = caddyApplicationOption;
|
|
205
|
+
const filesystem = filesystemOption ?? projectRegistryDaemonFilesystemDefault();
|
|
206
|
+
const posix = posixOption ?? projectRegistryDaemonPosixDefault();
|
|
207
|
+
const serverFactory = serverFactoryOption ?? projectRegistryDaemonServerDefault();
|
|
208
|
+
const signals = signalsOption ?? projectRegistryDaemonSignalsDefault();
|
|
209
|
+
const timer = timerOption ?? defaultTimer();
|
|
210
|
+
const mappedUsersResolve = mappedUsersResolveOption;
|
|
211
|
+
const socketRecords = new Map();
|
|
212
|
+
const cleanupRecords = new Map();
|
|
213
|
+
const signalCleanups = [];
|
|
214
|
+
let webServer;
|
|
215
|
+
let userRefreshHandle;
|
|
216
|
+
let socketRefreshPromise;
|
|
217
|
+
let startPromise;
|
|
218
|
+
let shutdownPromise;
|
|
219
|
+
let resourceCleanupPromise;
|
|
220
|
+
let caddyStopPromise;
|
|
221
|
+
let gitTail = Promise.resolve();
|
|
222
|
+
let state = "created";
|
|
223
|
+
let socketStateReady = false;
|
|
224
|
+
let caddyStarted = false;
|
|
225
|
+
let caddyStartAttempted = false;
|
|
226
|
+
let signalsInstalled = false;
|
|
227
|
+
let terminationSettled = false;
|
|
228
|
+
let shutdownSettled = false;
|
|
229
|
+
let resolveTermination;
|
|
230
|
+
const terminationPromise = new Promise((resolve) => {
|
|
231
|
+
resolveTermination = resolve;
|
|
232
|
+
});
|
|
233
|
+
const stoppedServers = new WeakSet();
|
|
234
|
+
const lateServerHandles = new Set();
|
|
235
|
+
function shutdownRetryRequired() {
|
|
236
|
+
if (state !== "stopped" || !shutdownSettled)
|
|
237
|
+
return;
|
|
238
|
+
shutdownPromise = undefined;
|
|
239
|
+
resourceCleanupPromise = undefined;
|
|
240
|
+
shutdownSettled = false;
|
|
241
|
+
}
|
|
242
|
+
function healthLive() {
|
|
243
|
+
return { live: state !== "failed" && state !== "stopping" && state !== "stopped", state };
|
|
244
|
+
}
|
|
245
|
+
function daemonStopping() {
|
|
246
|
+
return state === "stopping" || state === "stopped";
|
|
247
|
+
}
|
|
248
|
+
function terminationSettle(result) {
|
|
249
|
+
if (terminationSettled)
|
|
250
|
+
return;
|
|
251
|
+
terminationSettled = true;
|
|
252
|
+
resolveTermination(result);
|
|
253
|
+
}
|
|
254
|
+
function serverStopOnce(server) {
|
|
255
|
+
if (stoppedServers.has(server))
|
|
256
|
+
return Promise.resolve();
|
|
257
|
+
return serverStop(server).then(() => {
|
|
258
|
+
stoppedServers.add(server);
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
async function serverCreate(serverOptions, lateCleanup) {
|
|
262
|
+
let server;
|
|
263
|
+
try {
|
|
264
|
+
server = await serverFactory(serverOptions);
|
|
265
|
+
}
|
|
266
|
+
catch (error) {
|
|
267
|
+
try {
|
|
268
|
+
await lateCleanup?.();
|
|
269
|
+
}
|
|
270
|
+
catch {
|
|
271
|
+
// Preserve the server factory failure.
|
|
272
|
+
}
|
|
273
|
+
return createResultError("projectRegistryDaemonServerCreate", errorMessage(error));
|
|
274
|
+
}
|
|
275
|
+
if (!daemonStopping())
|
|
276
|
+
return createResult(server);
|
|
277
|
+
lateServerHandles.add(server);
|
|
278
|
+
shutdownRetryRequired();
|
|
279
|
+
try {
|
|
280
|
+
await serverStopOnce(server);
|
|
281
|
+
lateServerHandles.delete(server);
|
|
282
|
+
}
|
|
283
|
+
catch {
|
|
284
|
+
// Cleanup continues even when a late server refuses to stop.
|
|
285
|
+
}
|
|
286
|
+
try {
|
|
287
|
+
await lateCleanup?.();
|
|
288
|
+
}
|
|
289
|
+
catch {
|
|
290
|
+
// The late server is no longer reachable by the daemon.
|
|
291
|
+
}
|
|
292
|
+
return createResultError("projectRegistryDaemonServerCreate", "daemon shutdown started");
|
|
293
|
+
}
|
|
294
|
+
async function rootCheck() {
|
|
295
|
+
if (requireRootOption === false)
|
|
296
|
+
return createResult(true);
|
|
297
|
+
try {
|
|
298
|
+
const result = await posix.isRoot();
|
|
299
|
+
return result === true ? createResult(true) : createResultError(op, "project-registryd must run as root");
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
return createResultError(op, "root privilege check failed");
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
async function safeLstat(path) {
|
|
306
|
+
try {
|
|
307
|
+
return await filesystem.lstat(path);
|
|
308
|
+
}
|
|
309
|
+
catch (error) {
|
|
310
|
+
if (typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT")
|
|
311
|
+
return undefined;
|
|
312
|
+
throw error;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
async function filesystemChmodNoFollow(path, mode) {
|
|
316
|
+
if (filesystem.chmodNoFollow !== undefined) {
|
|
317
|
+
await filesystem.chmodNoFollow(path, mode);
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
await filesystem.chmod(path, mode);
|
|
321
|
+
}
|
|
322
|
+
async function filesystemChownNoFollow(path, uid, gid) {
|
|
323
|
+
if (filesystem.chownNoFollow !== undefined) {
|
|
324
|
+
await filesystem.chownNoFollow(path, uid, gid);
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
await filesystem.chown(path, uid, gid);
|
|
328
|
+
}
|
|
329
|
+
async function ensureSocketDirectory() {
|
|
330
|
+
const directory = resolve(config.socketDirectory);
|
|
331
|
+
const segments = directory.split("/").filter((segment) => segment !== "");
|
|
332
|
+
let current = "/";
|
|
333
|
+
try {
|
|
334
|
+
for (const segment of segments) {
|
|
335
|
+
current = join(current, segment);
|
|
336
|
+
let stat = await safeLstat(current);
|
|
337
|
+
if (stat === undefined) {
|
|
338
|
+
await filesystem.mkdir(current, directoryMode);
|
|
339
|
+
stat = await safeLstat(current);
|
|
340
|
+
}
|
|
341
|
+
if (stat === undefined || stat.type === "symlink" || stat.type !== "directory") {
|
|
342
|
+
return createResultError("projectRegistryDaemonSocketDirectory", "socket directory contains an unsafe component", current);
|
|
343
|
+
}
|
|
344
|
+
if (current !== directory && (stat.uid !== 0 || (stat.mode & 0o022) !== 0)) {
|
|
345
|
+
return createResultError("projectRegistryDaemonSocketDirectory", "socket directory ancestor must be root-owned and not group/world writable", current);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
const canonical = await filesystem.realpath(directory);
|
|
349
|
+
if (canonical !== directory) {
|
|
350
|
+
return createResultError("projectRegistryDaemonSocketDirectory", "socket directory must not contain symlinks", directory);
|
|
351
|
+
}
|
|
352
|
+
const directoryStat = await safeLstat(directory);
|
|
353
|
+
if (directoryStat === undefined || directoryStat.type !== "directory" || directoryStat.uid !== 0) {
|
|
354
|
+
return createResultError("projectRegistryDaemonSocketDirectory", "socket directory must be a root-owned directory", directory);
|
|
355
|
+
}
|
|
356
|
+
if ((directoryStat.mode & 0o7777) !== directoryMode) {
|
|
357
|
+
await filesystemChmodNoFollow(directory, directoryMode);
|
|
358
|
+
const corrected = await safeLstat(directory);
|
|
359
|
+
if (corrected === undefined ||
|
|
360
|
+
corrected.type !== "directory" ||
|
|
361
|
+
corrected.uid !== 0 ||
|
|
362
|
+
(corrected.mode & 0o7777) !== directoryMode) {
|
|
363
|
+
return createResultError("projectRegistryDaemonSocketDirectory", "socket directory mode could not be verified", directory);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
return createResult(directory);
|
|
367
|
+
}
|
|
368
|
+
catch (error) {
|
|
369
|
+
return createResultError("projectRegistryDaemonSocketDirectory", errorMessage(error), directory);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
async function removeOwnedSocket(record, force = false) {
|
|
373
|
+
const op = "projectRegistryDaemonSocketRemove";
|
|
374
|
+
try {
|
|
375
|
+
const stat = await safeLstat(record.path);
|
|
376
|
+
if (stat === undefined)
|
|
377
|
+
return createResult(undefined);
|
|
378
|
+
if (stat.type === "symlink")
|
|
379
|
+
return createResultError(op, "refusing to remove a symbolic link", record.path);
|
|
380
|
+
if (!force && !statIsSocketOwned(stat, record.mapping)) {
|
|
381
|
+
return createResultError(op, "refusing to remove a socket with unexpected ownership", record.path);
|
|
382
|
+
}
|
|
383
|
+
if (stat.type !== "socket")
|
|
384
|
+
return createResultError(op, "refusing to remove a non-socket path", record.path);
|
|
385
|
+
await filesystem.unlink(record.path);
|
|
386
|
+
const after = await safeLstat(record.path);
|
|
387
|
+
if (after !== undefined)
|
|
388
|
+
return createResultError(op, "socket was not removed", record.path);
|
|
389
|
+
return createResult(undefined);
|
|
390
|
+
}
|
|
391
|
+
catch (error) {
|
|
392
|
+
return createResultError(op, errorMessage(error), record.path);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
function cleanupRecordTrack(record) {
|
|
396
|
+
cleanupRecords.set(record.path, record);
|
|
397
|
+
shutdownRetryRequired();
|
|
398
|
+
}
|
|
399
|
+
function cleanupRecordPending(path) {
|
|
400
|
+
return cleanupRecords.has(path);
|
|
401
|
+
}
|
|
402
|
+
async function stopAndRemove(record, force = record.forceCleanup === true) {
|
|
403
|
+
let message;
|
|
404
|
+
try {
|
|
405
|
+
await serverStopOnce(record.server);
|
|
406
|
+
}
|
|
407
|
+
catch (error) {
|
|
408
|
+
message = errorMessage(error);
|
|
409
|
+
}
|
|
410
|
+
const removeR = await removeOwnedSocket(record, force);
|
|
411
|
+
if (!removeR.success) {
|
|
412
|
+
cleanupRecordTrack(record);
|
|
413
|
+
return removeR;
|
|
414
|
+
}
|
|
415
|
+
if (message !== undefined) {
|
|
416
|
+
cleanupRecordTrack(record);
|
|
417
|
+
return createResultError("projectRegistryDaemonSocketStop", message, record.path);
|
|
418
|
+
}
|
|
419
|
+
cleanupRecords.delete(record.path);
|
|
420
|
+
return createResult(undefined);
|
|
421
|
+
}
|
|
422
|
+
async function socketCreate(directory, mapping) {
|
|
423
|
+
const pathR = socketPath(directory, mapping.username);
|
|
424
|
+
if (!pathR.success)
|
|
425
|
+
return pathR;
|
|
426
|
+
const path = pathR.data;
|
|
427
|
+
const pendingRecord = { path, mapping, server: { stop: () => undefined }, forceCleanup: true };
|
|
428
|
+
try {
|
|
429
|
+
const existing = await safeLstat(path);
|
|
430
|
+
if (existing !== undefined) {
|
|
431
|
+
if (existing.type === "symlink")
|
|
432
|
+
return createResultError(op, "refusing a symbolic-link socket path", path);
|
|
433
|
+
if (existing.type !== "socket")
|
|
434
|
+
return createResultError(op, "refusing a non-socket socket path", path);
|
|
435
|
+
if (!statIsSocketOwned(existing, mapping)) {
|
|
436
|
+
return createResultError(op, "refusing a socket with unexpected ownership", path);
|
|
437
|
+
}
|
|
438
|
+
const staleRecord = { path, mapping, server: { stop: () => undefined } };
|
|
439
|
+
const removeR = await removeOwnedSocket(staleRecord);
|
|
440
|
+
if (!removeR.success) {
|
|
441
|
+
cleanupRecordTrack(staleRecord);
|
|
442
|
+
return removeR;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
const serverR = await serverCreate({
|
|
446
|
+
unix: path,
|
|
447
|
+
fetch: (request) => handleRequest(request, { transport: "unix", username: mapping.username }),
|
|
448
|
+
}, async () => {
|
|
449
|
+
try {
|
|
450
|
+
const stat = await safeLstat(path);
|
|
451
|
+
if (stat === undefined)
|
|
452
|
+
return;
|
|
453
|
+
if (stat.type !== "socket")
|
|
454
|
+
throw new Error(`socket cleanup found an unexpected ${stat.type} path`);
|
|
455
|
+
await filesystem.unlink(path);
|
|
456
|
+
const after = await safeLstat(path);
|
|
457
|
+
if (after !== undefined)
|
|
458
|
+
throw new Error("socket entry was not removed");
|
|
459
|
+
}
|
|
460
|
+
catch (error) {
|
|
461
|
+
cleanupRecordTrack(pendingRecord);
|
|
462
|
+
throw error;
|
|
463
|
+
}
|
|
464
|
+
});
|
|
465
|
+
if (!serverR.success)
|
|
466
|
+
return serverR;
|
|
467
|
+
const server = serverR.data;
|
|
468
|
+
const record = { path, mapping, server };
|
|
469
|
+
try {
|
|
470
|
+
await filesystemChownNoFollow(path, mapping.uid, mapping.gid);
|
|
471
|
+
await filesystemChmodNoFollow(path, socketMode);
|
|
472
|
+
const stat = await safeLstat(path);
|
|
473
|
+
if (stat === undefined ||
|
|
474
|
+
stat.type !== "socket" ||
|
|
475
|
+
stat.uid !== mapping.uid ||
|
|
476
|
+
stat.gid !== mapping.gid ||
|
|
477
|
+
!statModeIsPrivate(stat)) {
|
|
478
|
+
throw new Error("socket ownership or mode could not be verified");
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
catch (error) {
|
|
482
|
+
cleanupRecordTrack(record);
|
|
483
|
+
const cleanupFailures = [];
|
|
484
|
+
try {
|
|
485
|
+
await serverStopOnce(server);
|
|
486
|
+
}
|
|
487
|
+
catch (stopError) {
|
|
488
|
+
cleanupFailures.push(`socket stop: ${errorMessage(stopError)}`);
|
|
489
|
+
}
|
|
490
|
+
try {
|
|
491
|
+
const stat = await safeLstat(path);
|
|
492
|
+
if (stat?.type === "socket") {
|
|
493
|
+
try {
|
|
494
|
+
await filesystem.unlink(path);
|
|
495
|
+
}
|
|
496
|
+
catch (unlinkError) {
|
|
497
|
+
cleanupFailures.push(`socket unlink: ${errorMessage(unlinkError)}`);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
else if (stat !== undefined) {
|
|
501
|
+
cleanupFailures.push(`socket cleanup found an unexpected ${stat.type} path`);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
catch (statError) {
|
|
505
|
+
cleanupFailures.push(`socket cleanup stat: ${errorMessage(statError)}`);
|
|
506
|
+
}
|
|
507
|
+
return createResultError(op, [errorMessage(error), ...cleanupFailures].join("; "), path);
|
|
508
|
+
}
|
|
509
|
+
if (daemonStopping()) {
|
|
510
|
+
const stopR = await stopAndRemove(record, true);
|
|
511
|
+
if (!stopR.success)
|
|
512
|
+
cleanupRecordTrack(record);
|
|
513
|
+
return createResultError(op, "daemon shutdown started", path);
|
|
514
|
+
}
|
|
515
|
+
return createResult({ path, mapping, server });
|
|
516
|
+
}
|
|
517
|
+
catch (error) {
|
|
518
|
+
return createResultError(op, errorMessage(error), path);
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
async function posixUserResolve(username) {
|
|
522
|
+
try {
|
|
523
|
+
const userR = mappedUserResultValidate(await posix.userResolve(username));
|
|
524
|
+
if (!userR.success)
|
|
525
|
+
return userR;
|
|
526
|
+
if (userR.data.username !== username) {
|
|
527
|
+
return createResultError("projectRegistryDaemonUserResolve", "user resolver returned a mismatched user", username);
|
|
528
|
+
}
|
|
529
|
+
return userR;
|
|
530
|
+
}
|
|
531
|
+
catch (error) {
|
|
532
|
+
return createResultError("projectRegistryDaemonUserResolve", errorMessage(error), username);
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
async function mappedUsersResolveDefault() {
|
|
536
|
+
const users = [];
|
|
537
|
+
const missingUsers = [];
|
|
538
|
+
for (const username of config.mappedUsers) {
|
|
539
|
+
const userR = await posixUserResolve(username);
|
|
540
|
+
if (!userR.success) {
|
|
541
|
+
if (/does not exist|not found|enoent|missing/i.test(userR.errorMessage)) {
|
|
542
|
+
missingUsers.push(username);
|
|
543
|
+
continue;
|
|
544
|
+
}
|
|
545
|
+
return createResultError("projectRegistryDaemonMappedUsers", userR.errorMessage, username);
|
|
546
|
+
}
|
|
547
|
+
users.push(userR.data);
|
|
548
|
+
}
|
|
549
|
+
return createResult({ users, missingUsers });
|
|
550
|
+
}
|
|
551
|
+
async function mappedUsersResolveCurrent() {
|
|
552
|
+
if (mappedUsersResolve === undefined) {
|
|
553
|
+
const resolved = await mappedUsersResolveDefault();
|
|
554
|
+
if (!resolved.success)
|
|
555
|
+
return resolved;
|
|
556
|
+
return createResult(resolved.data);
|
|
557
|
+
}
|
|
558
|
+
try {
|
|
559
|
+
const resolvedValue = await mappedUsersResolve();
|
|
560
|
+
const resolvedR = mappedUsersResultValidate(resolvedValue);
|
|
561
|
+
if (!resolvedR.success)
|
|
562
|
+
return resolvedR;
|
|
563
|
+
const configuredUsers = new Set(config.mappedUsers);
|
|
564
|
+
const resolvedUsers = new Set(resolvedR.data.map((user) => user.username));
|
|
565
|
+
if (configuredUsers.size !== resolvedUsers.size ||
|
|
566
|
+
[...configuredUsers].some((username) => !resolvedUsers.has(username))) {
|
|
567
|
+
return createResultError("projectRegistryDaemonMappedUsers", "mapped user resolver did not return the configured users exactly");
|
|
568
|
+
}
|
|
569
|
+
return createResult({ users: resolvedR.data, missingUsers: [] });
|
|
570
|
+
}
|
|
571
|
+
catch (error) {
|
|
572
|
+
return createResultError("projectRegistryDaemonMappedUsers", errorMessage(error));
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
async function refreshSocketsInternal() {
|
|
576
|
+
const usersR = await mappedUsersResolveCurrent();
|
|
577
|
+
if (!usersR.success) {
|
|
578
|
+
socketStateReady = false;
|
|
579
|
+
return usersR;
|
|
580
|
+
}
|
|
581
|
+
const directoryR = await ensureSocketDirectory();
|
|
582
|
+
if (!directoryR.success) {
|
|
583
|
+
socketStateReady = false;
|
|
584
|
+
return directoryR;
|
|
585
|
+
}
|
|
586
|
+
const users = usersR.data.users;
|
|
587
|
+
const missingUsers = [...usersR.data.missingUsers];
|
|
588
|
+
const current = new Map();
|
|
589
|
+
const failures = [];
|
|
590
|
+
for (const user of users) {
|
|
591
|
+
const userR = mappedUserValidate(user, "projectRegistryDaemonMappedUsers");
|
|
592
|
+
if (!userR.success) {
|
|
593
|
+
failures.push(`${user.username}: mapped user data is invalid`);
|
|
594
|
+
continue;
|
|
595
|
+
}
|
|
596
|
+
if (current.has(userR.data.username)) {
|
|
597
|
+
failures.push(`${userR.data.username}: mapped user is duplicated`);
|
|
598
|
+
continue;
|
|
599
|
+
}
|
|
600
|
+
current.set(userR.data.username, userR.data);
|
|
601
|
+
}
|
|
602
|
+
for (const [path, record] of [...cleanupRecords.entries()]) {
|
|
603
|
+
const cleanupR = await stopAndRemove(record);
|
|
604
|
+
if (!cleanupR.success)
|
|
605
|
+
failures.push(`${record.mapping.username}: ${cleanupR.errorMessage}`);
|
|
606
|
+
else if (cleanupRecords.has(path))
|
|
607
|
+
failures.push(`${record.mapping.username}: socket cleanup remains pending`);
|
|
608
|
+
}
|
|
609
|
+
const created = [];
|
|
610
|
+
const removed = [];
|
|
611
|
+
for (const [username, record] of [...socketRecords.entries()]) {
|
|
612
|
+
const mapping = current.get(username);
|
|
613
|
+
if (mapping === undefined || mapping.uid !== record.mapping.uid || mapping.gid !== record.mapping.gid) {
|
|
614
|
+
const stopR = await stopAndRemove(record);
|
|
615
|
+
socketRecords.delete(username);
|
|
616
|
+
if (!stopR.success)
|
|
617
|
+
failures.push(`${username}: ${stopR.errorMessage}`);
|
|
618
|
+
else
|
|
619
|
+
removed.push(username);
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
for (const mapping of current.values()) {
|
|
623
|
+
const existing = socketRecords.get(mapping.username);
|
|
624
|
+
if (existing !== undefined) {
|
|
625
|
+
if (cleanupRecordPending(existing.path)) {
|
|
626
|
+
failures.push(`${mapping.username}: socket cleanup remains pending`);
|
|
627
|
+
continue;
|
|
628
|
+
}
|
|
629
|
+
try {
|
|
630
|
+
const stat = await safeLstat(existing.path);
|
|
631
|
+
if (stat === undefined || stat.type !== "socket" || !statIsSocketOwned(stat, mapping)) {
|
|
632
|
+
const stopR = await stopAndRemove(existing);
|
|
633
|
+
socketRecords.delete(mapping.username);
|
|
634
|
+
if (!stopR.success) {
|
|
635
|
+
failures.push(`${mapping.username}: ${stopR.errorMessage}`);
|
|
636
|
+
continue;
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
else {
|
|
640
|
+
if (!statModeIsPrivate(stat))
|
|
641
|
+
await filesystemChmodNoFollow(existing.path, socketMode);
|
|
642
|
+
const verified = await safeLstat(existing.path);
|
|
643
|
+
if (verified === undefined ||
|
|
644
|
+
verified.type !== "socket" ||
|
|
645
|
+
!statIsSocketOwned(verified, mapping) ||
|
|
646
|
+
!statModeIsPrivate(verified)) {
|
|
647
|
+
cleanupRecordTrack(existing);
|
|
648
|
+
failures.push(`${mapping.username}: socket permissions could not be verified`);
|
|
649
|
+
}
|
|
650
|
+
continue;
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
catch (error) {
|
|
654
|
+
cleanupRecordTrack(existing);
|
|
655
|
+
failures.push(`${mapping.username}: ${errorMessage(error)}`);
|
|
656
|
+
continue;
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
const pathR = socketPath(directoryR.data, mapping.username);
|
|
660
|
+
if (!pathR.success) {
|
|
661
|
+
failures.push(`${mapping.username}: ${pathR.errorMessage}`);
|
|
662
|
+
continue;
|
|
663
|
+
}
|
|
664
|
+
if (cleanupRecordPending(pathR.data)) {
|
|
665
|
+
failures.push(`${mapping.username}: socket cleanup remains pending`);
|
|
666
|
+
continue;
|
|
667
|
+
}
|
|
668
|
+
const createdR = await socketCreate(directoryR.data, mapping);
|
|
669
|
+
if (!createdR.success) {
|
|
670
|
+
failures.push(`${mapping.username}: ${createdR.errorMessage}`);
|
|
671
|
+
continue;
|
|
672
|
+
}
|
|
673
|
+
socketRecords.set(mapping.username, createdR.data);
|
|
674
|
+
created.push(mapping.username);
|
|
675
|
+
}
|
|
676
|
+
try {
|
|
677
|
+
const entries = await filesystem.readdir(directoryR.data);
|
|
678
|
+
for (const entry of entries) {
|
|
679
|
+
if (!entry.endsWith(".sock"))
|
|
680
|
+
continue;
|
|
681
|
+
const username = entry.slice(0, -5);
|
|
682
|
+
if (!usernameIsSafe(username)) {
|
|
683
|
+
failures.push(`${entry}: refusing an unsafe socket name`);
|
|
684
|
+
continue;
|
|
685
|
+
}
|
|
686
|
+
if (current.has(username) || socketRecords.has(username))
|
|
687
|
+
continue;
|
|
688
|
+
const pathR = socketPath(directoryR.data, username);
|
|
689
|
+
if (!pathR.success) {
|
|
690
|
+
failures.push(`${entry}: ${pathR.errorMessage}`);
|
|
691
|
+
continue;
|
|
692
|
+
}
|
|
693
|
+
const stat = await safeLstat(pathR.data);
|
|
694
|
+
if (stat?.type === "symlink")
|
|
695
|
+
failures.push(`${entry}: refusing a symbolic link`);
|
|
696
|
+
else if (stat !== undefined && stat.type !== "socket")
|
|
697
|
+
failures.push(`${entry}: refusing a non-socket stale path`);
|
|
698
|
+
else if (stat?.type === "socket") {
|
|
699
|
+
const ownerR = await posixUserResolve(username);
|
|
700
|
+
if (ownerR.success && statIsSocketOwned(stat, ownerR.data)) {
|
|
701
|
+
const staleRecord = {
|
|
702
|
+
path: pathR.data,
|
|
703
|
+
mapping: ownerR.data,
|
|
704
|
+
server: { stop: () => undefined },
|
|
705
|
+
};
|
|
706
|
+
const removeR = await removeOwnedSocket(staleRecord);
|
|
707
|
+
if (!removeR.success) {
|
|
708
|
+
cleanupRecordTrack(staleRecord);
|
|
709
|
+
failures.push(`${entry}: ${removeR.errorMessage}`);
|
|
710
|
+
}
|
|
711
|
+
else
|
|
712
|
+
removed.push(username);
|
|
713
|
+
}
|
|
714
|
+
else if (!ownerR.success) {
|
|
715
|
+
// A missing user does not prove who owned a stale socket. Leave it alone.
|
|
716
|
+
}
|
|
717
|
+
else {
|
|
718
|
+
failures.push(`${entry}: refusing an unowned stale socket`);
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
catch (error) {
|
|
724
|
+
failures.push(`socket directory scan failed: ${errorMessage(error)}`);
|
|
725
|
+
}
|
|
726
|
+
socketStateReady = failures.length === 0 && missingUsers.length === 0;
|
|
727
|
+
const refresh = {
|
|
728
|
+
created,
|
|
729
|
+
removed,
|
|
730
|
+
current: [...socketRecords.keys()],
|
|
731
|
+
missingUsers,
|
|
732
|
+
};
|
|
733
|
+
if (failures.length > 0)
|
|
734
|
+
return createResultError("projectRegistryDaemonSocketsRefresh", failures.join("; "));
|
|
735
|
+
return createResult(refresh);
|
|
736
|
+
}
|
|
737
|
+
function refreshSockets() {
|
|
738
|
+
if (state === "stopping" || state === "stopped" || state === "failed") {
|
|
739
|
+
return Promise.resolve(createResultError("projectRegistryDaemonSocketsRefresh", "daemon is not accepting work"));
|
|
740
|
+
}
|
|
741
|
+
if (socketRefreshPromise !== undefined)
|
|
742
|
+
return socketRefreshPromise;
|
|
743
|
+
const current = Promise.resolve().then(refreshSocketsInternal);
|
|
744
|
+
socketRefreshPromise = current;
|
|
745
|
+
void current.then(() => {
|
|
746
|
+
if (socketRefreshPromise === current)
|
|
747
|
+
socketRefreshPromise = undefined;
|
|
748
|
+
}, () => {
|
|
749
|
+
if (socketRefreshPromise === current)
|
|
750
|
+
socketRefreshPromise = undefined;
|
|
751
|
+
});
|
|
752
|
+
return current;
|
|
753
|
+
}
|
|
754
|
+
function browserProjectAccessCreate(actor, sessionId, request, browserAuth) {
|
|
755
|
+
const sharedAccess = projectAccessCreate({
|
|
756
|
+
identityDirectory: browserAuth.identityDirectory,
|
|
757
|
+
posixUsers: browserAuth.posixUsers,
|
|
758
|
+
transport: {
|
|
759
|
+
transport: "browser",
|
|
760
|
+
sessionId,
|
|
761
|
+
sessions: browserAuth.sessions,
|
|
762
|
+
tokenReferences: browserAuth.tokenReferences,
|
|
763
|
+
signal: request.signal,
|
|
764
|
+
timeoutMs: browserAuth.timeoutMs,
|
|
765
|
+
},
|
|
766
|
+
});
|
|
767
|
+
return {
|
|
768
|
+
actorResolve: async () => createResult(actor),
|
|
769
|
+
ownerRoleResolve: sharedAccess.ownerRoleResolve,
|
|
770
|
+
};
|
|
771
|
+
}
|
|
772
|
+
async function browserRequestContextResolve(request, context, browserAuth) {
|
|
773
|
+
if (context.access !== undefined)
|
|
774
|
+
return context;
|
|
775
|
+
const sessionR = await sessionRequestResolve(request.headers.get("cookie"), browserAuth.sessions, browserAuth.cookie, {
|
|
776
|
+
signal: request.signal,
|
|
777
|
+
timeoutMs: browserAuth.timeoutMs,
|
|
778
|
+
});
|
|
779
|
+
if (!sessionR.success)
|
|
780
|
+
return context;
|
|
781
|
+
const actorR = await sessionActorResolve(sessionR.data.id, {
|
|
782
|
+
sessions: browserAuth.sessions,
|
|
783
|
+
tokenReferences: browserAuth.tokenReferences,
|
|
784
|
+
identityDirectory: browserAuth.identityDirectory,
|
|
785
|
+
posixUsers: browserAuth.posixUsers,
|
|
786
|
+
signal: request.signal,
|
|
787
|
+
timeoutMs: browserAuth.timeoutMs,
|
|
788
|
+
});
|
|
789
|
+
if (!actorR.success)
|
|
790
|
+
return context;
|
|
791
|
+
return {
|
|
792
|
+
...context,
|
|
793
|
+
access: browserProjectAccessCreate(actorR.data, sessionR.data.id, request, browserAuth),
|
|
794
|
+
};
|
|
795
|
+
}
|
|
796
|
+
function handleRequest(request, context) {
|
|
797
|
+
if (request.method === "GET" && new URL(request.url).pathname === "/health/live") {
|
|
798
|
+
return Response.json(healthLive(), { status: healthLive().live ? 200 : 503 });
|
|
799
|
+
}
|
|
800
|
+
if (request.method === "GET" && new URL(request.url).pathname === "/health/ready") {
|
|
801
|
+
return readiness().then((readinessR) => {
|
|
802
|
+
const data = readinessR.success
|
|
803
|
+
? readinessR.data
|
|
804
|
+
: {
|
|
805
|
+
ready: false,
|
|
806
|
+
state,
|
|
807
|
+
repositoryReady: false,
|
|
808
|
+
listenersReady: false,
|
|
809
|
+
socketsReady: false,
|
|
810
|
+
caddyReady: false,
|
|
811
|
+
reason: readinessR.errorMessage,
|
|
812
|
+
};
|
|
813
|
+
return Response.json(data, { status: data.ready ? 200 : 503 });
|
|
814
|
+
});
|
|
815
|
+
}
|
|
816
|
+
if (state !== "running")
|
|
817
|
+
return new Response("Service unavailable", { status: 503 });
|
|
818
|
+
const handleResolvedRequest = (requestContext) => {
|
|
819
|
+
try {
|
|
820
|
+
return handler(request, requestContext);
|
|
821
|
+
}
|
|
822
|
+
catch {
|
|
823
|
+
return new Response("Internal server error", { status: 500 });
|
|
824
|
+
}
|
|
825
|
+
};
|
|
826
|
+
if (context.transport !== "http" || browserAuthOption === undefined)
|
|
827
|
+
return handleResolvedRequest(context);
|
|
828
|
+
return browserRequestContextResolve(request, context, browserAuthOption)
|
|
829
|
+
.then(handleResolvedRequest)
|
|
830
|
+
.catch(() => new Response("Internal server error", { status: 500 }));
|
|
831
|
+
}
|
|
832
|
+
async function awaitBeforeDeadline(operation, deadline) {
|
|
833
|
+
const remaining = deadline - Date.now();
|
|
834
|
+
if (remaining <= 0) {
|
|
835
|
+
void operation.then(() => undefined, () => undefined);
|
|
836
|
+
return false;
|
|
837
|
+
}
|
|
838
|
+
let clearTimeout;
|
|
839
|
+
const timeout = new Promise((resolveTimeout) => {
|
|
840
|
+
const schedule = timerOption?.setTimeout;
|
|
841
|
+
if (schedule !== undefined) {
|
|
842
|
+
const handle = schedule(() => resolveTimeout(false), remaining);
|
|
843
|
+
clearTimeout = () => timerOption?.clearTimeout?.(handle);
|
|
844
|
+
return;
|
|
845
|
+
}
|
|
846
|
+
const handle = globalThis.setTimeout(() => resolveTimeout(false), remaining);
|
|
847
|
+
clearTimeout = () => globalThis.clearTimeout(handle);
|
|
848
|
+
});
|
|
849
|
+
try {
|
|
850
|
+
const completed = await Promise.race([
|
|
851
|
+
operation.then(() => true, () => true),
|
|
852
|
+
timeout,
|
|
853
|
+
]);
|
|
854
|
+
clearTimeout?.();
|
|
855
|
+
return completed;
|
|
856
|
+
}
|
|
857
|
+
catch {
|
|
858
|
+
clearTimeout?.();
|
|
859
|
+
return true;
|
|
860
|
+
}
|
|
861
|
+
}
|
|
862
|
+
async function stopResourcesInternal() {
|
|
863
|
+
const failures = [];
|
|
864
|
+
if (userRefreshHandle !== undefined) {
|
|
865
|
+
try {
|
|
866
|
+
timer.clearInterval(userRefreshHandle);
|
|
867
|
+
}
|
|
868
|
+
catch (error) {
|
|
869
|
+
failures.push(`user refresh timer: ${errorMessage(error)}`);
|
|
870
|
+
}
|
|
871
|
+
userRefreshHandle = undefined;
|
|
872
|
+
}
|
|
873
|
+
while (signalCleanups.length > 0) {
|
|
874
|
+
const cleanup = signalCleanups.pop();
|
|
875
|
+
try {
|
|
876
|
+
cleanup?.();
|
|
877
|
+
}
|
|
878
|
+
catch (error) {
|
|
879
|
+
failures.push(`signal cleanup: ${errorMessage(error)}`);
|
|
880
|
+
}
|
|
881
|
+
}
|
|
882
|
+
signalsInstalled = false;
|
|
883
|
+
const records = new Map();
|
|
884
|
+
for (const record of cleanupRecords.values())
|
|
885
|
+
records.set(record.path, record);
|
|
886
|
+
for (const record of socketRecords.values())
|
|
887
|
+
records.set(record.path, record);
|
|
888
|
+
socketRecords.clear();
|
|
889
|
+
const recordResultsPromise = Promise.all([...records.values()].map(async (record) => ({ record, result: await stopAndRemove(record) })));
|
|
890
|
+
const currentWebServer = webServer;
|
|
891
|
+
const webServerResultPromise = currentWebServer === undefined
|
|
892
|
+
? Promise.resolve(undefined)
|
|
893
|
+
: serverStopOnce(currentWebServer).then(() => {
|
|
894
|
+
if (webServer === currentWebServer)
|
|
895
|
+
webServer = undefined;
|
|
896
|
+
return undefined;
|
|
897
|
+
}, (error) => `web listener: ${errorMessage(error)}`);
|
|
898
|
+
const lateServerResultsPromise = Promise.all([...lateServerHandles].map(async (server) => {
|
|
899
|
+
try {
|
|
900
|
+
await serverStopOnce(server);
|
|
901
|
+
lateServerHandles.delete(server);
|
|
902
|
+
return undefined;
|
|
903
|
+
}
|
|
904
|
+
catch (error) {
|
|
905
|
+
return `late server: ${errorMessage(error)}`;
|
|
906
|
+
}
|
|
907
|
+
}));
|
|
908
|
+
const [recordResults, webServerFailure, lateServerResults] = await Promise.all([
|
|
909
|
+
recordResultsPromise,
|
|
910
|
+
webServerResultPromise,
|
|
911
|
+
lateServerResultsPromise,
|
|
912
|
+
]);
|
|
913
|
+
for (const { record, result } of recordResults) {
|
|
914
|
+
if (!result.success)
|
|
915
|
+
failures.push(`${record.mapping.username}: ${result.errorMessage}`);
|
|
916
|
+
}
|
|
917
|
+
if (webServerFailure !== undefined)
|
|
918
|
+
failures.push(webServerFailure);
|
|
919
|
+
for (const failure of lateServerResults) {
|
|
920
|
+
if (failure !== undefined)
|
|
921
|
+
failures.push(failure);
|
|
922
|
+
}
|
|
923
|
+
return failures;
|
|
924
|
+
}
|
|
925
|
+
function stopResources() {
|
|
926
|
+
if (resourceCleanupPromise !== undefined)
|
|
927
|
+
return resourceCleanupPromise;
|
|
928
|
+
const current = stopResourcesInternal();
|
|
929
|
+
resourceCleanupPromise = current;
|
|
930
|
+
void current.then((failures) => {
|
|
931
|
+
if (failures.length > 0 && resourceCleanupPromise === current)
|
|
932
|
+
resourceCleanupPromise = undefined;
|
|
933
|
+
}, () => {
|
|
934
|
+
if (resourceCleanupPromise === current)
|
|
935
|
+
resourceCleanupPromise = undefined;
|
|
936
|
+
});
|
|
937
|
+
return current;
|
|
938
|
+
}
|
|
939
|
+
function gitQueueRun(operation, run) {
|
|
940
|
+
if (state === "stopping" || state === "stopped" || state === "failed") {
|
|
941
|
+
return Promise.resolve(createResultError(operation, "project-registryd is shutting down"));
|
|
942
|
+
}
|
|
943
|
+
const previous = gitTail;
|
|
944
|
+
const result = previous.then(async () => {
|
|
945
|
+
try {
|
|
946
|
+
return await run();
|
|
947
|
+
}
|
|
948
|
+
catch (error) {
|
|
949
|
+
return createResultError(operation, errorMessage(error));
|
|
950
|
+
}
|
|
951
|
+
});
|
|
952
|
+
gitTail = result.then(() => undefined, () => undefined);
|
|
953
|
+
return result;
|
|
954
|
+
}
|
|
955
|
+
const guardedRepository = {
|
|
956
|
+
read: () => gitQueueRun("projectRegistryRepositoryRead", () => repository.read()),
|
|
957
|
+
get: (key) => gitQueueRun("projectRegistryRepositoryGet", () => repository.get(key)),
|
|
958
|
+
create: (project, mutationOptions) => gitQueueRun("projectRegistryRepositoryCreate", () => repository.create(project, mutationOptions)),
|
|
959
|
+
edit: (key, project, mutationOptions) => gitQueueRun("projectRegistryRepositoryEdit", () => repository.edit(key, project, mutationOptions)),
|
|
960
|
+
delete: (key, mutationOptions) => gitQueueRun("projectRegistryRepositoryDelete", () => repository.delete(key, mutationOptions)),
|
|
961
|
+
history: (key, limit) => gitQueueRun("projectRegistryRepositoryHistory", () => repository.history(key, limit)),
|
|
962
|
+
ownerHistory: (owner, limit) => gitQueueRun("projectRegistryRepositoryOwnerHistory", () => repository.ownerHistory(owner, limit)),
|
|
963
|
+
readiness: () => repository.readiness(),
|
|
964
|
+
recover: () => gitQueueRun("projectRegistryRepositoryRecover", () => repository.recover()),
|
|
965
|
+
};
|
|
966
|
+
const accessLogSourceR = accessLogSourceOption !== undefined
|
|
967
|
+
? createResult(accessLogSourceOption)
|
|
968
|
+
: config.caddyAccessLogRoot === undefined
|
|
969
|
+
? undefined
|
|
970
|
+
: projectAccessLogSourceFileCreate({ root: config.caddyAccessLogRoot, maxRecords: 1_000 });
|
|
971
|
+
const socketAccessResolve = socketAccessResolveOption ??
|
|
972
|
+
(async (username) => createResultError("projectRegistryDaemonSocketAccessResolve", "socket actor role is unavailable", username));
|
|
973
|
+
const handler = requestHandlerOption ??
|
|
974
|
+
projectRegistryApiHandlerCreate({
|
|
975
|
+
repository: guardedRepository,
|
|
976
|
+
caddyApplication,
|
|
977
|
+
...(accessLogSourceR?.success === true ? { projectAccessLogSource: accessLogSourceR.data } : {}),
|
|
978
|
+
socketAccessResolve,
|
|
979
|
+
configOptions: {
|
|
980
|
+
httpsListener: config.httpsListener,
|
|
981
|
+
oidc: config.oidc,
|
|
982
|
+
...(config.caddyAccessLogRoot === undefined ? {} : { caddyAccessLogRoot: config.caddyAccessLogRoot }),
|
|
983
|
+
},
|
|
984
|
+
portRange: config.portRange,
|
|
985
|
+
});
|
|
986
|
+
function caddyStop() {
|
|
987
|
+
if (!caddyStartAttempted)
|
|
988
|
+
return Promise.resolve([]);
|
|
989
|
+
if (caddyStopPromise !== undefined)
|
|
990
|
+
return caddyStopPromise;
|
|
991
|
+
const current = Promise.resolve()
|
|
992
|
+
.then(() => caddyApplication.stop())
|
|
993
|
+
.then(() => [], (error) => [`Caddy application shutdown: ${errorMessage(error)}`]);
|
|
994
|
+
caddyStopPromise = current;
|
|
995
|
+
void current.then((failures) => {
|
|
996
|
+
if (failures.length > 0 && caddyStopPromise === current)
|
|
997
|
+
caddyStopPromise = undefined;
|
|
998
|
+
}, () => {
|
|
999
|
+
if (caddyStopPromise === current)
|
|
1000
|
+
caddyStopPromise = undefined;
|
|
1001
|
+
});
|
|
1002
|
+
return current;
|
|
1003
|
+
}
|
|
1004
|
+
function signalsInstall() {
|
|
1005
|
+
if (signalsInstalled)
|
|
1006
|
+
return createResult(undefined);
|
|
1007
|
+
const cleanups = [];
|
|
1008
|
+
try {
|
|
1009
|
+
const onSignal = () => {
|
|
1010
|
+
void shutdown().then(() => undefined, () => undefined);
|
|
1011
|
+
};
|
|
1012
|
+
cleanups.push(signals.on("SIGINT", onSignal));
|
|
1013
|
+
cleanups.push(signals.on("SIGTERM", onSignal));
|
|
1014
|
+
signalCleanups.push(...cleanups);
|
|
1015
|
+
signalsInstalled = true;
|
|
1016
|
+
return createResult(undefined);
|
|
1017
|
+
}
|
|
1018
|
+
catch {
|
|
1019
|
+
while (cleanups.length > 0) {
|
|
1020
|
+
try {
|
|
1021
|
+
cleanups.pop()?.();
|
|
1022
|
+
}
|
|
1023
|
+
catch {
|
|
1024
|
+
// Signal installation has already failed.
|
|
1025
|
+
}
|
|
1026
|
+
}
|
|
1027
|
+
return createResultError(op, "daemon signal setup failed");
|
|
1028
|
+
}
|
|
1029
|
+
}
|
|
1030
|
+
async function startupRollback() {
|
|
1031
|
+
const rollback = Promise.all([caddyStop(), stopResources()]).then(([caddyFailures, resourceFailures]) => [
|
|
1032
|
+
...caddyFailures,
|
|
1033
|
+
...resourceFailures,
|
|
1034
|
+
]);
|
|
1035
|
+
const deadline = Date.now() + config.shutdownTimeoutMs;
|
|
1036
|
+
if (!(await awaitBeforeDeadline(rollback, deadline)))
|
|
1037
|
+
return ["daemon startup rollback timed out"];
|
|
1038
|
+
try {
|
|
1039
|
+
return await rollback;
|
|
1040
|
+
}
|
|
1041
|
+
catch {
|
|
1042
|
+
return ["daemon startup rollback failed"];
|
|
1043
|
+
}
|
|
1044
|
+
}
|
|
1045
|
+
async function startupFailure(message) {
|
|
1046
|
+
let rollbackFailed = false;
|
|
1047
|
+
try {
|
|
1048
|
+
rollbackFailed = (await startupRollback()).length > 0;
|
|
1049
|
+
}
|
|
1050
|
+
catch {
|
|
1051
|
+
rollbackFailed = true;
|
|
1052
|
+
}
|
|
1053
|
+
if (!daemonStopping())
|
|
1054
|
+
state = "failed";
|
|
1055
|
+
const result = createResultError(op, rollbackFailed ? "daemon startup rollback failed" : message);
|
|
1056
|
+
if (state === "failed")
|
|
1057
|
+
terminationSettle(result);
|
|
1058
|
+
return result;
|
|
1059
|
+
}
|
|
1060
|
+
async function readiness() {
|
|
1061
|
+
if (state !== "running") {
|
|
1062
|
+
return createResult({
|
|
1063
|
+
ready: false,
|
|
1064
|
+
state,
|
|
1065
|
+
repositoryReady: false,
|
|
1066
|
+
listenersReady: false,
|
|
1067
|
+
socketsReady: false,
|
|
1068
|
+
caddyReady: false,
|
|
1069
|
+
reason: state === "stopping" ? "daemon is shutting down" : "daemon is not running",
|
|
1070
|
+
});
|
|
1071
|
+
}
|
|
1072
|
+
let repositoryReady = false;
|
|
1073
|
+
let reason;
|
|
1074
|
+
try {
|
|
1075
|
+
const repositoryR = await repository.readiness();
|
|
1076
|
+
if (!repositoryR.success)
|
|
1077
|
+
reason = repositoryR.errorMessage;
|
|
1078
|
+
else {
|
|
1079
|
+
repositoryReady = repositoryR.data.ready;
|
|
1080
|
+
reason = repositoryR.data.reason;
|
|
1081
|
+
}
|
|
1082
|
+
}
|
|
1083
|
+
catch {
|
|
1084
|
+
reason = "repository readiness unavailable";
|
|
1085
|
+
}
|
|
1086
|
+
const listenersReady = webServer !== undefined;
|
|
1087
|
+
let caddyReady = false;
|
|
1088
|
+
try {
|
|
1089
|
+
const status = caddyApplication.status();
|
|
1090
|
+
caddyReady = caddyStarted && !status.pending && status.error === undefined;
|
|
1091
|
+
if (!caddyReady && status.error !== undefined && reason === undefined) {
|
|
1092
|
+
reason = "Caddy application is not ready";
|
|
1093
|
+
}
|
|
1094
|
+
}
|
|
1095
|
+
catch {
|
|
1096
|
+
reason = reason ?? "Caddy status unavailable";
|
|
1097
|
+
}
|
|
1098
|
+
const ready = repositoryReady && listenersReady && socketStateReady && caddyReady;
|
|
1099
|
+
if (!ready && reason === undefined)
|
|
1100
|
+
reason = "one or more runtime dependencies are not ready";
|
|
1101
|
+
return createResult({
|
|
1102
|
+
ready,
|
|
1103
|
+
state,
|
|
1104
|
+
repositoryReady,
|
|
1105
|
+
listenersReady,
|
|
1106
|
+
socketsReady: socketStateReady,
|
|
1107
|
+
caddyReady,
|
|
1108
|
+
reason,
|
|
1109
|
+
});
|
|
1110
|
+
}
|
|
1111
|
+
async function startInternal() {
|
|
1112
|
+
if (state !== "starting")
|
|
1113
|
+
return createResultError(op, "daemon has stopped");
|
|
1114
|
+
const signalsR = signalsInstall();
|
|
1115
|
+
if (!signalsR.success)
|
|
1116
|
+
return startupFailure(signalsR.errorMessage);
|
|
1117
|
+
const rootR = await rootCheck();
|
|
1118
|
+
if (!rootR.success)
|
|
1119
|
+
return startupFailure(rootR.errorMessage);
|
|
1120
|
+
try {
|
|
1121
|
+
const webR = await serverCreate({
|
|
1122
|
+
hostname: config.webListener.hostname,
|
|
1123
|
+
port: config.webListener.port,
|
|
1124
|
+
fetch: (request) => handleRequest(request, { transport: "http" }),
|
|
1125
|
+
});
|
|
1126
|
+
if (!webR.success)
|
|
1127
|
+
return startupFailure(webR.errorMessage);
|
|
1128
|
+
webServer = webR.data;
|
|
1129
|
+
if (state !== "starting")
|
|
1130
|
+
return startupFailure("daemon shutdown started");
|
|
1131
|
+
const socketsR = await refreshSockets();
|
|
1132
|
+
if (!socketsR.success)
|
|
1133
|
+
return startupFailure(socketsR.errorMessage);
|
|
1134
|
+
if (state !== "starting")
|
|
1135
|
+
return startupFailure("daemon shutdown started");
|
|
1136
|
+
caddyStartAttempted = true;
|
|
1137
|
+
const caddyR = await caddyApplication.startup();
|
|
1138
|
+
if (!caddyR.success)
|
|
1139
|
+
return startupFailure(caddyR.errorMessage);
|
|
1140
|
+
caddyStarted = true;
|
|
1141
|
+
if (state !== "starting")
|
|
1142
|
+
return startupFailure("daemon shutdown started");
|
|
1143
|
+
try {
|
|
1144
|
+
userRefreshHandle = timer.setInterval(() => {
|
|
1145
|
+
if (state === "running")
|
|
1146
|
+
void refreshSockets();
|
|
1147
|
+
}, config.userRefreshIntervalMs);
|
|
1148
|
+
}
|
|
1149
|
+
catch {
|
|
1150
|
+
return startupFailure("daemon timer setup failed");
|
|
1151
|
+
}
|
|
1152
|
+
if (state !== "starting")
|
|
1153
|
+
return startupFailure("daemon shutdown started");
|
|
1154
|
+
state = "running";
|
|
1155
|
+
return createResult(undefined);
|
|
1156
|
+
}
|
|
1157
|
+
catch {
|
|
1158
|
+
return startupFailure("daemon startup failed");
|
|
1159
|
+
}
|
|
1160
|
+
}
|
|
1161
|
+
function start() {
|
|
1162
|
+
if (startPromise !== undefined)
|
|
1163
|
+
return startPromise;
|
|
1164
|
+
if (state === "stopped" || state === "stopping")
|
|
1165
|
+
return Promise.resolve(createResultError(op, "daemon has stopped"));
|
|
1166
|
+
state = "starting";
|
|
1167
|
+
const current = Promise.resolve()
|
|
1168
|
+
.then(startInternal)
|
|
1169
|
+
.catch(async () => startupFailure("daemon startup failed"));
|
|
1170
|
+
startPromise = current;
|
|
1171
|
+
return current;
|
|
1172
|
+
}
|
|
1173
|
+
async function shutdownWork() {
|
|
1174
|
+
const operations = [
|
|
1175
|
+
gitTail.then(() => [], () => ["Git queue did not complete"]),
|
|
1176
|
+
caddyStop(),
|
|
1177
|
+
];
|
|
1178
|
+
const currentSocketRefresh = socketRefreshPromise;
|
|
1179
|
+
if (currentSocketRefresh !== undefined) {
|
|
1180
|
+
operations.push(currentSocketRefresh.then((result) => (result.success ? [] : ["socket refresh did not complete"]), () => ["socket refresh did not complete"]));
|
|
1181
|
+
}
|
|
1182
|
+
const results = await Promise.all(operations);
|
|
1183
|
+
return results.flat();
|
|
1184
|
+
}
|
|
1185
|
+
async function shutdownInternal() {
|
|
1186
|
+
state = "stopping";
|
|
1187
|
+
const deadline = Date.now() + config.shutdownTimeoutMs;
|
|
1188
|
+
const failures = [];
|
|
1189
|
+
const work = shutdownWork();
|
|
1190
|
+
if (await awaitBeforeDeadline(work, deadline)) {
|
|
1191
|
+
failures.push(...(await work.catch(() => ["shutdown work failed"])));
|
|
1192
|
+
}
|
|
1193
|
+
else {
|
|
1194
|
+
failures.push("shutdown timed out");
|
|
1195
|
+
}
|
|
1196
|
+
const cleanup = stopResources();
|
|
1197
|
+
if (await awaitBeforeDeadline(cleanup, deadline)) {
|
|
1198
|
+
failures.push(...(await cleanup.catch(() => ["resource cleanup failed"])));
|
|
1199
|
+
}
|
|
1200
|
+
else {
|
|
1201
|
+
failures.push("resource cleanup timed out");
|
|
1202
|
+
}
|
|
1203
|
+
if (webServer !== undefined || lateServerHandles.size > 0 || cleanupRecords.size > 0) {
|
|
1204
|
+
failures.push("resource cleanup remains pending");
|
|
1205
|
+
}
|
|
1206
|
+
state = "stopped";
|
|
1207
|
+
const result = failures.length > 0
|
|
1208
|
+
? createResultError("projectRegistryDaemonShutdown", "daemon shutdown degraded")
|
|
1209
|
+
: createResult(undefined);
|
|
1210
|
+
terminationSettle(result);
|
|
1211
|
+
return result;
|
|
1212
|
+
}
|
|
1213
|
+
function shutdown() {
|
|
1214
|
+
if (shutdownPromise !== undefined)
|
|
1215
|
+
return shutdownPromise;
|
|
1216
|
+
shutdownSettled = false;
|
|
1217
|
+
const current = Promise.resolve()
|
|
1218
|
+
.then(shutdownInternal)
|
|
1219
|
+
.catch(() => {
|
|
1220
|
+
state = "stopped";
|
|
1221
|
+
const result = createResultError("projectRegistryDaemonShutdown", "daemon shutdown degraded");
|
|
1222
|
+
terminationSettle(result);
|
|
1223
|
+
return result;
|
|
1224
|
+
});
|
|
1225
|
+
shutdownPromise = current.then((result) => {
|
|
1226
|
+
shutdownSettled = true;
|
|
1227
|
+
if (result.success && (webServer !== undefined || lateServerHandles.size > 0 || cleanupRecords.size > 0)) {
|
|
1228
|
+
shutdownPromise = undefined;
|
|
1229
|
+
resourceCleanupPromise = undefined;
|
|
1230
|
+
shutdownSettled = false;
|
|
1231
|
+
}
|
|
1232
|
+
if (!result.success)
|
|
1233
|
+
shutdownPromise = undefined;
|
|
1234
|
+
return result;
|
|
1235
|
+
});
|
|
1236
|
+
return shutdownPromise;
|
|
1237
|
+
}
|
|
1238
|
+
const daemon = {
|
|
1239
|
+
config,
|
|
1240
|
+
repository: guardedRepository,
|
|
1241
|
+
caddyApplication,
|
|
1242
|
+
start,
|
|
1243
|
+
shutdown,
|
|
1244
|
+
termination: () => terminationPromise,
|
|
1245
|
+
healthLive,
|
|
1246
|
+
readiness,
|
|
1247
|
+
refreshSockets,
|
|
1248
|
+
};
|
|
1249
|
+
return createResult(daemon);
|
|
1250
|
+
}
|
|
1251
|
+
//# sourceMappingURL=projectRegistryDaemonCreate.js.map
|