@harperfast/harper 5.2.13 → 5.3.0-beta.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 +58 -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 +120 -4
- package/bin/run.ts +6 -11
- package/bin/upgrade.js +7 -3
- package/bin/workloadIdentity.ts +119 -0
- package/components/Application.ts +3436 -242
- package/components/ApplicationScope.ts +8 -0
- package/components/EntryHandler.ts +59 -39
- package/components/OptionsWatcher.ts +440 -98
- package/components/RuntimeModuleTracker.ts +38 -7
- package/components/Scope.ts +56 -15
- package/components/awaitRestart.ts +84 -0
- package/components/componentLoader.ts +381 -32
- package/components/componentPreparationLock.ts +16 -5
- package/components/deploymentOperations.ts +4 -1
- package/components/deploymentRecorder.ts +9 -2
- 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 +537 -113
- package/components/operationsValidation.js +98 -3
- package/components/packageComponent.ts +25 -1
- package/components/requestRestart.ts +11 -0
- package/components/status/ComponentStatusRegistry.ts +59 -0
- package/config/RootConfigWatcher.ts +240 -40
- package/config/configReadRetry.ts +62 -0
- package/config/configUtils.ts +357 -48
- package/config/harperConfigEnvVars.ts +170 -27
- package/config/parseConfigFile.ts +34 -0
- package/config/readConfigFileSync.ts +44 -0
- package/config/watcherArming.ts +59 -0
- package/config-root.schema.json +33 -0
- package/dataLayer/blobBackup.ts +160 -50
- package/dataLayer/delete.ts +6 -1
- package/dataLayer/harperBridge/ResourceBridge.ts +80 -10
- 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 +61 -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 +91 -6
- 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 +235 -17
- package/dist/components/Application.js +3038 -238
- 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 +4 -0
- package/dist/components/OptionsWatcher.js +440 -99
- 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 +52 -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 +313 -24
- 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/deploymentOperations.js +4 -1
- package/dist/components/deploymentOperations.js.map +1 -1
- package/dist/components/deploymentRecorder.d.ts +4 -2
- package/dist/components/deploymentRecorder.js +1 -0
- package/dist/components/deploymentRecorder.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.d.ts +28 -0
- package/dist/components/operations.js +476 -113
- package/dist/components/operations.js.map +1 -1
- package/dist/components/operationsValidation.js +97 -3
- package/dist/components/operationsValidation.js.map +1 -1
- package/dist/components/packageComponent.js +24 -0
- package/dist/components/packageComponent.js.map +1 -1
- package/dist/components/requestRestart.d.ts +1 -0
- package/dist/components/requestRestart.js +7 -0
- package/dist/components/requestRestart.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 +9 -1
- package/dist/config/RootConfigWatcher.js +228 -37
- package/dist/config/RootConfigWatcher.js.map +1 -1
- package/dist/config/configReadRetry.d.ts +8 -0
- package/dist/config/configReadRetry.js +62 -0
- package/dist/config/configReadRetry.js.map +1 -0
- package/dist/config/configUtils.d.ts +11 -2
- package/dist/config/configUtils.js +304 -47
- 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/config/parseConfigFile.d.ts +4 -0
- package/dist/config/parseConfigFile.js +35 -0
- package/dist/config/parseConfigFile.js.map +1 -0
- package/dist/config/readConfigFileSync.d.ts +1 -0
- package/dist/config/readConfigFileSync.js +47 -0
- package/dist/config/readConfigFileSync.js.map +1 -0
- package/dist/config/watcherArming.d.ts +15 -0
- package/dist/config/watcherArming.js +59 -0
- package/dist/config/watcherArming.js.map +1 -0
- 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 +72 -12
- 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 +2 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/json/systemSchema.json +55 -0
- package/dist/resources/DatabaseTransaction.d.ts +77 -0
- package/dist/resources/DatabaseTransaction.js +586 -54
- package/dist/resources/DatabaseTransaction.js.map +1 -1
- package/dist/resources/LMDBTransaction.d.ts +2 -1
- package/dist/resources/LMDBTransaction.js +43 -6
- package/dist/resources/LMDBTransaction.js.map +1 -1
- package/dist/resources/PrimaryRocksDatabase.d.ts +1 -0
- package/dist/resources/PrimaryRocksDatabase.js +49 -5
- package/dist/resources/PrimaryRocksDatabase.js.map +1 -1
- package/dist/resources/RecordEncoder.d.ts +20 -0
- package/dist/resources/RecordEncoder.js +110 -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 +117 -24
- package/dist/resources/Resource.js.map +1 -1
- package/dist/resources/ResourceInterface.d.ts +28 -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 +24 -1
- package/dist/resources/RocksTransactionLogStore.js +160 -49
- package/dist/resources/RocksTransactionLogStore.js.map +1 -1
- package/dist/resources/Table.d.ts +165 -10
- package/dist/resources/Table.js +1805 -303
- package/dist/resources/Table.js.map +1 -1
- package/dist/resources/analytics/write.js +10 -3
- package/dist/resources/analytics/write.js.map +1 -1
- package/dist/resources/auditStore.d.ts +181 -2
- package/dist/resources/auditStore.js +640 -29
- 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/dataLoader.js +3 -4
- package/dist/resources/dataLoader.js.map +1 -1
- package/dist/resources/databases.d.ts +157 -14
- package/dist/resources/databases.js +1462 -325
- 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/derivedIndexRegistry.d.ts +5 -0
- package/dist/resources/derivedIndexRegistry.js +68 -0
- package/dist/resources/derivedIndexRegistry.js.map +1 -0
- package/dist/resources/derivedIndexRuntime.d.ts +215 -0
- package/dist/resources/derivedIndexRuntime.js +2027 -0
- package/dist/resources/derivedIndexRuntime.js.map +1 -0
- package/dist/resources/graphql.d.ts +1 -1
- package/dist/resources/graphql.js +52 -16
- package/dist/resources/graphql.js.map +1 -1
- package/dist/resources/indexes/HierarchicalNavigableSmallWorld.d.ts +103 -9
- package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js +854 -41
- package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js.map +1 -1
- package/dist/resources/indexes/hnswDerivedIndex.d.ts +67 -0
- package/dist/resources/indexes/hnswDerivedIndex.js +464 -0
- package/dist/resources/indexes/hnswDerivedIndex.js.map +1 -0
- package/dist/resources/indexes/hnswPlaneBinding.d.ts +65 -0
- package/dist/resources/indexes/hnswPlaneBinding.js +91 -0
- package/dist/resources/indexes/hnswPlaneBinding.js.map +1 -0
- 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/nodeIdMapping.d.ts +5 -0
- package/dist/resources/nodeIdMapping.js +49 -0
- package/dist/resources/nodeIdMapping.js.map +1 -1
- package/dist/resources/recordLock.d.ts +123 -0
- package/dist/resources/recordLock.js +315 -0
- package/dist/resources/recordLock.js.map +1 -0
- package/dist/resources/recordLockCoordinator.d.ts +557 -0
- package/dist/resources/recordLockCoordinator.js +2565 -0
- package/dist/resources/recordLockCoordinator.js.map +1 -0
- package/dist/resources/replayLogs.d.ts +14 -1
- package/dist/resources/replayLogs.js +157 -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/replicatedApplyFailure.d.ts +16 -0
- package/dist/resources/replicatedApplyFailure.js +63 -0
- package/dist/resources/replicatedApplyFailure.js.map +1 -0
- package/dist/resources/scheduler/scheduler.js +3 -3
- package/dist/resources/scheduler/scheduler.js.map +1 -1
- package/dist/resources/search.d.ts +10 -4
- package/dist/resources/search.js +283 -37
- package/dist/resources/search.js.map +1 -1
- package/dist/resources/tracked.d.ts +5 -1
- package/dist/resources/tracked.js +74 -23
- package/dist/resources/tracked.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 +77 -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 +106 -2
- 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 +16 -1
- package/dist/server/http.js +122 -17
- 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 +27 -0
- package/dist/server/serverHelpers/Headers.js +145 -1
- package/dist/server/serverHelpers/Headers.js.map +1 -1
- package/dist/server/serverHelpers/NodeAdapterResponse.d.ts +48 -0
- package/dist/server/serverHelpers/NodeAdapterResponse.js +220 -0
- package/dist/server/serverHelpers/NodeAdapterResponse.js.map +1 -0
- package/dist/server/serverHelpers/Request.d.ts +5 -10
- package/dist/server/serverHelpers/Request.js +38 -136
- package/dist/server/serverHelpers/Request.js.map +1 -1
- package/dist/server/serverHelpers/contentTypes.d.ts +11 -0
- package/dist/server/serverHelpers/contentTypes.js +221 -40
- 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 +178 -29
- 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 +5 -0
- package/dist/server/storageReclamation.js +17 -1
- package/dist/server/storageReclamation.js.map +1 -1
- package/dist/server/threads/isolatedApplications.d.ts +47 -0
- package/dist/server/threads/isolatedApplications.js +171 -0
- package/dist/server/threads/isolatedApplications.js.map +1 -0
- 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/logRotationTransport.d.ts +1 -0
- package/dist/server/threads/logRotationTransport.js +33 -0
- package/dist/server/threads/logRotationTransport.js.map +1 -0
- package/dist/server/threads/manageThreads.d.ts +83 -3
- package/dist/server/threads/manageThreads.js +769 -75
- package/dist/server/threads/manageThreads.js.map +1 -1
- package/dist/server/threads/socketRouter.d.ts +1 -0
- package/dist/server/threads/socketRouter.js +277 -31
- 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 +76 -22
- 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 +33 -0
- package/dist/utility/errors/hdbError.js +58 -1
- package/dist/utility/errors/hdbError.js.map +1 -1
- package/dist/utility/globalSchema.d.ts +18 -0
- package/dist/utility/hdbTerms.d.ts +18 -0
- package/dist/utility/hdbTerms.js +20 -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 +286 -30
- package/dist/utility/logging/harper_logger.js.map +1 -1
- package/dist/utility/logging/logGenerationCoordinator.d.ts +35 -0
- package/dist/utility/logging/logGenerationCoordinator.js +184 -0
- package/dist/utility/logging/logGenerationCoordinator.js.map +1 -0
- package/dist/utility/logging/logRotation.d.ts +46 -0
- package/dist/utility/logging/logRotation.js +365 -0
- package/dist/utility/logging/logRotation.js.map +1 -0
- package/dist/utility/logging/logRotator.d.ts +1 -1
- package/dist/utility/logging/logRotator.js +192 -85
- 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 +11 -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 +41 -0
- package/dist/utility/watcherFallback.js +153 -0
- package/dist/utility/watcherFallback.js.map +1 -1
- package/dist/validation/configValidator.d.ts +12 -0
- package/dist/validation/configValidator.js +205 -75
- 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 +8 -0
- package/json/systemSchema.json +55 -0
- package/npm-shrinkwrap.json +286 -194
- package/package.json +15 -7
- package/resources/DESIGN.md +219 -52
- package/resources/DatabaseTransaction.ts +657 -52
- package/resources/LMDBTransaction.ts +46 -6
- package/resources/PrimaryRocksDatabase.ts +46 -7
- package/resources/RecordEncoder.ts +124 -9
- package/resources/RequestTarget.ts +2 -0
- package/resources/Resource.ts +114 -22
- package/resources/ResourceInterface.ts +31 -0
- package/resources/RocksIndexStore.ts +30 -9
- package/resources/RocksTransactionLogStore.ts +188 -51
- package/resources/Table.ts +1960 -301
- package/resources/analytics/write.ts +10 -3
- package/resources/auditStore.ts +647 -32
- package/resources/blob.ts +1029 -110
- package/resources/branchDatabase.ts +941 -0
- package/resources/crdt.ts +76 -12
- package/resources/dataLoader.ts +3 -4
- package/resources/databases.ts +1584 -320
- package/resources/defineTable.ts +18 -2
- package/resources/derivedIndexRegistry.ts +56 -0
- package/resources/derivedIndexRuntime.ts +2292 -0
- package/resources/graphql.ts +72 -17
- package/resources/indexes/HierarchicalNavigableSmallWorld.ts +911 -48
- package/resources/indexes/hnswDerivedIndex.ts +531 -0
- package/resources/indexes/hnswPlaneBinding.ts +174 -0
- package/resources/longLivedTransactions.ts +360 -0
- package/resources/models/backendRegistry.ts +84 -2
- package/resources/models/bootstrap.ts +473 -28
- package/resources/nodeIdMapping.ts +50 -0
- package/resources/recordLock.ts +419 -0
- package/resources/recordLockCoordinator.ts +3043 -0
- package/resources/replayLogs.ts +152 -26
- package/resources/replayLogsGuards.ts +171 -8
- package/resources/replicatedApplyFailure.ts +77 -0
- package/resources/scheduler/scheduler.ts +4 -4
- package/resources/search.ts +288 -46
- package/resources/tracked.ts +73 -22
- 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 +83 -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 +194 -16
- package/server/DurableSubscriptionsSession.ts +71 -11
- package/server/REST.ts +115 -4
- package/server/graphqlQuerying.ts +4 -0
- package/server/http.ts +133 -20
- 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 +135 -0
- package/server/serverHelpers/NodeAdapterResponse.ts +221 -0
- package/server/serverHelpers/Request.ts +33 -131
- package/server/serverHelpers/contentTypes.ts +217 -36
- 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 +232 -40
- package/server/serverHelpers/sharedMessageEncoding.ts +307 -0
- package/server/serverHelpers/uwsServer.ts +17 -2
- package/server/static.ts +23 -29
- package/server/storageReclamation.ts +15 -2
- package/server/threads/isolatedApplications.ts +157 -0
- package/server/threads/itc.js +11 -1
- package/server/threads/logRotationTransport.ts +40 -0
- package/server/threads/manageThreads.js +771 -66
- package/server/threads/socketRouter.ts +291 -30
- package/server/threads/threadHeapMemory.ts +26 -0
- package/server/threads/threadServer.js +73 -22
- package/sqlTranslator/index.ts +31 -8
- package/studio/web/assets/{Chat-4RrB5134.js → Chat-D3j-1yY1.js} +1 -1
- package/studio/web/assets/{FloatingChat-omlNMDcJ.js → FloatingChat-BxJGYcfB.js} +3 -3
- package/studio/web/assets/{apiToken-Bke3wvfZ.js → apiToken-CT55oWOe.js} +1 -1
- package/studio/web/assets/{applications-DvFDYJgK.js → applications-D9Ct9_vm.js} +1 -1
- package/studio/web/assets/{cssMode-C1vRa7zh.js → cssMode-DV8H7VwA.js} +1 -1
- package/studio/web/assets/{editor-3XRWEDWX.js → editor-uatc0unt.js} +1 -1
- package/studio/web/assets/{html-CTY5tdMr.js → html-Bm6D6paN.js} +1 -1
- package/studio/web/assets/{htmlMode-CG1vSD9t.js → htmlMode-CEn7tpLG.js} +1 -1
- package/studio/web/assets/{index-Dfpeofdu.js → index-BIXW6Pu4.js} +5 -5
- package/studio/web/assets/{index.lazy-B1VOIv-t.js → index.lazy-UI7L-Vrk.js} +1 -1
- package/studio/web/assets/{javascript-CJeJzGnI.js → javascript-CJ0G3AFZ.js} +1 -1
- package/studio/web/assets/{jsonMode-CYPBwM82.js → jsonMode-DQADAYEa.js} +1 -1
- package/studio/web/assets/{languageServices-IKH4GUHl.js → languageServices-CAQJXWcI.js} +1 -1
- package/studio/web/assets/{lspLanguageFeatures-BC8_gxKG.js → lspLanguageFeatures-CCQ8P5sY.js} +1 -1
- package/studio/web/assets/{notifications-BfKBpYcq.js → notifications-BbxTU6Aw.js} +1 -1
- package/studio/web/assets/{notifications-DFbArTfC.js → notifications-Cvb3P1lB.js} +1 -1
- package/studio/web/assets/{profile-Q4-T6c-S.js → profile-Yyb7gsvL.js} +1 -1
- package/studio/web/assets/{regions-CtkV0xje.js → regions-OgjGHlU5.js} +1 -1
- package/studio/web/assets/{register-1ZZuMsiA.js → register-6qwNEOY3.js} +2 -2
- package/studio/web/assets/{setComponentFile-ZWLcWv5X.js → setComponentFile-BilDMtgB.js} +1 -1
- package/studio/web/assets/{setup-DWprJyJy.js → setup-J6qJ7OIU.js} +2 -2
- package/studio/web/assets/{status--aNm8isn.js → status-0RWGcfyD.js} +1 -1
- package/studio/web/assets/{toggleHighContrast-Cq_lt3XD.js → toggleHighContrast-BIn-vErT.js} +1 -1
- package/studio/web/assets/{tsMode-pjgytARx.js → tsMode-DgUXku4d.js} +1 -1
- package/studio/web/assets/{typescript-Cdg0mqUh.js → typescript-C9orXcsM.js} +1 -1
- package/studio/web/assets/{useEntityRestURL-RZhaY8Rn.js → useEntityRestURL-BEoXXbUB.js} +1 -1
- package/studio/web/assets/{workers-BgoXIqQe.js → workers-JVzSDmgx.js} +1 -1
- package/studio/web/assets/{xml-BwSeDMiP.js → xml-Cq-S8S4X.js} +1 -1
- package/studio/web/assets/{yaml-DotCUG5l.js → yaml-sfoRdh1M.js} +1 -1
- package/studio/web/index.html +1 -1
- 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 +57 -0
- package/utility/hdbTerms.ts +19 -0
- package/utility/logging/harper_logger.ts +278 -26
- package/utility/logging/logGenerationCoordinator.ts +196 -0
- package/utility/logging/logRotation.ts +367 -0
- package/utility/logging/logRotator.ts +213 -81
- package/utility/nodeIdentity.ts +45 -0
- package/utility/npmUtilities.ts +12 -8
- package/utility/operationPermissions.ts +18 -1
- package/utility/operation_authorization.ts +231 -42
- package/utility/watchPath.ts +63 -0
- package/utility/watcherFallback.ts +148 -0
- package/validation/configValidator.ts +215 -75
- package/validation/installValidator.ts +15 -0
- package/validation/validationWrapper.ts +18 -4
|
@@ -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
|
|
|
@@ -195,6 +201,10 @@ interface TypedDirectCondition<Record extends object, Property extends keyof Rec
|
|
|
195
201
|
search_type?: Comparator;
|
|
196
202
|
value?: Record[Property] | Record[Property][];
|
|
197
203
|
search_value?: Record[Property] | Record[Property][];
|
|
204
|
+
/** Native HNSW coverage tolerance in milliseconds; defaults to 3000, with 0 requiring current coverage. */
|
|
205
|
+
maxIndexLagMilliseconds?: number;
|
|
206
|
+
/** Wait for coverage of prior committed writes, up to 30,000 ms; 0 (default) does not wait. */
|
|
207
|
+
waitForIndexMilliseconds?: number;
|
|
198
208
|
/**
|
|
199
209
|
* If true, the condition is negated. Phase 1: filter-only — forces a
|
|
200
210
|
* full scan unless paired with another indexed condition.
|
|
@@ -217,6 +227,10 @@ export type Conditions<Record extends object = any> = Condition<Record>[];
|
|
|
217
227
|
|
|
218
228
|
export interface Sort<Record extends object = any> {
|
|
219
229
|
attribute: keyof Record;
|
|
230
|
+
/** Native HNSW coverage tolerance in milliseconds; defaults to 3000, with 0 requiring current coverage. */
|
|
231
|
+
maxIndexLagMilliseconds?: number;
|
|
232
|
+
/** Wait for coverage of prior committed writes, up to 30,000 ms; 0 (default) does not wait. */
|
|
233
|
+
waitForIndexMilliseconds?: number;
|
|
220
234
|
descending?: boolean;
|
|
221
235
|
next?: Sort<Record>;
|
|
222
236
|
}
|
|
@@ -258,6 +272,23 @@ interface TypedUpdatableRecord<Record extends object, Property extends keyof Rec
|
|
|
258
272
|
subtractFrom(property: Property, value: Record[Property]): void;
|
|
259
273
|
}
|
|
260
274
|
|
|
275
|
+
export type { RecordLockOptions } from './recordLock.ts';
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* What `lock()` resolves with: the locked record, loaded after the lock committed and tracking
|
|
279
|
+
* changes for `save()`. Inside an explicit `transaction()` scope a scoped lock is released when
|
|
280
|
+
* that transaction commits or aborts. Outside any explicit scope (ImmediateTransaction context),
|
|
281
|
+
* a scoped lock persists until `unlock()` is called or the lease expires. A held lock
|
|
282
|
+
* (`{ hold: true }`) is always released by `unlock()` or its lease, regardless of scope.
|
|
283
|
+
*/
|
|
284
|
+
export type WritableRecord<Record extends object = any> = UpdatableRecord<Record> & {
|
|
285
|
+
save(): void | Promise<void>;
|
|
286
|
+
update(updates?: Partial<Record>): unknown;
|
|
287
|
+
delete(target?: RequestTargetOrId): boolean | Promise<boolean>;
|
|
288
|
+
lock(target?: RequestTargetOrId | RecordLockOptions, options?: RecordLockOptions): Promise<WritableRecord<Record>>;
|
|
289
|
+
unlock(): Promise<boolean>;
|
|
290
|
+
};
|
|
291
|
+
|
|
261
292
|
export interface Subscription<Event extends object = any> extends IterableEventQueue<Event> {
|
|
262
293
|
new (listener: Listener<Event>);
|
|
263
294
|
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { trackReadRange } from './DatabaseTransaction.ts';
|
|
2
2
|
import {
|
|
3
|
+
type CountEstimate,
|
|
4
|
+
type CountEstimateOptions,
|
|
3
5
|
DBI,
|
|
4
6
|
type StoreIteratorOptions,
|
|
5
7
|
type StorePutOptions,
|
|
@@ -15,6 +17,25 @@ declare module '@harperfast/rocksdb-js' {
|
|
|
15
17
|
}
|
|
16
18
|
}
|
|
17
19
|
|
|
20
|
+
/**
|
|
21
|
+
* Widen value-space bounds to `[value, MAXIMUM_KEY]` composite bounds. The base implementation's
|
|
22
|
+
* encoded-byte successor of the bare indexed value would exclude the wrong entries on composite
|
|
23
|
+
* `[indexedValue, primaryKey]` keys.
|
|
24
|
+
*/
|
|
25
|
+
function translateIndexBounds<
|
|
26
|
+
T extends { start?: any; end?: any; exclusiveStart?: boolean; inclusiveEnd?: boolean; reverse?: boolean },
|
|
27
|
+
>(options: T): T {
|
|
28
|
+
let { start, end } = options;
|
|
29
|
+
const { exclusiveStart, inclusiveEnd, reverse } = options;
|
|
30
|
+
if ((reverse ? !exclusiveStart : exclusiveStart) && start !== undefined) {
|
|
31
|
+
start = [start, MAXIMUM_KEY];
|
|
32
|
+
}
|
|
33
|
+
if ((reverse ? !inclusiveEnd : inclusiveEnd) && end !== undefined) {
|
|
34
|
+
end = [end, MAXIMUM_KEY];
|
|
35
|
+
}
|
|
36
|
+
return { ...options, start, end };
|
|
37
|
+
}
|
|
38
|
+
|
|
18
39
|
/**
|
|
19
40
|
* A specialized RocksDB-based index store that maintains indexed references to primary keys.
|
|
20
41
|
* This store uses composite keys consisting of indexed values and primary keys, enabling
|
|
@@ -28,19 +49,19 @@ export class RocksIndexStore extends RocksDatabase {
|
|
|
28
49
|
* @param options
|
|
29
50
|
*/
|
|
30
51
|
getRange(options: StoreIteratorOptions): Iterable<any> {
|
|
31
|
-
|
|
32
|
-
if ((reverse ? !exclusiveStart : exclusiveStart) && start !== undefined) {
|
|
33
|
-
start = [start, MAXIMUM_KEY];
|
|
34
|
-
}
|
|
35
|
-
if ((reverse ? !inclusiveEnd : inclusiveEnd) && end !== undefined) {
|
|
36
|
-
end = [end, MAXIMUM_KEY];
|
|
37
|
-
}
|
|
38
|
-
const translatedOptions = { ...options, start, end };
|
|
39
|
-
return trackReadRange(options.transaction, () => super.getRange(translatedOptions)).map(({ key }) => {
|
|
52
|
+
return trackReadRange(options.transaction, () => super.getRange(translateIndexBounds(options))).map(({ key }) => {
|
|
40
53
|
return { key: key[0], value: key.length > 2 ? key.slice(1) : key[1] };
|
|
41
54
|
});
|
|
42
55
|
}
|
|
43
56
|
|
|
57
|
+
/**
|
|
58
|
+
* Estimate the entry count of a range of indexed values. Shares `getRange`'s bound translation
|
|
59
|
+
* so a planner estimate always covers exactly the range execution would iterate.
|
|
60
|
+
*/
|
|
61
|
+
estimateCount(options?: CountEstimateOptions): CountEstimate {
|
|
62
|
+
return super.estimateCount(translateIndexBounds(options ?? {}));
|
|
63
|
+
}
|
|
64
|
+
|
|
44
65
|
/**
|
|
45
66
|
* Translate a put with indexed value and primary key to an underlying put
|
|
46
67
|
* @param indexedValue - ignored, only used by LMDB
|
|
@@ -3,7 +3,12 @@ import { ExtendedIterable } from '@harperfast/extended-iterable';
|
|
|
3
3
|
import { getIdOfRemoteNode } from './nodeIdMapping.ts';
|
|
4
4
|
import { Decoder, readAuditEntry, ENTRY_DATAVIEW, AuditRecord, createAuditEntry } from './auditStore.ts';
|
|
5
5
|
import { HAS_STRUCTURE_UPDATE } from './RecordEncoder.ts';
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
createCorruptFrameReporter,
|
|
8
|
+
endIteratorOnCorruptFrame,
|
|
9
|
+
isMidLogBreak,
|
|
10
|
+
type CorruptFrameStop,
|
|
11
|
+
} from './replayLogsGuards.ts';
|
|
7
12
|
import { isMainThread } from 'node:worker_threads';
|
|
8
13
|
import { EventEmitter } from 'node:events';
|
|
9
14
|
import { asBinary } from 'lmdb';
|
|
@@ -23,12 +28,20 @@ type TransactionLogIterator = Iterator<TransactionEntry | number> & {
|
|
|
23
28
|
removeLog(logName: string);
|
|
24
29
|
};
|
|
25
30
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
31
|
+
type TrackedIterator = IterableIterator<TransactionEntry> & { lastVersion?: number; lastEndTxn?: boolean };
|
|
32
|
+
type NamedTransactionEntry = TransactionEntry & { logName?: string };
|
|
33
|
+
export type ExactStartFailure = 'missing' | 'incomplete' | 'duplicate';
|
|
34
|
+
|
|
35
|
+
export type TransactionLogIterable = Iterable<AuditRecord> & {
|
|
36
|
+
/** Corrupt frames that ended a log's iteration during this range. */
|
|
37
|
+
corruptFrameStop: CorruptFrameStop;
|
|
38
|
+
/** Physical logs whose iterators ended with an unexpected, non-corruption error. */
|
|
39
|
+
failedLogs: Set<string>;
|
|
40
|
+
/** Physical logs whose requested exact transaction could not form one unambiguous resume boundary. */
|
|
41
|
+
exactStartFailures: Map<string, ExactStartFailure>;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const reportCorruptFrame = createCorruptFrameReporter(harperLogger);
|
|
32
45
|
|
|
33
46
|
/**
|
|
34
47
|
* Represents a transaction log store backed by RocksDB.
|
|
@@ -42,6 +55,7 @@ export class RocksTransactionLogStore extends EventEmitter {
|
|
|
42
55
|
logByName: Map<string, TransactionLog> = new Map();
|
|
43
56
|
updates = 0; // the number of updates to the list of logs that have occurred
|
|
44
57
|
rootStore: RocksDatabase;
|
|
58
|
+
corruptFrameScope: string;
|
|
45
59
|
reusableIterable = true; // flag indicating that iterable can be reused to resume iterating through audit log
|
|
46
60
|
// Highest structureVersion appended to each per-node TransactionLog, tracked per tableId. Drives the
|
|
47
61
|
// per-log HAS_STRUCTURE_UPDATE flag in put(). Keyed by (log, tableId): a per-node log interleaves entries
|
|
@@ -54,6 +68,10 @@ export class RocksTransactionLogStore extends EventEmitter {
|
|
|
54
68
|
super();
|
|
55
69
|
this.log = rootDatabase.useLog('local');
|
|
56
70
|
this.rootStore = rootDatabase;
|
|
71
|
+
// Break reports are keyed per log name, but every store has its own 'local' log, so they
|
|
72
|
+
// need a scope. The path, not `databaseName`: one root store can back several logical
|
|
73
|
+
// databases and they share these logs, and `databaseName` is not set on it yet here.
|
|
74
|
+
this.corruptFrameScope = rootDatabase.path;
|
|
57
75
|
}
|
|
58
76
|
|
|
59
77
|
/**
|
|
@@ -119,9 +137,8 @@ export class RocksTransactionLogStore extends EventEmitter {
|
|
|
119
137
|
}
|
|
120
138
|
if (this.listenerCount('aftercommit')) {
|
|
121
139
|
if (!(auditRecord instanceof Uint8Array)) {
|
|
122
|
-
const
|
|
123
|
-
if (
|
|
124
|
-
auditRecord.recordVersion = auditRecord.version;
|
|
140
|
+
const txnLogKey = options.transaction.getTimestamp?.();
|
|
141
|
+
if (txnLogKey != null) auditRecord.txnLogKey = txnLogKey;
|
|
125
142
|
}
|
|
126
143
|
(options.transaction.logEntries ??= []).push(auditRecord);
|
|
127
144
|
}
|
|
@@ -172,7 +189,7 @@ export class RocksTransactionLogStore extends EventEmitter {
|
|
|
172
189
|
if (entry.recordId === recordId && entry.tableId === tableId) {
|
|
173
190
|
return entry;
|
|
174
191
|
}
|
|
175
|
-
if (entry.
|
|
192
|
+
if (entry.txnLogKey !== key) return; // no longer in this transaction
|
|
176
193
|
}
|
|
177
194
|
} else {
|
|
178
195
|
// Harper puts some metadata in the database, we will just put this in the root store instead
|
|
@@ -231,6 +248,7 @@ export class RocksTransactionLogStore extends EventEmitter {
|
|
|
231
248
|
getRange(options: {
|
|
232
249
|
start?: number;
|
|
233
250
|
exactStart?: boolean;
|
|
251
|
+
exclusiveStart?: boolean;
|
|
234
252
|
end?: number;
|
|
235
253
|
log?: string | number;
|
|
236
254
|
excludeLogs?: string[];
|
|
@@ -238,9 +256,87 @@ export class RocksTransactionLogStore extends EventEmitter {
|
|
|
238
256
|
startByLog?: Map<string, number>;
|
|
239
257
|
startFromLastFlushed?: boolean;
|
|
240
258
|
readUncommitted?: boolean;
|
|
241
|
-
|
|
259
|
+
/** Include the source transaction-log name on each returned audit record. */
|
|
260
|
+
includeLogName?: boolean;
|
|
261
|
+
/** Validate and consume one complete exact-start transaction per entry in `startByLog`. */
|
|
262
|
+
resumeAfterExactStart?: boolean;
|
|
263
|
+
/**
|
|
264
|
+
* Track which version a break truncated, in `corruptFrameStop.truncatedVersions`. Costs two
|
|
265
|
+
* property stores per yielded entry (see below), so it defaults off: only boot replay reads
|
|
266
|
+
* `truncatedVersions`, but this range is also the always-on source for live subscriptions and
|
|
267
|
+
* replication, where every healthy entry would otherwise pay bookkeeping nothing consumes.
|
|
268
|
+
*/
|
|
269
|
+
trackCorruptTransactions?: boolean;
|
|
270
|
+
}): TransactionLogIterable {
|
|
242
271
|
let iterable = new ExtendedIterable<TransactionEntry>();
|
|
243
272
|
let aggregateIterator: TransactionLogIterator;
|
|
273
|
+
let singleLogIterator: TrackedIterator;
|
|
274
|
+
const attributeCorruption = options.trackCorruptTransactions === true;
|
|
275
|
+
const corruptFrameStop: CorruptFrameStop = { breaks: 0, truncatedVersions: new Set(), midLogBreak: false };
|
|
276
|
+
const failedLogs = new Set<string>();
|
|
277
|
+
const exactStartFailures = new Map<string, ExactStartFailure>();
|
|
278
|
+
const failedIterators = new WeakSet<IterableIterator<TransactionEntry>>();
|
|
279
|
+
const safeNext = (iterator: IterableIterator<TransactionEntry>, log: TransactionLog) => {
|
|
280
|
+
if (failedIterators.has(iterator)) return { value: undefined, done: true } as IteratorResult<TransactionEntry>;
|
|
281
|
+
try {
|
|
282
|
+
return iterator.next();
|
|
283
|
+
} catch (error) {
|
|
284
|
+
failedIterators.add(iterator);
|
|
285
|
+
failedLogs.add(log.name);
|
|
286
|
+
harperLogger.error('Transaction log iterator failed; terminating this log', error, {
|
|
287
|
+
log: log.name,
|
|
288
|
+
});
|
|
289
|
+
return { value: undefined, done: true } as IteratorResult<TransactionEntry>;
|
|
290
|
+
}
|
|
291
|
+
};
|
|
292
|
+
const resumePastExactStart = (
|
|
293
|
+
result: IteratorResult<TransactionEntry>,
|
|
294
|
+
iterator: TrackedIterator,
|
|
295
|
+
log: TransactionLog,
|
|
296
|
+
expected: number
|
|
297
|
+
): IteratorResult<TransactionEntry> => {
|
|
298
|
+
if (result.done || result.value.timestamp !== expected) {
|
|
299
|
+
exactStartFailures.set(log.name, 'missing');
|
|
300
|
+
return { value: undefined, done: true };
|
|
301
|
+
}
|
|
302
|
+
while (!result.value.endTxn) {
|
|
303
|
+
result = safeNext(iterator, log);
|
|
304
|
+
if (result.done || result.value.timestamp !== expected) {
|
|
305
|
+
exactStartFailures.set(log.name, 'incomplete');
|
|
306
|
+
return { value: undefined, done: true };
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
result = safeNext(iterator, log);
|
|
310
|
+
if (!result.done && result.value.timestamp === expected) {
|
|
311
|
+
exactStartFailures.set(log.name, 'duplicate');
|
|
312
|
+
return { value: undefined, done: true };
|
|
313
|
+
}
|
|
314
|
+
return result;
|
|
315
|
+
};
|
|
316
|
+
// Each log's iterator carries the version and endTxn of the last entry it yielded, so a break
|
|
317
|
+
// can be attributed to the source transaction whose remaining entries it swallowed — unless
|
|
318
|
+
// that entry's own endTxn already closed the transaction, in which case the break fell after
|
|
319
|
+
// it, not inside it. On the iterator itself, not in a map keyed by log: this is written per
|
|
320
|
+
// entry on the replay/broadcast path (when `attributeCorruption`), and it stays attached when a
|
|
321
|
+
// removed log is spliced out of the aggregate.
|
|
322
|
+
const trackCorruptFrames = (log: TransactionLog, queryOptions: typeof options): TrackedIterator => {
|
|
323
|
+
const report = reportCorruptFrame(`${this.corruptFrameScope}/${log.name}`);
|
|
324
|
+
const iterator: TrackedIterator = endIteratorOnCorruptFrame(log.query(queryOptions), (error) => {
|
|
325
|
+
corruptFrameStop.breaks++;
|
|
326
|
+
if (iterator.lastVersion !== undefined && iterator.lastEndTxn !== true) {
|
|
327
|
+
corruptFrameStop.truncatedVersions.add(iterator.lastVersion);
|
|
328
|
+
}
|
|
329
|
+
if (isMidLogBreak(error)) corruptFrameStop.midLogBreak = true;
|
|
330
|
+
report(error);
|
|
331
|
+
});
|
|
332
|
+
// Set here, once, rather than left for the per-entry write sites below to add these fields
|
|
333
|
+
// on their first call: every TrackedIterator then reaches its final shape before any entry
|
|
334
|
+
// is consumed, so the hot per-entry writes hit an already-stable shape instead of each
|
|
335
|
+
// triggering its own transition on that iterator's first entry.
|
|
336
|
+
iterator.lastVersion = undefined;
|
|
337
|
+
iterator.lastEndTxn = undefined;
|
|
338
|
+
return iterator;
|
|
339
|
+
};
|
|
244
340
|
if (options.log !== undefined) {
|
|
245
341
|
let log = typeof options.log === 'number' ? this.nodeLogs?.[options.log] : this.logByName.get(options.log);
|
|
246
342
|
if (!log) {
|
|
@@ -254,39 +350,43 @@ export class RocksTransactionLogStore extends EventEmitter {
|
|
|
254
350
|
log = this.rootStore.useLog(options.log);
|
|
255
351
|
}
|
|
256
352
|
}
|
|
257
|
-
const
|
|
258
|
-
|
|
353
|
+
const resumeAfterExactStart =
|
|
354
|
+
options.resumeAfterExactStart === true && options.exactStart === true && options.start !== undefined;
|
|
355
|
+
const queryOptions = resumeAfterExactStart ? { ...options, exclusiveStart: false } : options;
|
|
356
|
+
const queryIterator = trackCorruptFrames(log, queryOptions);
|
|
357
|
+
singleLogIterator = queryIterator;
|
|
358
|
+
let exactStartObserved = !resumeAfterExactStart;
|
|
359
|
+
iterable.iterate =
|
|
360
|
+
options.includeLogName || resumeAfterExactStart
|
|
361
|
+
? () => ({
|
|
362
|
+
next: () => {
|
|
363
|
+
let result = safeNext(queryIterator, log);
|
|
364
|
+
if (!exactStartObserved) {
|
|
365
|
+
exactStartObserved = true;
|
|
366
|
+
if (resumeAfterExactStart) result = resumePastExactStart(result, queryIterator, log, options.start);
|
|
367
|
+
}
|
|
368
|
+
if (!result.done && options.includeLogName) (result.value as NamedTransactionEntry).logName = log.name;
|
|
369
|
+
return result;
|
|
370
|
+
},
|
|
371
|
+
[Symbol.iterator]() {
|
|
372
|
+
return this;
|
|
373
|
+
},
|
|
374
|
+
return: (value?: any) => queryIterator.return?.(value) ?? { value, done: true },
|
|
375
|
+
throw: (error?: any) => {
|
|
376
|
+
if (queryIterator.throw) return queryIterator.throw(error);
|
|
377
|
+
throw error;
|
|
378
|
+
},
|
|
379
|
+
})
|
|
380
|
+
: () => queryIterator;
|
|
259
381
|
} else {
|
|
260
382
|
const onlyKeys = options.onlyKeys;
|
|
261
383
|
let logs: TransactionLog[] = [];
|
|
262
384
|
// holds the queue of next entries from each iterator
|
|
263
385
|
let nextEntries: any[];
|
|
264
386
|
let latestUpdates: number;
|
|
265
|
-
const iterators:
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
// updateIterators() never calls .next() on them again — otherwise every
|
|
269
|
-
// subsequent drain cycle would re-throw the same RangeError, spamming logs
|
|
270
|
-
// and burning CPU.
|
|
271
|
-
const failedIterators = new WeakSet<IterableIterator<TransactionEntry>>();
|
|
272
|
-
// Per-log advance that converts a thrown corrupt-entry error from rocksdb-js
|
|
273
|
-
// into a clean `done: true` for that iterator. The reader's RangeError leaves
|
|
274
|
-
// `position` at the bad entry; re-calling next() would re-throw indefinitely.
|
|
275
|
-
// Terminating just this log lets the aggregate keep draining the other peers'
|
|
276
|
-
// logs and prevents the throw from escaping into setImmediate-scheduled
|
|
277
|
-
// consumers (notifyFromTransactionData) where it becomes an uncaughtException.
|
|
278
|
-
const safeNext = (iterator: IterableIterator<TransactionEntry>, log?: TransactionLog) => {
|
|
279
|
-
if (failedIterators.has(iterator)) return { value: undefined, done: true };
|
|
280
|
-
try {
|
|
281
|
-
return iterator.next();
|
|
282
|
-
} catch (error) {
|
|
283
|
-
failedIterators.add(iterator);
|
|
284
|
-
harperLogger.error('Transaction log iterator failed; terminating this log', error, {
|
|
285
|
-
log: log?.name,
|
|
286
|
-
});
|
|
287
|
-
return { value: undefined, done: true };
|
|
288
|
-
}
|
|
289
|
-
};
|
|
387
|
+
const iterators: TrackedIterator[] = [];
|
|
388
|
+
const expectedExactStarts: Array<number | undefined> = [];
|
|
389
|
+
const observedExactStarts = new Set<string>();
|
|
290
390
|
const updateIterators = () => {
|
|
291
391
|
if (latestUpdates !== this.updates) {
|
|
292
392
|
const latestLogs = (this.nodeLogs || this.loadLogs()).filter(
|
|
@@ -296,16 +396,26 @@ export class RocksTransactionLogStore extends EventEmitter {
|
|
|
296
396
|
if (!logs.includes(log)) {
|
|
297
397
|
logs.push(log);
|
|
298
398
|
let queryOptions = options;
|
|
399
|
+
let expectedExactStart: number | undefined;
|
|
299
400
|
if (options.startByLog) {
|
|
300
|
-
|
|
301
|
-
|
|
401
|
+
if (options.startByLog.has(log.name)) {
|
|
402
|
+
expectedExactStart = options.startByLog.get(log.name)!;
|
|
403
|
+
queryOptions = {
|
|
404
|
+
...options,
|
|
405
|
+
start: expectedExactStart,
|
|
406
|
+
exclusiveStart: options.resumeAfterExactStart ? false : options.exclusiveStart,
|
|
407
|
+
};
|
|
408
|
+
} else {
|
|
409
|
+
queryOptions = { ...options, start: 0, exactStart: false, exclusiveStart: false };
|
|
410
|
+
}
|
|
302
411
|
} else if (latestUpdates >= 0) {
|
|
303
412
|
// if this is not the first update, that means that this is a brand new log and if start wasn't specified
|
|
304
413
|
// that means we are taking all future requests, so we need to start at zero so we don't introduce a race
|
|
305
414
|
// condition of potentially missing an initial update
|
|
306
415
|
queryOptions = { ...options, start: options.start ?? 0 };
|
|
307
416
|
}
|
|
308
|
-
iterators.push(
|
|
417
|
+
iterators.push(trackCorruptFrames(log, queryOptions));
|
|
418
|
+
expectedExactStarts.push(expectedExactStart);
|
|
309
419
|
}
|
|
310
420
|
}
|
|
311
421
|
latestUpdates = this.updates;
|
|
@@ -314,12 +424,22 @@ export class RocksTransactionLogStore extends EventEmitter {
|
|
|
314
424
|
let log = logs[i];
|
|
315
425
|
if (!latestLogs.includes(log)) {
|
|
316
426
|
logs.splice(i, 1);
|
|
317
|
-
iterators.splice(i
|
|
427
|
+
iterators.splice(i, 1);
|
|
428
|
+
expectedExactStarts.splice(i--, 1);
|
|
318
429
|
}
|
|
319
430
|
}
|
|
320
431
|
}
|
|
321
432
|
}
|
|
322
|
-
nextEntries = iterators.map((iterator, i) =>
|
|
433
|
+
nextEntries = iterators.map((iterator, i) => {
|
|
434
|
+
const result = safeNext(iterator, logs[i]);
|
|
435
|
+
const expected = expectedExactStarts[i];
|
|
436
|
+
if (expected !== undefined && !observedExactStarts.has(logs[i].name)) {
|
|
437
|
+
observedExactStarts.add(logs[i].name);
|
|
438
|
+
if (options.resumeAfterExactStart) return resumePastExactStart(result, iterator, logs[i], expected);
|
|
439
|
+
if (result.done || result.value.timestamp !== expected) exactStartFailures.set(logs[i].name, 'missing');
|
|
440
|
+
}
|
|
441
|
+
return result;
|
|
442
|
+
});
|
|
323
443
|
};
|
|
324
444
|
updateIterators();
|
|
325
445
|
|
|
@@ -362,7 +482,12 @@ export class RocksTransactionLogStore extends EventEmitter {
|
|
|
362
482
|
}
|
|
363
483
|
}
|
|
364
484
|
if (earliestIndex >= 0) {
|
|
365
|
-
|
|
485
|
+
if (options.includeLogName) (earliest as NamedTransactionEntry).logName = logs[earliestIndex].name;
|
|
486
|
+
if (attributeCorruption) {
|
|
487
|
+
// before the refill, which is where a break surfaces and needs this entry's version
|
|
488
|
+
iterators[earliestIndex].lastVersion = earliest.timestamp;
|
|
489
|
+
iterators[earliestIndex].lastEndTxn = earliest.endTxn;
|
|
490
|
+
}
|
|
366
491
|
nextEntries[earliestIndex] = safeNext(iterators[earliestIndex], logs[earliestIndex]);
|
|
367
492
|
return {
|
|
368
493
|
value: onlyKeys ? earliest.timestamp : earliest,
|
|
@@ -388,6 +513,7 @@ export class RocksTransactionLogStore extends EventEmitter {
|
|
|
388
513
|
if (index >= 0) {
|
|
389
514
|
logs.splice(index, 1);
|
|
390
515
|
iterators.splice(index, 1);
|
|
516
|
+
expectedExactStarts.splice(index, 1);
|
|
391
517
|
nextEntries.splice(index, 1);
|
|
392
518
|
options.excludeLogs.push(logName);
|
|
393
519
|
}
|
|
@@ -395,7 +521,14 @@ export class RocksTransactionLogStore extends EventEmitter {
|
|
|
395
521
|
};
|
|
396
522
|
iterable.iterate = () => aggregateIterator;
|
|
397
523
|
}
|
|
398
|
-
const mappedAggregateIterable = iterable.map(({ timestamp, data, endTxn }:
|
|
524
|
+
const mappedAggregateIterable = iterable.map(({ timestamp, data, endTxn, logName }: NamedTransactionEntry) => {
|
|
525
|
+
// A break surfaces on the pull after this entry, so recording it here is in time to attribute
|
|
526
|
+
// that break to this entry's transaction. The aggregate branch records its own, per source
|
|
527
|
+
// log, because there this callback cannot tell which log an entry came from.
|
|
528
|
+
if (attributeCorruption && singleLogIterator) {
|
|
529
|
+
singleLogIterator.lastVersion = timestamp;
|
|
530
|
+
singleLogIterator.lastEndTxn = endTxn;
|
|
531
|
+
}
|
|
399
532
|
// Per-entry try/catch: a corrupt rocks prelude (first 4-16 bytes) would otherwise
|
|
400
533
|
// throw a raw `RangeError: Offset is outside the bounds of the DataView` out
|
|
401
534
|
// through `iterable.map`, escape the for-of consumer, and land as an
|
|
@@ -421,10 +554,8 @@ export class RocksTransactionLogStore extends EventEmitter {
|
|
|
421
554
|
position += 8;
|
|
422
555
|
}
|
|
423
556
|
const auditRecord = readAuditEntry(data, position, undefined);
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
auditRecord.version = timestamp;
|
|
427
|
-
auditRecord.localTime = timestamp;
|
|
557
|
+
if (options.includeLogName) auditRecord.logName = logName;
|
|
558
|
+
auditRecord.txnLogKey = timestamp;
|
|
428
559
|
auditRecord.endTxn = endTxn;
|
|
429
560
|
auditRecord.previousResidencyId = previousResidencyId;
|
|
430
561
|
auditRecord.previousVersion = previousVersion;
|
|
@@ -436,7 +567,10 @@ export class RocksTransactionLogStore extends EventEmitter {
|
|
|
436
567
|
byteLength: data?.byteLength,
|
|
437
568
|
});
|
|
438
569
|
return {
|
|
570
|
+
// the log key is all this entry still yields; its record version is undecodable
|
|
439
571
|
version: timestamp,
|
|
572
|
+
txnLogKey: timestamp,
|
|
573
|
+
logName: options.includeLogName ? logName : undefined,
|
|
440
574
|
endTxn,
|
|
441
575
|
type: undefined,
|
|
442
576
|
tableId: undefined,
|
|
@@ -452,7 +586,10 @@ export class RocksTransactionLogStore extends EventEmitter {
|
|
|
452
586
|
mappedAggregateIterable.addLog = aggregateIterator.addLog;
|
|
453
587
|
mappedAggregateIterable.removeLog = aggregateIterator.removeLog;
|
|
454
588
|
}
|
|
455
|
-
|
|
589
|
+
mappedAggregateIterable.corruptFrameStop = corruptFrameStop;
|
|
590
|
+
mappedAggregateIterable.failedLogs = failedLogs;
|
|
591
|
+
mappedAggregateIterable.exactStartFailures = exactStartFailures;
|
|
592
|
+
return mappedAggregateIterable as TransactionLogIterable;
|
|
456
593
|
}
|
|
457
594
|
getKeys(_options?: any) {
|
|
458
595
|
return []; // TODO: implement this
|