@harperfast/harper 5.2.9 → 5.3.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent/mcpTools.ts +1 -1
- package/agent/session.ts +25 -14
- package/bin/cliOperations.ts +46 -9
- package/bin/copyDb.ts +282 -59
- package/bin/deploySetup.ts +16 -5
- package/bin/harper.ts +1 -1
- package/bin/help.ts +4 -1
- package/bin/lite.ts +4 -1
- package/bin/restart.ts +59 -3
- package/bin/run.ts +6 -11
- package/bin/upgrade.js +7 -3
- package/bin/workloadIdentity.ts +119 -0
- package/components/Application.ts +2414 -242
- package/components/ApplicationScope.ts +8 -0
- package/components/EntryHandler.ts +59 -39
- package/components/OptionsWatcher.ts +150 -74
- package/components/RuntimeModuleTracker.ts +38 -7
- package/components/Scope.ts +37 -15
- package/components/awaitRestart.ts +84 -0
- package/components/componentLoader.ts +340 -30
- package/components/componentPreparationLock.ts +16 -5
- package/components/mcp/adapters/harperHttp.ts +4 -0
- package/components/mcp/listChanged.ts +4 -0
- package/components/mcp/toolRegistry.ts +2 -0
- package/components/mcp/tools/operations.ts +9 -0
- package/components/mcp/tools/schemas/operationDescriptions.ts +2 -2
- package/components/operations.js +270 -78
- package/components/operationsValidation.js +49 -1
- package/components/status/ComponentStatusRegistry.ts +59 -0
- package/config/RootConfigWatcher.ts +80 -34
- package/config/configUtils.ts +291 -34
- package/config/harperConfigEnvVars.ts +170 -27
- package/config-root.schema.json +29 -0
- package/dataLayer/blobBackup.ts +160 -50
- package/dataLayer/delete.ts +6 -1
- package/dataLayer/harperBridge/ResourceBridge.ts +52 -8
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +3 -1
- package/dataLayer/hdbInfoController.ts +34 -1
- package/dataLayer/insert.ts +44 -1
- package/dataLayer/rocksdbBackup.ts +53 -10
- package/dataLayer/schema.ts +11 -1
- package/dataLayer/schemaDescribe.ts +8 -1
- package/dist/agent/mcpTools.js +1 -1
- package/dist/agent/mcpTools.js.map +1 -1
- package/dist/agent/session.d.ts +22 -0
- package/dist/agent/session.js +26 -15
- package/dist/agent/session.js.map +1 -1
- package/dist/bin/cliOperations.js +48 -9
- package/dist/bin/cliOperations.js.map +1 -1
- package/dist/bin/copyDb.d.ts +12 -1
- package/dist/bin/copyDb.js +248 -60
- package/dist/bin/copyDb.js.map +1 -1
- package/dist/bin/deploySetup.d.ts +2 -0
- package/dist/bin/deploySetup.js +11 -3
- package/dist/bin/deploySetup.js.map +1 -1
- package/dist/bin/harper.js +1 -1
- package/dist/bin/harper.js.map +1 -1
- package/dist/bin/help.js +4 -1
- package/dist/bin/help.js.map +1 -1
- package/dist/bin/lite.js +4 -1
- package/dist/bin/lite.js.map +1 -1
- package/dist/bin/restart.js +54 -5
- package/dist/bin/restart.js.map +1 -1
- package/dist/bin/run.js +4 -10
- package/dist/bin/run.js.map +1 -1
- package/dist/bin/upgrade.js +4 -3
- package/dist/bin/upgrade.js.map +1 -1
- package/dist/bin/workloadIdentity.d.ts +18 -0
- package/dist/bin/workloadIdentity.js +100 -0
- package/dist/bin/workloadIdentity.js.map +1 -0
- package/dist/components/Application.d.ts +139 -16
- package/dist/components/Application.js +2215 -267
- package/dist/components/Application.js.map +1 -1
- package/dist/components/ApplicationScope.d.ts +8 -0
- package/dist/components/ApplicationScope.js +7 -0
- package/dist/components/ApplicationScope.js.map +1 -1
- package/dist/components/EntryHandler.js +26 -10
- package/dist/components/EntryHandler.js.map +1 -1
- package/dist/components/OptionsWatcher.d.ts +1 -0
- package/dist/components/OptionsWatcher.js +141 -74
- package/dist/components/OptionsWatcher.js.map +1 -1
- package/dist/components/RuntimeModuleTracker.js +40 -6
- package/dist/components/RuntimeModuleTracker.js.map +1 -1
- package/dist/components/Scope.js +38 -13
- package/dist/components/Scope.js.map +1 -1
- package/dist/components/awaitRestart.d.ts +33 -0
- package/dist/components/awaitRestart.js +61 -0
- package/dist/components/awaitRestart.js.map +1 -0
- package/dist/components/componentLoader.d.ts +38 -1
- package/dist/components/componentLoader.js +279 -22
- package/dist/components/componentLoader.js.map +1 -1
- package/dist/components/componentPreparationLock.d.ts +5 -0
- package/dist/components/componentPreparationLock.js +14 -6
- package/dist/components/componentPreparationLock.js.map +1 -1
- package/dist/components/mcp/adapters/harperHttp.js +4 -0
- package/dist/components/mcp/adapters/harperHttp.js.map +1 -1
- package/dist/components/mcp/listChanged.js +5 -0
- package/dist/components/mcp/listChanged.js.map +1 -1
- package/dist/components/mcp/toolRegistry.d.ts +1 -0
- package/dist/components/mcp/toolRegistry.js.map +1 -1
- package/dist/components/mcp/tools/operations.d.ts +5 -0
- package/dist/components/mcp/tools/operations.js +9 -0
- package/dist/components/mcp/tools/operations.js.map +1 -1
- package/dist/components/mcp/tools/schemas/operationDescriptions.js +2 -2
- package/dist/components/mcp/tools/schemas/operationDescriptions.js.map +1 -1
- package/dist/components/operations.js +231 -77
- package/dist/components/operations.js.map +1 -1
- package/dist/components/operationsValidation.js +49 -1
- package/dist/components/operationsValidation.js.map +1 -1
- package/dist/components/status/ComponentStatusRegistry.d.ts +0 -4
- package/dist/components/status/ComponentStatusRegistry.js +63 -0
- package/dist/components/status/ComponentStatusRegistry.js.map +1 -1
- package/dist/config/RootConfigWatcher.d.ts +7 -1
- package/dist/config/RootConfigWatcher.js +64 -27
- package/dist/config/RootConfigWatcher.js.map +1 -1
- package/dist/config/configUtils.d.ts +9 -1
- package/dist/config/configUtils.js +254 -33
- package/dist/config/configUtils.js.map +1 -1
- package/dist/config/harperConfigEnvVars.d.ts +16 -0
- package/dist/config/harperConfigEnvVars.js +162 -25
- package/dist/config/harperConfigEnvVars.js.map +1 -1
- package/dist/dataLayer/blobBackup.d.ts +49 -20
- package/dist/dataLayer/blobBackup.js +139 -50
- package/dist/dataLayer/blobBackup.js.map +1 -1
- package/dist/dataLayer/delete.js +1 -1
- package/dist/dataLayer/delete.js.map +1 -1
- package/dist/dataLayer/harperBridge/ResourceBridge.d.ts +14 -1
- package/dist/dataLayer/harperBridge/ResourceBridge.js +51 -10
- package/dist/dataLayer/harperBridge/ResourceBridge.js.map +1 -1
- package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.d.ts +3 -1
- package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +3 -1
- package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js.map +1 -1
- package/dist/dataLayer/hdbInfoController.d.ts +10 -0
- package/dist/dataLayer/hdbInfoController.js +30 -1
- package/dist/dataLayer/hdbInfoController.js.map +1 -1
- package/dist/dataLayer/insert.d.ts +9 -1
- package/dist/dataLayer/insert.js +30 -0
- package/dist/dataLayer/insert.js.map +1 -1
- package/dist/dataLayer/rocksdbBackup.d.ts +2 -2
- package/dist/dataLayer/rocksdbBackup.js +45 -8
- package/dist/dataLayer/rocksdbBackup.js.map +1 -1
- package/dist/dataLayer/schema.js +8 -0
- package/dist/dataLayer/schema.js.map +1 -1
- package/dist/dataLayer/schemaDescribe.js +8 -1
- package/dist/dataLayer/schemaDescribe.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/dist/json/systemSchema.json +52 -0
- package/dist/resources/DatabaseTransaction.d.ts +55 -0
- package/dist/resources/DatabaseTransaction.js +459 -45
- package/dist/resources/DatabaseTransaction.js.map +1 -1
- package/dist/resources/LMDBTransaction.js +22 -4
- package/dist/resources/LMDBTransaction.js.map +1 -1
- package/dist/resources/PrimaryRocksDatabase.d.ts +1 -0
- package/dist/resources/PrimaryRocksDatabase.js +29 -0
- package/dist/resources/PrimaryRocksDatabase.js.map +1 -1
- package/dist/resources/RecordEncoder.d.ts +20 -0
- package/dist/resources/RecordEncoder.js +94 -9
- package/dist/resources/RecordEncoder.js.map +1 -1
- package/dist/resources/RequestTarget.d.ts +2 -0
- package/dist/resources/RequestTarget.js.map +1 -1
- package/dist/resources/Resource.js +20 -11
- package/dist/resources/Resource.js.map +1 -1
- package/dist/resources/ResourceInterface.d.ts +20 -1
- package/dist/resources/ResourceInterface.js.map +1 -1
- package/dist/resources/RocksIndexStore.d.ts +6 -1
- package/dist/resources/RocksIndexStore.js +24 -9
- package/dist/resources/RocksIndexStore.js.map +1 -1
- package/dist/resources/RocksTransactionLogStore.d.ts +14 -1
- package/dist/resources/RocksTransactionLogStore.js +57 -17
- package/dist/resources/RocksTransactionLogStore.js.map +1 -1
- package/dist/resources/Table.d.ts +112 -8
- package/dist/resources/Table.js +1073 -191
- package/dist/resources/Table.js.map +1 -1
- package/dist/resources/auditStore.d.ts +11 -2
- package/dist/resources/auditStore.js +325 -71
- package/dist/resources/auditStore.js.map +1 -1
- package/dist/resources/blob.d.ts +129 -9
- package/dist/resources/blob.js +992 -114
- package/dist/resources/blob.js.map +1 -1
- package/dist/resources/branchDatabase.d.ts +48 -0
- package/dist/resources/branchDatabase.js +892 -0
- package/dist/resources/branchDatabase.js.map +1 -0
- package/dist/resources/crdt.js +50 -12
- package/dist/resources/crdt.js.map +1 -1
- package/dist/resources/databases.d.ts +150 -0
- package/dist/resources/databases.js +1200 -239
- package/dist/resources/databases.js.map +1 -1
- package/dist/resources/defineTable.d.ts +10 -2
- package/dist/resources/defineTable.js +9 -1
- package/dist/resources/defineTable.js.map +1 -1
- package/dist/resources/graphql.d.ts +1 -1
- package/dist/resources/graphql.js +50 -15
- package/dist/resources/graphql.js.map +1 -1
- package/dist/resources/indexes/HierarchicalNavigableSmallWorld.d.ts +1 -0
- package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js +6 -2
- package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js.map +1 -1
- package/dist/resources/longLivedTransactions.d.ts +71 -0
- package/dist/resources/longLivedTransactions.js +358 -0
- package/dist/resources/longLivedTransactions.js.map +1 -0
- package/dist/resources/models/backendRegistry.d.ts +26 -0
- package/dist/resources/models/backendRegistry.js +60 -2
- package/dist/resources/models/backendRegistry.js.map +1 -1
- package/dist/resources/models/bootstrap.d.ts +33 -1
- package/dist/resources/models/bootstrap.js +416 -31
- package/dist/resources/models/bootstrap.js.map +1 -1
- package/dist/resources/recordLock.d.ts +80 -0
- package/dist/resources/recordLock.js +184 -0
- package/dist/resources/recordLock.js.map +1 -0
- package/dist/resources/replayLogs.d.ts +14 -1
- package/dist/resources/replayLogs.js +152 -24
- package/dist/resources/replayLogs.js.map +1 -1
- package/dist/resources/replayLogsGuards.d.ts +94 -7
- package/dist/resources/replayLogsGuards.js +111 -7
- package/dist/resources/replayLogsGuards.js.map +1 -1
- package/dist/resources/search.js +158 -6
- package/dist/resources/search.js.map +1 -1
- package/dist/resources/transactionBroadcast.d.ts +1 -1
- package/dist/resources/transactionBroadcast.js +2 -2
- package/dist/resources/transactionBroadcast.js.map +1 -1
- package/dist/security/auth.js +61 -30
- package/dist/security/auth.js.map +1 -1
- package/dist/security/authn/oidc/claims.d.ts +22 -0
- package/dist/security/authn/oidc/claims.js +71 -0
- package/dist/security/authn/oidc/claims.js.map +1 -0
- package/dist/security/authn/oidc/identityToken.d.ts +27 -0
- package/dist/security/authn/oidc/identityToken.js +111 -0
- package/dist/security/authn/oidc/identityToken.js.map +1 -0
- package/dist/security/authn/oidc/jwks.d.ts +25 -0
- package/dist/security/authn/oidc/jwks.js +261 -0
- package/dist/security/authn/oidc/jwks.js.map +1 -0
- package/dist/security/authn/oidc/providers/generic.d.ts +13 -0
- package/dist/security/authn/oidc/providers/generic.js +34 -0
- package/dist/security/authn/oidc/providers/generic.js.map +1 -0
- package/dist/security/authn/oidc/providers/githubActions.d.ts +11 -0
- package/dist/security/authn/oidc/providers/githubActions.js +129 -0
- package/dist/security/authn/oidc/providers/githubActions.js.map +1 -0
- package/dist/security/authn/oidc/providers/index.d.ts +37 -0
- package/dist/security/authn/oidc/providers/index.js +24 -0
- package/dist/security/authn/oidc/providers/index.js.map +1 -0
- package/dist/security/authn/oidc/tokenExchange.d.ts +12 -0
- package/dist/security/authn/oidc/tokenExchange.js +306 -0
- package/dist/security/authn/oidc/tokenExchange.js.map +1 -0
- package/dist/security/authn/oidc/trustPolicyOperations.d.ts +49 -0
- package/dist/security/authn/oidc/trustPolicyOperations.js +358 -0
- package/dist/security/authn/oidc/trustPolicyOperations.js.map +1 -0
- package/dist/security/authn/oidc/types.d.ts +38 -0
- package/dist/security/authn/oidc/types.js +6 -0
- package/dist/security/authn/oidc/types.js.map +1 -0
- package/dist/security/certificateVerification/index.js +40 -11
- package/dist/security/certificateVerification/index.js.map +1 -1
- package/dist/security/certificateVerification/trustedIssuers.d.ts +24 -0
- package/dist/security/certificateVerification/trustedIssuers.js +79 -0
- package/dist/security/certificateVerification/trustedIssuers.js.map +1 -0
- package/dist/security/certificateVerification/types.d.ts +1 -0
- package/dist/security/credentialProvenance.d.ts +35 -0
- package/dist/security/credentialProvenance.js +51 -0
- package/dist/security/credentialProvenance.js.map +1 -0
- package/dist/security/credentialRejection.d.ts +4 -0
- package/dist/security/credentialRejection.js +24 -0
- package/dist/security/credentialRejection.js.map +1 -0
- package/dist/security/deferredAuthentication.d.ts +36 -0
- package/dist/security/deferredAuthentication.js +70 -0
- package/dist/security/deferredAuthentication.js.map +1 -0
- package/dist/security/impersonation.d.ts +21 -0
- package/dist/security/impersonation.js +108 -9
- package/dist/security/impersonation.js.map +1 -1
- package/dist/security/jsLoader.d.ts +6 -0
- package/dist/security/jsLoader.js +75 -15
- package/dist/security/jsLoader.js.map +1 -1
- package/dist/security/keys.js +301 -71
- package/dist/security/keys.js.map +1 -1
- package/dist/security/operationScope.d.ts +21 -0
- package/dist/security/operationScope.js +36 -0
- package/dist/security/operationScope.js.map +1 -0
- package/dist/security/permissionsTranslator.js +21 -0
- package/dist/security/permissionsTranslator.js.map +1 -1
- package/dist/security/tokenAuthentication.d.ts +19 -1
- package/dist/security/tokenAuthentication.js +191 -10
- package/dist/security/tokenAuthentication.js.map +1 -1
- package/dist/security/user.js +4 -3
- package/dist/security/user.js.map +1 -1
- package/dist/server/DurableSubscriptionsSession.d.ts +2 -2
- package/dist/server/DurableSubscriptionsSession.js +67 -10
- package/dist/server/DurableSubscriptionsSession.js.map +1 -1
- package/dist/server/REST.js +73 -0
- package/dist/server/REST.js.map +1 -1
- package/dist/server/graphqlQuerying.js +4 -0
- package/dist/server/graphqlQuerying.js.map +1 -1
- package/dist/server/http.d.ts +11 -0
- package/dist/server/http.js +88 -15
- package/dist/server/http.js.map +1 -1
- package/dist/server/itc/serverHandlers.js +8 -1
- package/dist/server/itc/serverHandlers.js.map +1 -1
- package/dist/server/jobs/jobProcess.js +6 -2
- package/dist/server/jobs/jobProcess.js.map +1 -1
- package/dist/server/jobs/jobs.js +4 -1
- package/dist/server/jobs/jobs.js.map +1 -1
- package/dist/server/liveSubscriptionAuth.d.ts +26 -4
- package/dist/server/liveSubscriptionAuth.js +105 -39
- package/dist/server/liveSubscriptionAuth.js.map +1 -1
- package/dist/server/loadRootComponents.js +49 -10
- package/dist/server/loadRootComponents.js.map +1 -1
- package/dist/server/mqtt.d.ts +2 -0
- package/dist/server/mqtt.js +165 -30
- package/dist/server/mqtt.js.map +1 -1
- package/dist/server/nodeName.d.ts +2 -0
- package/dist/server/nodeName.js +107 -23
- package/dist/server/nodeName.js.map +1 -1
- package/dist/server/serverHelpers/Headers.d.ts +25 -0
- package/dist/server/serverHelpers/Headers.js +139 -1
- package/dist/server/serverHelpers/Headers.js.map +1 -1
- package/dist/server/serverHelpers/contentTypes.d.ts +9 -0
- package/dist/server/serverHelpers/contentTypes.js +32 -25
- package/dist/server/serverHelpers/contentTypes.js.map +1 -1
- package/dist/server/serverHelpers/deployValidationState.d.ts +3 -0
- package/dist/server/serverHelpers/deployValidationState.js +9 -19
- package/dist/server/serverHelpers/deployValidationState.js.map +1 -1
- package/dist/server/serverHelpers/operationAuthorizationState.d.ts +12 -0
- package/dist/server/serverHelpers/operationAuthorizationState.js +24 -2
- package/dist/server/serverHelpers/operationAuthorizationState.js.map +1 -1
- package/dist/server/serverHelpers/registeredOperations.d.ts +5 -4
- package/dist/server/serverHelpers/registeredOperations.js +74 -21
- package/dist/server/serverHelpers/registeredOperations.js.map +1 -1
- package/dist/server/serverHelpers/requestSanitization.d.ts +11 -0
- package/dist/server/serverHelpers/requestSanitization.js +20 -0
- package/dist/server/serverHelpers/requestSanitization.js.map +1 -0
- package/dist/server/serverHelpers/serverHandlers.js +6 -3
- package/dist/server/serverHelpers/serverHandlers.js.map +1 -1
- package/dist/server/serverHelpers/serverUtilities.d.ts +18 -0
- package/dist/server/serverHelpers/serverUtilities.js +90 -20
- package/dist/server/serverHelpers/serverUtilities.js.map +1 -1
- package/dist/server/serverHelpers/sharedMessageEncoding.d.ts +67 -0
- package/dist/server/serverHelpers/sharedMessageEncoding.js +280 -0
- package/dist/server/serverHelpers/sharedMessageEncoding.js.map +1 -0
- package/dist/server/serverHelpers/uwsServer.js +19 -1
- package/dist/server/serverHelpers/uwsServer.js.map +1 -1
- package/dist/server/static.js +24 -28
- package/dist/server/static.js.map +1 -1
- package/dist/server/storageReclamation.d.ts +12 -0
- package/dist/server/storageReclamation.js +26 -0
- package/dist/server/storageReclamation.js.map +1 -1
- package/dist/server/threads/itc.d.ts +7 -2
- package/dist/server/threads/itc.js +5 -1
- package/dist/server/threads/itc.js.map +1 -1
- package/dist/server/threads/manageThreads.d.ts +26 -3
- package/dist/server/threads/manageThreads.js +517 -65
- package/dist/server/threads/manageThreads.js.map +1 -1
- package/dist/server/threads/socketRouter.js +89 -26
- package/dist/server/threads/socketRouter.js.map +1 -1
- package/dist/server/threads/threadHeapMemory.d.ts +2 -0
- package/dist/server/threads/threadHeapMemory.js +31 -0
- package/dist/server/threads/threadHeapMemory.js.map +1 -0
- package/dist/server/threads/threadServer.js +46 -15
- package/dist/server/threads/threadServer.js.map +1 -1
- package/dist/sqlEngine/config.d.ts +1 -3
- package/dist/sqlEngine/config.js +19 -16
- package/dist/sqlEngine/config.js.map +1 -1
- package/dist/sqlTranslator/index.d.ts +1 -1
- package/dist/sqlTranslator/index.js +30 -7
- package/dist/sqlTranslator/index.js.map +1 -1
- package/dist/upgrade/directives/5-3-0.d.ts +7 -0
- package/dist/upgrade/directives/5-3-0.js +148 -0
- package/dist/upgrade/directives/5-3-0.js.map +1 -0
- package/dist/upgrade/directives/directivesController.js +2 -1
- package/dist/upgrade/directives/directivesController.js.map +1 -1
- package/dist/utility/OperationFunctionCaller.js +2 -1
- package/dist/utility/OperationFunctionCaller.js.map +1 -1
- package/dist/utility/common_utils.d.ts +16 -0
- package/dist/utility/common_utils.js +32 -6
- package/dist/utility/common_utils.js.map +1 -1
- package/dist/utility/componentNames.d.ts +8 -0
- package/dist/utility/componentNames.js +12 -1
- package/dist/utility/componentNames.js.map +1 -1
- package/dist/utility/environment/environmentManager.js +3 -6
- package/dist/utility/environment/environmentManager.js.map +1 -1
- package/dist/utility/environment/systemInformation.d.ts +1 -0
- package/dist/utility/environment/systemInformation.js +1 -0
- package/dist/utility/environment/systemInformation.js.map +1 -1
- package/dist/utility/errors/commonErrors.d.ts +2 -0
- package/dist/utility/errors/commonErrors.js +2 -0
- package/dist/utility/errors/commonErrors.js.map +1 -1
- package/dist/utility/errors/hdbError.d.ts +17 -0
- package/dist/utility/errors/hdbError.js +30 -1
- package/dist/utility/errors/hdbError.js.map +1 -1
- package/dist/utility/globalSchema.d.ts +18 -0
- package/dist/utility/hdbTerms.d.ts +16 -0
- package/dist/utility/hdbTerms.js +18 -2
- package/dist/utility/hdbTerms.js.map +1 -1
- package/dist/utility/logging/harper_logger.d.ts +2 -0
- package/dist/utility/logging/harper_logger.js +91 -14
- package/dist/utility/logging/harper_logger.js.map +1 -1
- package/dist/utility/logging/logRotator.js +76 -49
- package/dist/utility/logging/logRotator.js.map +1 -1
- package/dist/utility/nodeIdentity.d.ts +9 -0
- package/dist/utility/nodeIdentity.js +58 -0
- package/dist/utility/nodeIdentity.js.map +1 -0
- package/dist/utility/npmUtilities.js +9 -7
- package/dist/utility/npmUtilities.js.map +1 -1
- package/dist/utility/operationPermissions.d.ts +3 -1
- package/dist/utility/operationPermissions.js +16 -1
- package/dist/utility/operationPermissions.js.map +1 -1
- package/dist/utility/operation_authorization.d.ts +10 -7
- package/dist/utility/operation_authorization.js +212 -41
- package/dist/utility/operation_authorization.js.map +1 -1
- package/dist/utility/watchPath.d.ts +29 -0
- package/dist/utility/watchPath.js +68 -0
- package/dist/utility/watchPath.js.map +1 -0
- package/dist/utility/watcherFallback.d.ts +86 -0
- package/dist/utility/watcherFallback.js +278 -1
- package/dist/utility/watcherFallback.js.map +1 -1
- package/dist/validation/configValidator.d.ts +12 -0
- package/dist/validation/configValidator.js +199 -72
- package/dist/validation/configValidator.js.map +1 -1
- package/dist/validation/installValidator.js +12 -0
- package/dist/validation/installValidator.js.map +1 -1
- package/dist/validation/validationWrapper.d.ts +11 -0
- package/dist/validation/validationWrapper.js +16 -3
- package/dist/validation/validationWrapper.js.map +1 -1
- package/index.ts +2 -0
- package/json/systemSchema.json +52 -0
- package/npm-shrinkwrap.json +196 -194
- package/package.json +7 -6
- package/resources/DESIGN.md +114 -52
- package/resources/DatabaseTransaction.ts +521 -43
- package/resources/LMDBTransaction.ts +26 -4
- package/resources/PrimaryRocksDatabase.ts +28 -1
- package/resources/RecordEncoder.ts +103 -8
- package/resources/RequestTarget.ts +2 -0
- package/resources/Resource.ts +17 -9
- package/resources/ResourceInterface.ts +23 -0
- package/resources/RocksIndexStore.ts +30 -9
- package/resources/RocksTransactionLogStore.ts +78 -21
- package/resources/Table.ts +1110 -159
- package/resources/auditStore.ts +331 -73
- package/resources/blob.ts +1029 -110
- package/resources/branchDatabase.ts +941 -0
- package/resources/crdt.ts +76 -12
- package/resources/databases.ts +1310 -252
- package/resources/defineTable.ts +18 -2
- package/resources/graphql.ts +70 -16
- package/resources/indexes/HierarchicalNavigableSmallWorld.ts +6 -2
- package/resources/longLivedTransactions.ts +360 -0
- package/resources/models/backendRegistry.ts +84 -2
- package/resources/models/bootstrap.ts +473 -28
- package/resources/recordLock.ts +253 -0
- package/resources/replayLogs.ts +147 -26
- package/resources/replayLogsGuards.ts +171 -8
- package/resources/search.ts +154 -7
- package/resources/transactionBroadcast.ts +3 -3
- package/security/auth.ts +68 -29
- package/security/authn/oidc/claims.ts +72 -0
- package/security/authn/oidc/identityToken.ts +129 -0
- package/security/authn/oidc/jwks.ts +260 -0
- package/security/authn/oidc/providers/generic.ts +40 -0
- package/security/authn/oidc/providers/githubActions.ts +137 -0
- package/security/authn/oidc/providers/index.ts +52 -0
- package/security/authn/oidc/tokenExchange.ts +300 -0
- package/security/authn/oidc/trustPolicyOperations.ts +343 -0
- package/security/authn/oidc/types.ts +41 -0
- package/security/certificateVerification/index.ts +54 -13
- package/security/certificateVerification/trustedIssuers.ts +76 -0
- package/security/certificateVerification/types.ts +1 -0
- package/security/credentialProvenance.ts +47 -0
- package/security/credentialRejection.ts +22 -0
- package/security/deferredAuthentication.ts +71 -0
- package/security/impersonation.ts +117 -12
- package/security/jsLoader.ts +81 -18
- package/security/keys.ts +298 -72
- package/security/operationScope.ts +33 -0
- package/security/permissionsTranslator.js +23 -0
- package/security/tokenAuthentication.ts +233 -12
- package/security/user.ts +4 -3
- package/server/DESIGN.md +183 -16
- package/server/DurableSubscriptionsSession.ts +71 -11
- package/server/REST.ts +79 -1
- package/server/graphqlQuerying.ts +4 -0
- package/server/http.ts +99 -18
- package/server/itc/serverHandlers.js +8 -1
- package/server/jobs/jobProcess.ts +8 -2
- package/server/jobs/jobs.ts +4 -1
- package/server/liveSubscriptionAuth.ts +129 -46
- package/server/loadRootComponents.js +50 -8
- package/server/mqtt.ts +179 -38
- package/server/nodeName.ts +103 -21
- package/server/serverHelpers/Headers.ts +131 -0
- package/server/serverHelpers/contentTypes.ts +29 -21
- package/server/serverHelpers/deployValidationState.ts +24 -13
- package/server/serverHelpers/operationAuthorizationState.ts +34 -3
- package/server/serverHelpers/registeredOperations.ts +79 -22
- package/server/serverHelpers/requestSanitization.ts +15 -0
- package/server/serverHelpers/serverHandlers.js +6 -3
- package/server/serverHelpers/serverUtilities.ts +104 -31
- package/server/serverHelpers/sharedMessageEncoding.ts +307 -0
- package/server/serverHelpers/uwsServer.ts +17 -2
- package/server/static.ts +23 -29
- package/server/storageReclamation.ts +23 -0
- package/server/threads/itc.js +11 -1
- package/server/threads/manageThreads.js +526 -56
- package/server/threads/socketRouter.ts +81 -26
- package/server/threads/threadHeapMemory.ts +26 -0
- package/server/threads/threadServer.js +43 -15
- package/sqlTranslator/index.ts +31 -8
- package/studio/web/assets/Chat-BnCBegQz.js +2267 -0
- package/studio/web/assets/FloatingChat-CoDW1ySS.js +23 -0
- package/studio/web/assets/{abnfDiagram-VCTEODGH-C0_BAZyO.js → abnfDiagram-VCTEODGH-B0BebmD2.js} +1 -1
- package/studio/web/assets/{alertDialog-DIHt7Z0r.js → alertDialog-CQyAJJhl.js} +1 -1
- package/studio/web/assets/{apiToken-c3Rd-w6g.js → apiToken-Bwk5BLXW.js} +1 -1
- package/studio/web/assets/applications-DHxGi7JH.js +296 -0
- package/studio/web/assets/architecture-7GRP2DOG-LB-MLAAb.js +1 -0
- package/studio/web/assets/{architectureDiagram-5GKGNRK7-BWzrASgm.js → architectureDiagram-5GKGNRK7-7SW3GD-K.js} +1 -1
- package/studio/web/assets/authStore-C3Nfubqr.js +3 -0
- package/studio/web/assets/{blockDiagram-NRAW4CY4-BdJX9Khj.js → blockDiagram-I7D4REHJ-BqguiadH.js} +2 -2
- package/studio/web/assets/{button-DhiX-njv.js → button-BIsUKRZq.js} +2 -2
- package/studio/web/assets/{c4Diagram-UCG6FXSJ-CI6MzGmQ.js → c4Diagram-7LVT6UL2-LBNf8t_X.js} +1 -1
- package/studio/web/assets/channel-yictG-U-.js +1 -0
- package/studio/web/assets/{chevron-up-Df2c8uoU.js → chevron-up-DtKGqDn3.js} +1 -1
- package/studio/web/assets/{chunk-TEH6E4GO-P87k5mNi.js → chunk-4HAMMTFA-DWtTut21.js} +1 -1
- package/studio/web/assets/{chunk-75Z2AOVW-BT8tVmks.js → chunk-75Z2AOVW-QGQD6th2.js} +1 -1
- package/studio/web/assets/{chunk-DU6HZSFF-9kAOOmI6.js → chunk-DU6HZSFF-Chq20Ba5.js} +1 -1
- package/studio/web/assets/{chunk-F27PBJKO-BW7ao8AY.js → chunk-F27PBJKO-BVA5EPhV.js} +1 -1
- package/studio/web/assets/{chunk-GMAD6QVW-BNyXpoQO.js → chunk-GMAD6QVW-BeS7S07A.js} +1 -1
- package/studio/web/assets/{chunk-OBVCFTLP-D4wWOqDQ.js → chunk-GVQU2GXP-sbwVIQ8i.js} +1 -1
- package/studio/web/assets/{chunk-G27WJ6UU-COyLMcgK.js → chunk-IMKFNOWR-Bnh3tAVd.js} +1 -1
- package/studio/web/assets/{chunk-JQ64N6SF-Cyz1IeLf.js → chunk-L3NEJ4N5-COfUyKII.js} +1 -1
- package/studio/web/assets/chunk-OSK3NFVY-ByciRftO.js +10 -0
- package/studio/web/assets/{chunk-P2QGCYS3-DmIFY4d7.js → chunk-P2QGCYS3-CP1VhG_c.js} +1 -1
- package/studio/web/assets/{chunk-POPQ4Y6H-BPrvMyKz.js → chunk-POPQ4Y6H-ClWhhkwW.js} +1 -1
- package/studio/web/assets/{chunk-PWAF6VOD-2zB6IW9i.js → chunk-PWAF6VOD-1z1THyS5.js} +1 -1
- package/studio/web/assets/{chunk-RHFEMEQ7-2FgyI8YU.js → chunk-SHT3W25Y-LpQkMsah.js} +2 -2
- package/studio/web/assets/{chunk-SVP7TREG-FwtbH2QC.js → chunk-SVP7TREG-jtdAHw0S.js} +1 -1
- package/studio/web/assets/{chunk-LCL6LL3I-HOzK_ppE.js → chunk-TICWLB2K-VOwzetX-.js} +1 -1
- package/studio/web/assets/classDiagram-ZZMXUADV-VaEwSy_g.js +1 -0
- package/studio/web/assets/classDiagram-v2-VYDZK3BY-VaEwSy_g.js +1 -0
- package/studio/web/assets/{createLucideIcon-BKGPfjm2.js → createLucideIcon-CzW9508A.js} +1 -1
- package/studio/web/assets/{cssMode-CEN2mzSA.js → cssMode-s0cWI-_M.js} +1 -1
- package/studio/web/assets/{cynefin-OW5HDTMX-BRkpLFQV.js → cynefin-OW5HDTMX-BbdbCvub.js} +1 -1
- package/studio/web/assets/{cynefinDiagram-5FMLGOSQ-CHT1DaX6.js → cynefinDiagram-5FMLGOSQ-TP-aIqbt.js} +1 -1
- package/studio/web/assets/{dagre-3AP2YEHR-DpUXBh63.js → dagre-GXQ25YYZ-DShnGpGo.js} +1 -1
- package/studio/web/assets/{diagram-S7CK7UJ4-BuymVFZT.js → diagram-S7CK7UJ4-aoCVTtcy.js} +1 -1
- package/studio/web/assets/{diagram-UQ7AKVKN-CyP148RM.js → diagram-UQ7AKVKN-DglXtQ6x.js} +1 -1
- package/studio/web/assets/{diagram-VSXAHHWV-CoCAg3M9.js → diagram-VSXAHHWV-fhEdmkwM.js} +1 -1
- package/studio/web/assets/{diagram-VX7I27RA-BpOqCFca.js → diagram-VX7I27RA-DccVJet6.js} +1 -1
- package/studio/web/assets/{diagram-Z3DM3KII-Bfpw7Vbj.js → diagram-Z3DM3KII-D-RyJJb7.js} +1 -1
- package/studio/web/assets/{dialog-CBf0Mr1d.js → dialog-Cn2uWgD4.js} +1 -1
- package/studio/web/assets/{dist-lkA3O3eM.js → dist-DP8UjMB_.js} +1 -1
- package/studio/web/assets/{download-BtTOBem-.js → download-B5T5r7ss.js} +1 -1
- package/studio/web/assets/{ebnfDiagram-PWID7BFC-DS_6aWqL.js → ebnfDiagram-PWID7BFC-DJGpIpz_.js} +1 -1
- package/studio/web/assets/{editor-D8oDeCTL.js → editor-DNcRHK54.js} +1 -1
- package/studio/web/assets/{erDiagram-SSCWMZ5O-DJNk6Fgw.js → erDiagram-RLTQ6QDP-CIfNlgkC.js} +1 -1
- package/studio/web/assets/eventmodeling-NTZA5JFV-CLxnp2CR.js +1 -0
- package/studio/web/assets/flowDiagram-HODETNUW-BIbhmz9f.js +1 -0
- package/studio/web/assets/{ganttDiagram-EL5Y4UJY-2pOExxMY.js → ganttDiagram-EL5Y4UJY-BxToTzzD.js} +1 -1
- package/studio/web/assets/{getAnalytics-D4LKGeVy.js → getAnalytics-GHK8ORfM.js} +1 -1
- package/studio/web/assets/{gitGraph-4MIJSDKK-CH5ZxwzF.js → gitGraph-4MIJSDKK-D2s2w8lE.js} +1 -1
- package/studio/web/assets/{gitGraphDiagram-WWUBYQGX-DVIsIhbO.js → gitGraphDiagram-WWUBYQGX-Dwntd4-x.js} +1 -1
- package/studio/web/assets/{html-u3vOg7LJ.js → html-Bdssedlg.js} +1 -1
- package/studio/web/assets/{htmlMode-DyO31v-P.js → htmlMode-CoDlJ3fw.js} +1 -1
- package/studio/web/assets/{index-Cxj2_wsl.css → index-7RMEgVG1.css} +1 -1
- package/studio/web/assets/index-D6sxmFLR.js +824 -0
- package/studio/web/assets/index.lazy-tmU5BS8s.js +2 -0
- package/studio/web/assets/{info-A6RAGUB7-CPQfTnaG.js → info-A6RAGUB7-DYjkvb0C.js} +1 -1
- package/studio/web/assets/{infoDiagram-RXCK75RN-DlwLYlwm.js → infoDiagram-27XIBGKW-Bnp1FJE5.js} +1 -1
- package/studio/web/assets/{ishikawaDiagram-5VMMS53U-BRXRp29U.js → ishikawaDiagram-5VMMS53U-D9Xh2r6X.js} +1 -1
- package/studio/web/assets/{javascript-CUvxOyTC.js → javascript-B8meVSTH.js} +1 -1
- package/studio/web/assets/{journeyDiagram-EYS64GPL-B0ou8k0n.js → journeyDiagram-3NMN7TZE-CokIi6ll.js} +2 -2
- package/studio/web/assets/{jsonMode-f_IwbF3D.js → jsonMode-DpIPd35T.js} +1 -1
- package/studio/web/assets/{kanban-definition-3QL26DDD-uYg7iYzp.js → kanban-definition-UXKFOSKX-CukSFJfX.js} +1 -1
- package/studio/web/assets/{languageServices-DXtZ6rEF.js → languageServices-C_5FMJzQ.js} +1 -1
- package/studio/web/assets/{lspLanguageFeatures-B4pCF1zO.js → lspLanguageFeatures-BIzNBzPK.js} +1 -1
- package/studio/web/assets/{mermaid-parser.core-Ck-fC8b7.js → mermaid-parser.core-BlEsOWNO.js} +3 -3
- package/studio/web/assets/{mermaid.core-CP8aNNYm.js → mermaid.core-BlkGaMIH.js} +5 -5
- package/studio/web/assets/{mindmap-definition-FBJOCRG2-CgTZ-rit.js → mindmap-definition-YA3MSWOX-IprMc_0j.js} +1 -1
- package/studio/web/assets/{notifications-D3tIQ4sg.js → notifications-CQf18QKb.js} +1 -1
- package/studio/web/assets/notifications-CvZivSbh.js +1 -0
- package/studio/web/assets/{packet-AYTQ26CC-DEyoPtPb.js → packet-AYTQ26CC-Bi3V04Zi.js} +1 -1
- package/studio/web/assets/{pegDiagram-XKGWAZYB-DrD-7sD9.js → pegDiagram-XKGWAZYB-BNuPDLZY.js} +1 -1
- package/studio/web/assets/{pie-WAS4IAKB-wjj-EI1d.js → pie-WAS4IAKB-_6DoDbng.js} +1 -1
- package/studio/web/assets/{pieDiagram-E7YTZNPT-GntqDCzv.js → pieDiagram-E7YTZNPT-DqNb6Ht2.js} +1 -1
- package/studio/web/assets/{profile-DZWU7MgT.js → profile-DdOwtntb.js} +1 -1
- package/studio/web/assets/{quadrantDiagram-AXDQQJYC-0UeqXQGd.js → quadrantDiagram-AXDQQJYC-BGH9E2YR.js} +1 -1
- package/studio/web/assets/{radar-RG4KPBEZ-DFSA5h7k.js → radar-RG4KPBEZ-DDdVczcL.js} +1 -1
- package/studio/web/assets/{railroad-74A4TZTK-CaOUG9wR.js → railroad-74A4TZTK-BJUP4Jds.js} +1 -1
- package/studio/web/assets/railroad-abnf-HS5TGJTU-Bm3L1L0h.js +1 -0
- package/studio/web/assets/railroad-ebnf-LZEXJU2U-CKzLGlkw.js +1 -0
- package/studio/web/assets/railroad-peg-WCYAUIDC-S8xLjslx.js +1 -0
- package/studio/web/assets/{railroadDiagram-O6MQD6OU-yHUELZaV.js → railroadDiagram-O6MQD6OU-DGTPh2KZ.js} +1 -1
- package/studio/web/assets/{regions-CkyurXzE.js → regions-n69fwagr.js} +1 -1
- package/studio/web/assets/{register-BUyhWjBO.js → register-PfWTCXWB.js} +3 -3
- package/studio/web/assets/{requirementDiagram-EFPCY7ZU-DNEGFjuW.js → requirementDiagram-BXWQKSXE-BJnO6uLz.js} +1 -1
- package/studio/web/assets/{sankeyDiagram-P5KCCOFB-DpyAmSVR.js → sankeyDiagram-P5KCCOFB-0vSOdymH.js} +1 -1
- package/studio/web/assets/{sequenceDiagram-WJ2MYXX4-TyaT7xNk.js → sequenceDiagram-WJ2MYXX4-hETizDWE.js} +1 -1
- package/studio/web/assets/{setComponentFile-CeyKSZAa.js → setComponentFile-Bg6O7X0S.js} +1 -1
- package/studio/web/assets/{setup-D2kn7cAA.js → setup-CUx_aUDl.js} +2 -2
- package/studio/web/assets/{stateDiagram-HBIQ2CUA-CeEdTArZ.js → stateDiagram-D77RDMKH-CdYQ_KtC.js} +1 -1
- package/studio/web/assets/stateDiagram-v2-MP3YSRHH-CdKuzQMT.js +1 -0
- package/studio/web/assets/status-D7BVKqX9.js +61 -0
- package/studio/web/assets/{swimlanes-XN3QIQJK-B54FmF46.js → swimlanes-42K2YHIH-B8cHIpU4.js} +1 -1
- package/studio/web/assets/swimlanesDiagram-VR7AAH4N-DmOSJwaH.js +8 -0
- package/studio/web/assets/{tabs-B_G5zscN.js → tabs-BrHu7gJi.js} +1 -1
- package/studio/web/assets/{timeline-definition-24CTP7MA-D-a9ujbo.js → timeline-definition-24CTP7MA-BJWYSXqF.js} +1 -1
- package/studio/web/assets/{toggleHighContrast-C0UW6rI2.js → toggleHighContrast-DBSyXzMr.js} +1 -1
- package/studio/web/assets/{treeView-Q6P3EWNA-CrW_6JnS.js → treeView-Q6P3EWNA-qxe_v6CQ.js} +1 -1
- package/studio/web/assets/{treemap-WGGIJYW6-BxyYLdP_.js → treemap-WGGIJYW6-dDo97XXF.js} +1 -1
- package/studio/web/assets/{tsMode-DBC0zmDx.js → tsMode-BByKCjBS.js} +1 -1
- package/studio/web/assets/{typescript-DApRQir3.js → typescript-DDLnLpw9.js} +1 -1
- package/studio/web/assets/{useEntityRestURL-DB6JStU1.js → useEntityRestURL-31CHGaHk.js} +1 -1
- package/studio/web/assets/{useLocalStorage-Dtj1QS8_.js → useLocalStorage-BqMR3D8_.js} +1 -1
- package/studio/web/assets/vendor-core-c2JRRJpV.js +58 -0
- package/studio/web/assets/vendor-datadog-CLUcJXOo.js +6 -0
- package/studio/web/assets/{vendor-react-Dyj4O3HE.js → vendor-react-CJV_K1u4.js} +1 -1
- package/studio/web/assets/vendor-tanstack-DxzraizX.js +1 -0
- package/studio/web/assets/{vendor-ui-vhu-UHhF.js → vendor-ui-BUjK0h8a.js} +2 -2
- package/studio/web/assets/{vennDiagram-4TSXK5OY-Cy7s7Mpy.js → vennDiagram-4TSXK5OY-A3i-lCdl.js} +1 -1
- package/studio/web/assets/{wardley-WFR3VGLG-BeBL35g2.js → wardley-WFR3VGLG-B0ik-_6g.js} +1 -1
- package/studio/web/assets/{wardleyDiagram-VM6X3IG4-BylmIGSg.js → wardleyDiagram-VM6X3IG4-CjrkKWUR.js} +1 -1
- package/studio/web/assets/{workers-C0bFIedw.js → workers-pR3jRY9D.js} +1 -1
- package/studio/web/assets/x-DIzaLEdK.js +1 -0
- package/studio/web/assets/{xml-HWd01lU-.js → xml-2iRnMhQO.js} +1 -1
- package/studio/web/assets/{xychartDiagram-S5SC5T6Z-CoKALMXr.js → xychartDiagram-S5SC5T6Z-Biok4GYV.js} +1 -1
- package/studio/web/assets/{yaml-CIH0Nt-h.js → yaml-Bf92gJpd.js} +1 -1
- package/studio/web/index.html +14 -14
- package/upgrade/directives/5-3-0.ts +132 -0
- package/upgrade/directives/directivesController.ts +2 -1
- package/utility/OperationFunctionCaller.ts +2 -1
- package/utility/common_utils.ts +30 -5
- package/utility/componentNames.ts +12 -0
- package/utility/environment/environmentManager.ts +3 -7
- package/utility/environment/systemInformation.ts +7 -0
- package/utility/errors/commonErrors.ts +4 -0
- package/utility/errors/hdbError.ts +29 -0
- package/utility/hdbTerms.ts +17 -0
- package/utility/logging/harper_logger.ts +87 -14
- package/utility/logging/logRotator.ts +72 -45
- package/utility/nodeIdentity.ts +45 -0
- package/utility/npmUtilities.ts +10 -8
- package/utility/operationPermissions.ts +18 -1
- package/utility/operation_authorization.ts +231 -42
- package/utility/watchPath.ts +63 -0
- package/utility/watcherFallback.ts +270 -0
- package/validation/configValidator.ts +209 -72
- package/validation/installValidator.ts +15 -0
- package/validation/validationWrapper.ts +18 -4
- package/studio/web/assets/Chat-JpO8EtUu.js +0 -2067
- package/studio/web/assets/FloatingChat-Bcj3xSZu.js +0 -23
- package/studio/web/assets/applications-ByqLRKyZ.js +0 -296
- package/studio/web/assets/architecture-7GRP2DOG-DNdx5tEU.js +0 -1
- package/studio/web/assets/authStore-qKmCZcaf.js +0 -3
- package/studio/web/assets/channel-DtCV8PTL.js +0 -1
- package/studio/web/assets/chunk-R7TYR2AO-Irip67yr.js +0 -10
- package/studio/web/assets/classDiagram-DTDB5LWJ-DbO_dCNE.js +0 -1
- package/studio/web/assets/classDiagram-v2-JRS7N3AN-DbO_dCNE.js +0 -1
- package/studio/web/assets/eventmodeling-NTZA5JFV-5jbe4A5P.js +0 -1
- package/studio/web/assets/flowDiagram-A5DVABFB-Dp9Ezlow.js +0 -1
- package/studio/web/assets/index-aSt5tY-L.js +0 -824
- package/studio/web/assets/index.lazy-B9jiPwT8.js +0 -2
- package/studio/web/assets/notifications-CUoYgU98.js +0 -1
- package/studio/web/assets/railroad-abnf-HS5TGJTU-Bc0Qi0WH.js +0 -1
- package/studio/web/assets/railroad-ebnf-LZEXJU2U-G8rVVZ2C.js +0 -1
- package/studio/web/assets/railroad-peg-WCYAUIDC-CrehKBhC.js +0 -1
- package/studio/web/assets/stateDiagram-v2-4QOOHH4V-D4tuw9Su.js +0 -1
- package/studio/web/assets/status-D7Xn5ePA.js +0 -61
- package/studio/web/assets/swimlanesDiagram-VK2B7HYN-XOhmNEvq.js +0 -8
- package/studio/web/assets/vendor-core-RCcadM3e.js +0 -73
- package/studio/web/assets/vendor-datadog-BRv-mOv1.js +0 -6
- package/studio/web/assets/vendor-tanstack-BiFWSB3W.js +0 -1
- package/studio/web/assets/x-B9o9hsep.js +0 -1
- /package/studio/web/assets/{sizeCapture-X5ZJPWSS-B0uUizjq.js → sizeCapture-INFHLROL-B0uUizjq.js} +0 -0
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
DatabaseTransaction,
|
|
3
|
+
shouldSpareCommitPhase,
|
|
3
4
|
transactionOpenTooLongError,
|
|
4
5
|
type CommitOptions,
|
|
5
6
|
type TransactionWrite,
|
|
6
7
|
type CommitResolution,
|
|
7
8
|
} from './DatabaseTransaction';
|
|
8
9
|
import { cleanupUnusedBlobs, collectRetainedFileIds } from './blob.ts';
|
|
10
|
+
import { ServerError } from '../utility/errors/hdbError.ts';
|
|
9
11
|
import { getNextMonotonicTime } from '../utility/lmdb/commonUtility.ts';
|
|
10
12
|
import * as harperLogger from '../utility/logging/harper_logger.ts';
|
|
11
13
|
import type { Context } from './ResourceInterface.ts';
|
|
@@ -38,7 +40,7 @@ export class LMDBTransaction extends DatabaseTransaction {
|
|
|
38
40
|
getReadTxn(): any {
|
|
39
41
|
// used optimistically
|
|
40
42
|
this.readTxnRefCount = (this.readTxnRefCount || 0) + 1;
|
|
41
|
-
this.timeout = txnExpiration; // reset the timeout
|
|
43
|
+
this.timeout = Math.max(txnExpiration, this.timeoutBudget ?? 0); // reset the timeout
|
|
42
44
|
if (this.stale) this.stale = false;
|
|
43
45
|
if (this.readTxn) {
|
|
44
46
|
if ((this.readTxn as any).openTimer) (this.readTxn as any).openTimer = 0;
|
|
@@ -153,6 +155,9 @@ export class LMDBTransaction extends DatabaseTransaction {
|
|
|
153
155
|
// source writes will finish (with right to refuse/abort) before proceeeding to less
|
|
154
156
|
// canonical sources.
|
|
155
157
|
if (hasBefore) {
|
|
158
|
+
// see `committing` in DatabaseTransaction (issue #2062)
|
|
159
|
+
this.setCommitPhase(true);
|
|
160
|
+
const stagedWrites = this.writes.length;
|
|
156
161
|
return (async () => {
|
|
157
162
|
try {
|
|
158
163
|
for (let phase = 0; phase < 2; phase++) {
|
|
@@ -172,9 +177,15 @@ export class LMDBTransaction extends DatabaseTransaction {
|
|
|
172
177
|
if (completion) await (completion.push ? Promise.all(completion) : completion);
|
|
173
178
|
}
|
|
174
179
|
} catch (error) {
|
|
180
|
+
this.setCommitPhase(false);
|
|
175
181
|
this.abort();
|
|
176
182
|
throw error;
|
|
177
183
|
}
|
|
184
|
+
this.setCommitPhase(false);
|
|
185
|
+
// aborted underneath us while parked above — see DatabaseTransaction's twin guard
|
|
186
|
+
if (this.timedOut) throw transactionOpenTooLongError();
|
|
187
|
+
if (stagedWrites > 0 && this.writes.length === 0 && this.open === TRANSACTION_STATE.CLOSED)
|
|
188
|
+
throw new ServerError('Transaction was aborted while its commit was waiting on pre-commit work', 500);
|
|
178
189
|
return this.commit(options);
|
|
179
190
|
})();
|
|
180
191
|
}
|
|
@@ -372,10 +383,21 @@ let timer;
|
|
|
372
383
|
|
|
373
384
|
function startMonitoringTxns() {
|
|
374
385
|
timer = setInterval(function () {
|
|
386
|
+
const checkedCommitPhaseChains = new Set<DatabaseTransaction>();
|
|
375
387
|
for (const txn of trackedTxns) {
|
|
388
|
+
const commitChainHead = txn.commitChainHead ?? txn;
|
|
376
389
|
if (txn.timeout <= 0) {
|
|
377
390
|
const url = (txn.getContext() as any)?.url;
|
|
378
|
-
if (
|
|
391
|
+
if (shouldSpareCommitPhase(txn, checkedCommitPhaseChains)) {
|
|
392
|
+
// see DatabaseTransaction's monitor (issue #2062)
|
|
393
|
+
harperLogger.warn?.(
|
|
394
|
+
`Transaction has been in its commit phase past the open-transaction limit, waiting on pre-commit work (e.g. a large blob write); letting it complete, from table: ${
|
|
395
|
+
(txn.db as any)?.name + (url ? ' path: ' + url : '')
|
|
396
|
+
}`,
|
|
397
|
+
...(txn.startedFrom ? [`was started from ${txn.startedFrom.resourceName}.${txn.startedFrom.method}`] : [])
|
|
398
|
+
);
|
|
399
|
+
txn.timeout = Math.max(txnExpiration, txn.timeoutBudget ?? 0);
|
|
400
|
+
} else if (txn.hasPendingWrites() && !txn.sourceApply && !txn.isReplay) {
|
|
379
401
|
// Abort and surface an error rather than force-committing a partial write set: silently
|
|
380
402
|
// committing on the application's behalf breaks atomicity and can leave orphaned
|
|
381
403
|
// secondary-index entries that only a full index rebuild repairs (issue #1407). The app
|
|
@@ -390,7 +412,7 @@ function startMonitoringTxns() {
|
|
|
390
412
|
}`
|
|
391
413
|
);
|
|
392
414
|
try {
|
|
393
|
-
|
|
415
|
+
commitChainHead.abortDueToTimeout();
|
|
394
416
|
} catch (error) {
|
|
395
417
|
harperLogger.debug?.(`Error aborting timed out transaction: ${error.message}`);
|
|
396
418
|
}
|
|
@@ -408,7 +430,7 @@ function startMonitoringTxns() {
|
|
|
408
430
|
} catch (error) {
|
|
409
431
|
harperLogger.debug?.(`Error committing timed out transaction: ${error.message}`);
|
|
410
432
|
}
|
|
411
|
-
txn.timeout = txnExpiration;
|
|
433
|
+
txn.timeout = Math.max(txnExpiration, txn.timeoutBudget ?? 0);
|
|
412
434
|
}
|
|
413
435
|
} else {
|
|
414
436
|
txn.timeout -= txnExpiration;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { RocksDatabase, type RocksDatabaseOptions, constants, type Store } from '@harperfast/rocksdb-js';
|
|
1
|
+
import { RocksDatabase, type RocksDatabaseOptions, constants, type Store, Transaction } from '@harperfast/rocksdb-js';
|
|
2
2
|
|
|
3
3
|
const FRESH_VERSION_FLAG = constants.FRESH_VERSION_FLAG;
|
|
4
4
|
import { WeakLRUCache } from 'weak-lru-cache';
|
|
@@ -41,6 +41,33 @@ export class PrimaryRocksDatabase extends RocksDatabase {
|
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
+
// Match LMDB's remove(key, version) contract without splitting the version check from the delete.
|
|
45
|
+
async removeIfVersion(id: any, version: number): Promise<boolean> {
|
|
46
|
+
let retried = false;
|
|
47
|
+
while (true) {
|
|
48
|
+
let transaction: Transaction | undefined;
|
|
49
|
+
try {
|
|
50
|
+
transaction = new Transaction(this.store);
|
|
51
|
+
const entry = this.#processEntry(super.getSync(id, { transaction }), id);
|
|
52
|
+
if (!entry || entry.version !== version) {
|
|
53
|
+
transaction.abort();
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
this.#cache?.delete(id);
|
|
57
|
+
super.removeSync(id, { transaction });
|
|
58
|
+
await transaction.commit();
|
|
59
|
+
return true;
|
|
60
|
+
} catch (error: any) {
|
|
61
|
+
try {
|
|
62
|
+
transaction?.abort();
|
|
63
|
+
} catch {}
|
|
64
|
+
// rocksdb-js reports a writer that committed between our read and our commit as ERR_BUSY
|
|
65
|
+
if (retried || error?.code !== 'ERR_BUSY') throw error;
|
|
66
|
+
retried = true;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
44
71
|
/**
|
|
45
72
|
* Initialises encoder/decoder state. Must be called once after open() with the root
|
|
46
73
|
* RocksDatabase. Equivalent to the RocksDB branch of handleLocalTimeForGets, but as
|
|
@@ -42,6 +42,33 @@ const StructonEncoder = createStructon(Encoder) as typeof Encoder;
|
|
|
42
42
|
// monitoring; the store name is passed as the metric path.
|
|
43
43
|
const MISSING_STRUCTURE_METRIC = 'decode-missing-structure';
|
|
44
44
|
|
|
45
|
+
// Reaching this bound is not an error: novel shapes fall back to plain msgpackr encoding, which
|
|
46
|
+
// round-trips correctly but gives up random-access field reads.
|
|
47
|
+
export const DEFAULT_MAX_TYPED_STRUCTURES = 256;
|
|
48
|
+
|
|
49
|
+
export interface StructureCounts {
|
|
50
|
+
typed: number;
|
|
51
|
+
classic: number;
|
|
52
|
+
typedLimit: number;
|
|
53
|
+
typedEnabled: boolean;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Mirrors structon's onLoadedStructures over the four durable payload shapes it accepts. The
|
|
57
|
+
// bare-array and cbor-x forms carry named structures only; structon keeps the encoder's own typed
|
|
58
|
+
// dictionary for them, and they are written by the capped fallback path (msgpackr's base save
|
|
59
|
+
// overwriting the combined payload, before structon's best-effort re-save). That window is by
|
|
60
|
+
// definition a saturated store, so reporting zero there would show an empty dictionary at the one
|
|
61
|
+
// moment the count matters most.
|
|
62
|
+
function countDurableStructures(sharedData: any, localTyped: number): { typed: number; classic: number } {
|
|
63
|
+
if (!sharedData) return { typed: 0, classic: 0 };
|
|
64
|
+
if (sharedData instanceof Map)
|
|
65
|
+
return { typed: sharedData.get('typed')?.length ?? 0, classic: sharedData.get('named')?.length ?? 0 };
|
|
66
|
+
if (Array.isArray(sharedData)) return { typed: localTyped, classic: sharedData.length };
|
|
67
|
+
if (!sharedData.named && !sharedData.typed && Array.isArray(sharedData.structures))
|
|
68
|
+
return { typed: localTyped, classic: sharedData.structures.length };
|
|
69
|
+
return { typed: sharedData.typed?.length ?? 0, classic: sharedData.named?.length ?? 0 };
|
|
70
|
+
}
|
|
71
|
+
|
|
45
72
|
// Terminal error messages msgpackr/structon throw when a record references a shared structure that
|
|
46
73
|
// is not in this node's structures buffer. Both the typed (random-access) path (structon's
|
|
47
74
|
// readStruct) and the classic path (msgpackr's createSecondByteReader) reload the structures from
|
|
@@ -77,6 +104,8 @@ export type Entry = {
|
|
|
77
104
|
export const TIMESTAMP_PLACEHOLDER = new Uint8Array([1, 1, 1, 1, 4, 0x40, 0, 0]);
|
|
78
105
|
// the first byte here indicates that we use the last timestamp
|
|
79
106
|
export const LAST_TIMESTAMP_PLACEHOLDER = new Uint8Array([1, 1, 1, 1, 1, 0, 0, 0]);
|
|
107
|
+
// Never write this into an audit entry value: the substitution resolves to 2.0 when no previous time
|
|
108
|
+
// was recorded, and the audit format reads a leading byte other than 0x42 as "no field here". See harper#2247.
|
|
80
109
|
export const PREVIOUS_TIMESTAMP_PLACEHOLDER = new Uint8Array([1, 1, 1, 1, 3, 0x40, 0, 0]);
|
|
81
110
|
export const NEW_TIMESTAMP_PLACEHOLDER = new Uint8Array([1, 1, 1, 1, 0, 0x40, 0, 0]);
|
|
82
111
|
export const LOCAL_TIMESTAMP = Symbol('local-timestamp');
|
|
@@ -95,6 +124,7 @@ export const HAS_NODE_ID = 64;
|
|
|
95
124
|
export const PENDING_LOCAL_TIME = 1;
|
|
96
125
|
export const HAS_STRUCTURE_UPDATE = 0x100;
|
|
97
126
|
export const HAS_ADDITIONAL_AUDIT_REFS = 0x80;
|
|
127
|
+
export const VERSION_NOT_UNIQUE_FLAG = 0x10000;
|
|
98
128
|
|
|
99
129
|
const TRACKED_WRITE_TYPES = new Set(['put', 'patch', 'delete', 'message', 'publish']);
|
|
100
130
|
// For now we use this as the private property mechanism for mapping records to entries.
|
|
@@ -197,6 +227,10 @@ export class RecordEncoder extends StructonEncoder {
|
|
|
197
227
|
declare saveStructures: any;
|
|
198
228
|
declare getStructures: any;
|
|
199
229
|
declare _writeStruct: any;
|
|
230
|
+
declare typedStructs: any[];
|
|
231
|
+
declare structures: any[];
|
|
232
|
+
declare maxOwnStructures: number;
|
|
233
|
+
randomAccessStructure = false;
|
|
200
234
|
structureUpdate?: any;
|
|
201
235
|
// Set by TableResource.updatedAttributes. Undefined for a store with no resolved attributes, which
|
|
202
236
|
// is what keeps the projection off that store's writes entirely.
|
|
@@ -217,7 +251,7 @@ export class RecordEncoder extends StructonEncoder {
|
|
|
217
251
|
// Bound the per-encoder typed-structure dictionary. It is append-only and pinned on the
|
|
218
252
|
// long-lived primary store, so a wide/sparse schema (whose records vary by per-field value
|
|
219
253
|
// width) can grow it unbounded and exhaust memory. Caller-overridable; default caps it.
|
|
220
|
-
options.maxOwnStructures ??=
|
|
254
|
+
options.maxOwnStructures ??= DEFAULT_MAX_TYPED_STRUCTURES;
|
|
221
255
|
/**
|
|
222
256
|
* The base class for records that provides the read-only methods for accessing
|
|
223
257
|
* metadata and will be assigned computed property getters. On its own, these instances
|
|
@@ -233,6 +267,7 @@ export class RecordEncoder extends StructonEncoder {
|
|
|
233
267
|
// (e.g. __dbis__, useVersions=false) must not — see the encode hook + harper#1307. Default to
|
|
234
268
|
// true when unspecified so an option that doesn't propagate can't silently strip prefixes.
|
|
235
269
|
this.useVersions = options.useVersions !== false;
|
|
270
|
+
this.randomAccessStructure = options.randomAccessStructure === true;
|
|
236
271
|
// structon (the StructonEncoder base) always installs the struct write hook. For DBIs
|
|
237
272
|
// that don't opt into struct mode (non-primary, e.g. __dbis__), force it to bail (return
|
|
238
273
|
// 0) so objects are written in plain msgpackr records mode — decodable by readers without
|
|
@@ -417,12 +452,14 @@ export class RecordEncoder extends StructonEncoder {
|
|
|
417
452
|
// HAS_STRUCTURE_UPDATE in the audit log for a structure that was never persisted.
|
|
418
453
|
if (committed === true) {
|
|
419
454
|
this.structureUpdate = structures;
|
|
455
|
+
this.checkStructureCapacity();
|
|
420
456
|
return true;
|
|
421
457
|
}
|
|
422
458
|
return false;
|
|
423
459
|
} else {
|
|
424
460
|
const result = superSaveStructures.call(this, structures, isCompatible);
|
|
425
461
|
this.structureUpdate = structures;
|
|
462
|
+
if (result !== false) this.checkStructureCapacity();
|
|
426
463
|
return result;
|
|
427
464
|
}
|
|
428
465
|
};
|
|
@@ -432,10 +469,51 @@ export class RecordEncoder extends StructonEncoder {
|
|
|
432
469
|
const buffer = this.rootStore.getBinarySync(sharedStructuresKey);
|
|
433
470
|
return buffer ? this.decode(buffer) : undefined;
|
|
434
471
|
} else {
|
|
435
|
-
|
|
472
|
+
// msgpackr only defines getStructures when the option was supplied; a store with no
|
|
473
|
+
// shared-structures mechanism has no durable dictionary to report.
|
|
474
|
+
return superGetStructures?.call(this);
|
|
436
475
|
}
|
|
437
476
|
};
|
|
438
477
|
}
|
|
478
|
+
/**
|
|
479
|
+
* Sizes of this store's record-structure dictionaries. Read from the durable payload, not this
|
|
480
|
+
* encoder's arrays: each worker owns an encoder and loads lazily, so a worker that never encoded
|
|
481
|
+
* for this store holds empty arrays for a store whose dictionary is full.
|
|
482
|
+
*/
|
|
483
|
+
getStructureCounts(): StructureCounts {
|
|
484
|
+
const { typed, classic } = countDurableStructures(this.getStructures(), this.typedStructs?.length ?? 0);
|
|
485
|
+
return {
|
|
486
|
+
typed,
|
|
487
|
+
classic,
|
|
488
|
+
typedLimit: this.maxOwnStructures ?? DEFAULT_MAX_TYPED_STRUCTURES,
|
|
489
|
+
typedEnabled: this.randomAccessStructure,
|
|
490
|
+
};
|
|
491
|
+
}
|
|
492
|
+
/**
|
|
493
|
+
* Warn once per encoder when its typed dictionary is at the bound. Fires from the post-save path,
|
|
494
|
+
* so it needs some structure save to happen -- any save, including a classic one -- and it needs
|
|
495
|
+
* this encoder to have loaded the dictionary. Several workers can therefore each warn for one
|
|
496
|
+
* table, and a worker that never saves after loading a full dictionary stays silent. The counts
|
|
497
|
+
* above are the reliable signal; this is the heads-up. It must not escape into the save's return
|
|
498
|
+
* value -- the structures are committed.
|
|
499
|
+
*/
|
|
500
|
+
#reportedStructureSaturation = false;
|
|
501
|
+
checkStructureCapacity() {
|
|
502
|
+
if (this.#reportedStructureSaturation) return;
|
|
503
|
+
const typedLimit = this.maxOwnStructures ?? DEFAULT_MAX_TYPED_STRUCTURES;
|
|
504
|
+
if ((this.typedStructs?.length ?? 0) < typedLimit) return;
|
|
505
|
+
this.#reportedStructureSaturation = true;
|
|
506
|
+
try {
|
|
507
|
+
harperLogger.warn(
|
|
508
|
+
`Typed-structure dictionary for store ${this.name ?? this.rootStore?.name ?? '(unnamed)'} reached its limit of ` +
|
|
509
|
+
`${typedLimit} structures; new record shapes will be stored without random-access field ` +
|
|
510
|
+
'encoding. Dictionary size follows the variety of shapes written -- field set, key order, ' +
|
|
511
|
+
'and per-field value width -- not column count (see HarperFast/harper#2220).'
|
|
512
|
+
);
|
|
513
|
+
} catch {
|
|
514
|
+
// the structures are already committed; a failing sink must not fail the write
|
|
515
|
+
}
|
|
516
|
+
}
|
|
439
517
|
decode(buffer, options) {
|
|
440
518
|
lastMetadata = null;
|
|
441
519
|
const start = options?.start || 0;
|
|
@@ -807,6 +885,9 @@ export function recordUpdater(store, tableId, auditStore) {
|
|
|
807
885
|
: NO_TIMESTAMP;
|
|
808
886
|
const expiresAt = options?.expiresAt;
|
|
809
887
|
if (expiresAt >= 0) assignMetadata |= HAS_EXPIRATION;
|
|
888
|
+
if (isRocksDB && record !== undefined && existingEntry?.version != null && newVersion <= existingEntry.version) {
|
|
889
|
+
assignMetadata = Math.max(assignMetadata, 0) | VERSION_NOT_UNIQUE_FLAG;
|
|
890
|
+
}
|
|
810
891
|
metadataInNextEncoding = assignMetadata;
|
|
811
892
|
expiresAtNextEncoding = expiresAt;
|
|
812
893
|
const putOptions: {
|
|
@@ -829,9 +910,9 @@ export function recordUpdater(store, tableId, auditStore) {
|
|
|
829
910
|
metadataInNextEncoding |= HAS_RESIDENCY_ID;
|
|
830
911
|
extendedType |= HAS_CURRENT_RESIDENCY_ID;
|
|
831
912
|
} else residencyIdAtNextEncoding = 0;
|
|
832
|
-
const
|
|
833
|
-
if (
|
|
834
|
-
nodeIdAtNextEncoding =
|
|
913
|
+
const recordNodeId = options?.recordNodeId ?? options?.nodeId ?? (audit ? getThisNodeId(auditStore) : undefined);
|
|
914
|
+
if (recordNodeId >= 0) {
|
|
915
|
+
nodeIdAtNextEncoding = recordNodeId;
|
|
835
916
|
metadataInNextEncoding |= HAS_NODE_ID;
|
|
836
917
|
} else nodeIdAtNextEncoding = -1;
|
|
837
918
|
const additionalAuditRefs = options?.additionalAuditRefs;
|
|
@@ -904,8 +985,22 @@ export function recordUpdater(store, tableId, auditStore) {
|
|
|
904
985
|
const nodeId = options?.nodeId ?? getThisNodeId(auditStore) ?? 0;
|
|
905
986
|
const viaNodeId = options?.viaNodeId ?? nodeId;
|
|
906
987
|
if (resolveRecord && existingEntry?.localTime) {
|
|
907
|
-
|
|
908
|
-
|
|
988
|
+
let replacingId = existingEntry.localTime;
|
|
989
|
+
let replacingEntry;
|
|
990
|
+
if (isRocksDB && existingEntry.additionalAuditRefs) {
|
|
991
|
+
for (const ref of existingEntry.additionalAuditRefs) {
|
|
992
|
+
const candidate = auditStore.get(ref.version, tableId, id, ref.nodeId);
|
|
993
|
+
if (
|
|
994
|
+
candidate?.version === existingEntry.version &&
|
|
995
|
+
(candidate.nodeId ?? 0) === (existingEntry.nodeId ?? 0)
|
|
996
|
+
) {
|
|
997
|
+
replacingId = ref.version;
|
|
998
|
+
replacingEntry = candidate;
|
|
999
|
+
break;
|
|
1000
|
+
}
|
|
1001
|
+
}
|
|
1002
|
+
}
|
|
1003
|
+
replacingEntry ??= auditStore.get(replacingId, tableId, id, existingEntry.nodeId);
|
|
909
1004
|
if (replacingEntry) {
|
|
910
1005
|
const previousVersion = replacingEntry.previousVersion;
|
|
911
1006
|
result = auditStore[isRocksDB ? 'putSync' : 'put'](
|
|
@@ -934,7 +1029,7 @@ export function recordUpdater(store, tableId, auditStore) {
|
|
|
934
1029
|
result = auditStore[isRocksDB ? 'putSync' : 'put'](
|
|
935
1030
|
record === undefined ? NEW_TIMESTAMP_PLACEHOLDER : LAST_TIMESTAMP_PLACEHOLDER,
|
|
936
1031
|
{
|
|
937
|
-
version: newVersion,
|
|
1032
|
+
version: options?.recordVersion ?? newVersion,
|
|
938
1033
|
tableId,
|
|
939
1034
|
recordId: id,
|
|
940
1035
|
previousVersion: isRocksDB ? existingEntry?.version : existingEntry?.localTime,
|
|
@@ -36,6 +36,8 @@ export class RequestTarget extends URLSearchParams {
|
|
|
36
36
|
declare select?: Select;
|
|
37
37
|
/** Return an explanation of the query order */
|
|
38
38
|
declare explain?: boolean;
|
|
39
|
+
/** Request a total count of matching records for pagination (REST `Prefer: count=exact|estimated`). */
|
|
40
|
+
declare count?: 'exact' | 'estimated';
|
|
39
41
|
/** Force the query to be executed in the order of conditions */
|
|
40
42
|
declare enforceExecutionOrder?: boolean;
|
|
41
43
|
declare lazy?: boolean;
|
package/resources/Resource.ts
CHANGED
|
@@ -963,15 +963,23 @@ function registerLiveSubscriptionForContext(subscription: any, resource: any, ad
|
|
|
963
963
|
// JWT exp of the bearer credential (set by the auth layer); undefined for password/mTLS/session.
|
|
964
964
|
authExpiresAt: user.authExpiresAt,
|
|
965
965
|
recheck: async () => {
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
966
|
+
let fresh: any;
|
|
967
|
+
if (user._scopedToken) {
|
|
968
|
+
// A scoped token's identity IS its embedded role — never re-resolve its attribution
|
|
969
|
+
// username against hdb_user (it may not exist, or may name an unrelated principal
|
|
970
|
+
// created later). Expiry (authExpiresAt above) is its only revocation.
|
|
971
|
+
fresh = user;
|
|
972
|
+
} else {
|
|
973
|
+
// Re-fetch current user state — the user/role cache is rebuilt on mutations — so a dropped or
|
|
974
|
+
// role-stripped user no longer authorizes.
|
|
975
|
+
const { findAndValidateUser } = require('../security/user');
|
|
976
|
+
fresh = await findAndValidateUser(username, undefined, false);
|
|
977
|
+
if (!fresh?.role) return false;
|
|
978
|
+
// Advance the subscription's context to the fresh user so downstream checks — context.user
|
|
979
|
+
// and getCurrentUser() (which reads the resource's context) — evaluate against current state,
|
|
980
|
+
// not the stale user captured at subscribe time.
|
|
981
|
+
if (context) (context as any).user = fresh;
|
|
982
|
+
}
|
|
975
983
|
// Re-run the same operation-level allowRead that granted the subscription.
|
|
976
984
|
const reTarget: any = cloneRequestTarget(admittedTarget);
|
|
977
985
|
reTarget.checkPermission = fresh.role?.permission;
|
|
@@ -4,6 +4,7 @@ import { DatabaseTransaction } from './DatabaseTransaction.ts';
|
|
|
4
4
|
import { IterableEventQueue } from './IterableEventQueue.ts';
|
|
5
5
|
import type { Entry, RecordObject } from './RecordEncoder.ts';
|
|
6
6
|
import { RequestTarget } from './RequestTarget.ts';
|
|
7
|
+
import type { RecordLockOptions } from './recordLock.ts';
|
|
7
8
|
|
|
8
9
|
export interface ResourceInterface<Record extends object = any>
|
|
9
10
|
extends Partial<RecordObject>, Pick<UpdatableRecord<Record>, 'addTo' | 'subtractFrom'> {
|
|
@@ -45,6 +46,11 @@ export interface ResourceInterface<Record extends object = any>
|
|
|
45
46
|
|
|
46
47
|
invalidate(target: RequestTargetOrId): void | Promise<void>;
|
|
47
48
|
|
|
49
|
+
/** Acquire an exclusive lock on a record and return it ready for updates (see `RecordLockOptions`) */
|
|
50
|
+
lock?(target?: RequestTargetOrId | RecordLockOptions, options?: RecordLockOptions): Promise<WritableRecord<Record>>;
|
|
51
|
+
/** Release the lock this instance holds; resolves true when this call cleared it */
|
|
52
|
+
unlock?(): Promise<boolean>;
|
|
53
|
+
|
|
48
54
|
publish?(target: RequestTargetOrId, record: Record, options?: any): void;
|
|
49
55
|
subscribe?(request: SubscriptionRequest): AsyncIterable<Record> | Promise<AsyncIterable<Record>>;
|
|
50
56
|
|
|
@@ -258,6 +264,23 @@ interface TypedUpdatableRecord<Record extends object, Property extends keyof Rec
|
|
|
258
264
|
subtractFrom(property: Property, value: Record[Property]): void;
|
|
259
265
|
}
|
|
260
266
|
|
|
267
|
+
export type { RecordLockOptions } from './recordLock.ts';
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* What `lock()` resolves with: the locked record, loaded after the lock committed and tracking
|
|
271
|
+
* changes for `save()`. Inside an explicit `transaction()` scope a scoped lock is released when
|
|
272
|
+
* that transaction commits or aborts. Outside any explicit scope (ImmediateTransaction context),
|
|
273
|
+
* a scoped lock persists until `unlock()` is called or the lease expires. A held lock
|
|
274
|
+
* (`{ hold: true }`) is always released by `unlock()` or its lease, regardless of scope.
|
|
275
|
+
*/
|
|
276
|
+
export type WritableRecord<Record extends object = any> = UpdatableRecord<Record> & {
|
|
277
|
+
save(): void | Promise<void>;
|
|
278
|
+
update(updates?: Partial<Record>): unknown;
|
|
279
|
+
delete(target?: RequestTargetOrId): boolean | Promise<boolean>;
|
|
280
|
+
lock(target?: RequestTargetOrId | RecordLockOptions, options?: RecordLockOptions): Promise<WritableRecord<Record>>;
|
|
281
|
+
unlock(): Promise<boolean>;
|
|
282
|
+
};
|
|
283
|
+
|
|
261
284
|
export interface Subscription<Event extends object = any> extends IterableEventQueue<Event> {
|
|
262
285
|
new (listener: Listener<Event>);
|
|
263
286
|
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
|
+
type CountEstimate,
|
|
3
|
+
type CountEstimateOptions,
|
|
2
4
|
DBI,
|
|
3
5
|
type StoreIteratorOptions,
|
|
4
6
|
type StorePutOptions,
|
|
@@ -14,6 +16,25 @@ declare module '@harperfast/rocksdb-js' {
|
|
|
14
16
|
}
|
|
15
17
|
}
|
|
16
18
|
|
|
19
|
+
/**
|
|
20
|
+
* Widen value-space bounds to `[value, MAXIMUM_KEY]` composite bounds. The base implementation's
|
|
21
|
+
* encoded-byte successor of the bare indexed value would exclude the wrong entries on composite
|
|
22
|
+
* `[indexedValue, primaryKey]` keys.
|
|
23
|
+
*/
|
|
24
|
+
function translateIndexBounds<
|
|
25
|
+
T extends { start?: any; end?: any; exclusiveStart?: boolean; inclusiveEnd?: boolean; reverse?: boolean },
|
|
26
|
+
>(options: T): T {
|
|
27
|
+
let { start, end } = options;
|
|
28
|
+
const { exclusiveStart, inclusiveEnd, reverse } = options;
|
|
29
|
+
if ((reverse ? !exclusiveStart : exclusiveStart) && start !== undefined) {
|
|
30
|
+
start = [start, MAXIMUM_KEY];
|
|
31
|
+
}
|
|
32
|
+
if ((reverse ? !inclusiveEnd : inclusiveEnd) && end !== undefined) {
|
|
33
|
+
end = [end, MAXIMUM_KEY];
|
|
34
|
+
}
|
|
35
|
+
return { ...options, start, end };
|
|
36
|
+
}
|
|
37
|
+
|
|
17
38
|
/**
|
|
18
39
|
* A specialized RocksDB-based index store that maintains indexed references to primary keys.
|
|
19
40
|
* This store uses composite keys consisting of indexed values and primary keys, enabling
|
|
@@ -27,19 +48,19 @@ export class RocksIndexStore extends RocksDatabase {
|
|
|
27
48
|
* @param options
|
|
28
49
|
*/
|
|
29
50
|
getRange(options: StoreIteratorOptions): Iterable<any> {
|
|
30
|
-
|
|
31
|
-
if ((reverse ? !exclusiveStart : exclusiveStart) && start !== undefined) {
|
|
32
|
-
start = [start, MAXIMUM_KEY];
|
|
33
|
-
}
|
|
34
|
-
if ((reverse ? !inclusiveEnd : inclusiveEnd) && end !== undefined) {
|
|
35
|
-
end = [end, MAXIMUM_KEY];
|
|
36
|
-
}
|
|
37
|
-
const translatedOptions = { ...options, start, end };
|
|
38
|
-
return super.getRange(translatedOptions).map(({ key }) => {
|
|
51
|
+
return super.getRange(translateIndexBounds(options)).map(({ key }) => {
|
|
39
52
|
return { key: key[0], value: key.length > 2 ? key.slice(1) : key[1] };
|
|
40
53
|
});
|
|
41
54
|
}
|
|
42
55
|
|
|
56
|
+
/**
|
|
57
|
+
* Estimate the entry count of a range of indexed values. Shares `getRange`'s bound translation
|
|
58
|
+
* so a planner estimate always covers exactly the range execution would iterate.
|
|
59
|
+
*/
|
|
60
|
+
estimateCount(options?: CountEstimateOptions): CountEstimate {
|
|
61
|
+
return super.estimateCount(translateIndexBounds(options ?? {}));
|
|
62
|
+
}
|
|
63
|
+
|
|
43
64
|
/**
|
|
44
65
|
* Translate a put with indexed value and primary key to an underlying put
|
|
45
66
|
* @param indexedValue - ignored, only used by LMDB
|