@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
package/dist/resources/search.js
CHANGED
|
@@ -18,8 +18,10 @@ const ordered_binary_1 = require("ordered-binary");
|
|
|
18
18
|
const extended_iterable_1 = require("@harperfast/extended-iterable");
|
|
19
19
|
const Table_ts_1 = require("./Table.js");
|
|
20
20
|
const RecordEncoder_ts_1 = require("./RecordEncoder.js");
|
|
21
|
+
const DatabaseTransaction_ts_1 = require("./DatabaseTransaction.js");
|
|
21
22
|
const write_1 = require("./analytics/write");
|
|
22
23
|
const rocksdb_js_1 = require("@harperfast/rocksdb-js");
|
|
24
|
+
const Headers_ts_1 = require("../server/serverHelpers/Headers.js");
|
|
23
25
|
// these are ratios/percentages of overall table size
|
|
24
26
|
const OPEN_RANGE_ESTIMATE = 0.3;
|
|
25
27
|
const BETWEEN_ESTIMATE = 0.1;
|
|
@@ -130,7 +132,12 @@ function executeConditions(conditions, operator, table, txn, request, context, t
|
|
|
130
132
|
return executeConditions(condition.conditions, condition.operator, table, txn, request, context, transformToEntries, filtered
|
|
131
133
|
// recordAccess intentionally omitted: guards run once, at the top level (see above).
|
|
132
134
|
);
|
|
133
|
-
return searchByIndex(condition, txn, condition.descending || request.reverse === true, table,
|
|
135
|
+
return searchByIndex(condition, txn, condition.descending || request.reverse === true, table, {
|
|
136
|
+
allowFullScan: request.allowFullScan,
|
|
137
|
+
filtered,
|
|
138
|
+
context,
|
|
139
|
+
minResults: request.limit === 0 ? 0 : request.limit !== undefined ? (request.offset || 0) + request.limit : undefined,
|
|
140
|
+
});
|
|
134
141
|
}
|
|
135
142
|
function mapConditionsToFilters(conditions, intersection, estimatedIncomingCount) {
|
|
136
143
|
return conditions
|
|
@@ -213,19 +220,56 @@ function composeRecordFilter(recordFilters, table, context) {
|
|
|
213
220
|
};
|
|
214
221
|
}
|
|
215
222
|
/**
|
|
216
|
-
*
|
|
223
|
+
* A record's index entries are not adjacent — the composite `[indexedValue, primaryKey]` key sorts
|
|
224
|
+
* on the indexed value first — so comparing neighbours cannot collapse them and the scan has to
|
|
225
|
+
* remember what it already yielded (#2434).
|
|
226
|
+
*
|
|
227
|
+
* Heap cost is one key per distinct record in the scanned range, held for the life of the scan, and
|
|
228
|
+
* a page window does not cap it: sibling-condition and row filters run downstream, so a selective
|
|
229
|
+
* filter keeps the scan running and the set growing while the page fills. On a multi-million-row
|
|
230
|
+
* range that is hundreds of MB where main streamed at O(1). Accepted for #2434 over the bounded
|
|
231
|
+
* alternative, which costs a primary read per index entry.
|
|
232
|
+
*/
|
|
233
|
+
function distinctRecords(entries) {
|
|
234
|
+
const distinct = new extended_iterable_1.ExtendedIterable();
|
|
235
|
+
distinct.iterate = (options) => {
|
|
236
|
+
// A non-scalar key decodes to a fresh instance per entry, so identity never matches it;
|
|
237
|
+
// `writeKeyId` is the store's own key equality. Its bytes get their own set because a scalar
|
|
238
|
+
// string id can legitimately carry exactly those bytes, and one set would fold the two —
|
|
239
|
+
// the collision `flattenKey` has, and the reason Table.ts prefixes its key ids.
|
|
240
|
+
const yieldedKeys = new Set();
|
|
241
|
+
const yieldedEncodedKeys = new Set();
|
|
242
|
+
// map rather than filter: filter clears `continueOnRecoverableError` for everything below it
|
|
243
|
+
return entries
|
|
244
|
+
.map((primaryKey) => {
|
|
245
|
+
const isEncoded = typeof primaryKey === 'object' && primaryKey !== null;
|
|
246
|
+
const yielded = isEncoded ? yieldedEncodedKeys : yieldedKeys;
|
|
247
|
+
const identity = isEncoded ? (0, DatabaseTransaction_ts_1.writeKeyId)(primaryKey) : primaryKey;
|
|
248
|
+
if (yielded.has(identity))
|
|
249
|
+
return extended_iterable_1.SKIP;
|
|
250
|
+
yielded.add(identity);
|
|
251
|
+
return primaryKey;
|
|
252
|
+
})
|
|
253
|
+
.iterate(options);
|
|
254
|
+
};
|
|
255
|
+
return distinct;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Search for records or keys, based on the search condition, using an index if available. The four
|
|
259
|
+
* leading parameters are required at every call site; everything optional is named, so a new
|
|
260
|
+
* capability can be added without shifting positions at callers that don't use it.
|
|
217
261
|
* @param searchCondition
|
|
218
262
|
* @param transaction
|
|
219
263
|
* @param reverse
|
|
220
264
|
* @param Table
|
|
221
|
-
* @param
|
|
222
|
-
* @param filtered
|
|
265
|
+
* @param options
|
|
223
266
|
*/
|
|
224
|
-
function searchByIndex(searchCondition, transaction, reverse, Table,
|
|
225
|
-
//
|
|
226
|
-
//
|
|
227
|
-
|
|
228
|
-
|
|
267
|
+
function searchByIndex(searchCondition, transaction, reverse, Table, options = {}) {
|
|
268
|
+
// A stale positional caller passes `allowFullScan` here. Type checking only covers .ts callers, so
|
|
269
|
+
// fail loud rather than silently reading every option as undefined.
|
|
270
|
+
if (typeof options !== 'object' || options === null)
|
|
271
|
+
throw new TypeError('searchByIndex: the 5th argument is an options object (#2165), not a positional value');
|
|
272
|
+
const { allowFullScan, filtered, context, minResults } = options;
|
|
229
273
|
let attribute_name = searchCondition[0] ?? searchCondition.attribute;
|
|
230
274
|
let value = searchCondition[1] ?? searchCondition.value;
|
|
231
275
|
const comparator = searchCondition.comparator;
|
|
@@ -233,6 +277,9 @@ minResults) {
|
|
|
233
277
|
throw new hdbError_ts_1.ClientError(`Search condition for ${attribute_name} must have a value`);
|
|
234
278
|
}
|
|
235
279
|
let needFullScan;
|
|
280
|
+
// `[indexedValue, primaryKey]` is unique, so a scan that stays inside one indexed value cannot
|
|
281
|
+
// reach a record twice and skips the collapse below
|
|
282
|
+
let scansOneIndexedValue;
|
|
236
283
|
if (Array.isArray(attribute_name)) {
|
|
237
284
|
const firstAttributeName = attribute_name[0];
|
|
238
285
|
// get the potential relationship attribute
|
|
@@ -249,7 +296,7 @@ minResults) {
|
|
|
249
296
|
value,
|
|
250
297
|
comparator,
|
|
251
298
|
negated: searchCondition.negated,
|
|
252
|
-
}, transaction, reverse, relatedTable, allowFullScan, joined);
|
|
299
|
+
}, transaction, reverse, relatedTable, { allowFullScan, filtered: joined });
|
|
253
300
|
if (attribute.relationship.to) {
|
|
254
301
|
// this is one-to-many or many-to-many, so we need to track the filtering of related entries that match
|
|
255
302
|
filtered[attribute_name[0]] = joined;
|
|
@@ -261,7 +308,7 @@ minResults) {
|
|
|
261
308
|
const searchEntry = (relatedEntry) => {
|
|
262
309
|
if (relatedEntry?.key !== undefined)
|
|
263
310
|
relatedEntry = relatedEntry.key;
|
|
264
|
-
return searchByIndex({ attribute: attribute.relationship.from, value: relatedEntry }, transaction, reverse, Table, allowFullScan, joined);
|
|
311
|
+
return searchByIndex({ attribute: attribute.relationship.from, value: relatedEntry }, transaction, reverse, Table, { allowFullScan, filtered: joined });
|
|
265
312
|
};
|
|
266
313
|
if (attribute.elements) {
|
|
267
314
|
filtered[attribute_name[0]] = joined;
|
|
@@ -356,6 +403,7 @@ minResults) {
|
|
|
356
403
|
start = value;
|
|
357
404
|
end = value;
|
|
358
405
|
inclusiveEnd = true;
|
|
406
|
+
scansOneIndexedValue = true;
|
|
359
407
|
break;
|
|
360
408
|
case 'in':
|
|
361
409
|
// Phase 1: route through filter — index-merge optimization is a Phase 2 follow-up.
|
|
@@ -473,31 +521,117 @@ minResults) {
|
|
|
473
521
|
// exploring until it has enough MATCHING results, rather than post-filtering an under-filled
|
|
474
522
|
// candidate set. Only indexes that opt in (filteredSearch) receive it; others post-filter as before.
|
|
475
523
|
const recordFilter = index.customIndex.filteredSearch ? searchCondition.recordFilter : undefined;
|
|
476
|
-
const
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
524
|
+
const waiting = index.customIndex.filePrimary && searchCondition.waitForIndexMilliseconds > 0;
|
|
525
|
+
const start = waiting ? Promise.withResolvers() : undefined;
|
|
526
|
+
const controller = waiting ? new AbortController() : undefined;
|
|
527
|
+
const checkActive = waiting ? (0, DatabaseTransaction_ts_1.getReadTransactionGuard)(transaction) : undefined;
|
|
528
|
+
const signal = waiting
|
|
529
|
+
? context.signal
|
|
530
|
+
? AbortSignal.any([context.signal, controller.signal])
|
|
531
|
+
: controller.signal
|
|
532
|
+
: undefined;
|
|
533
|
+
const searchContext = waiting
|
|
534
|
+
? Object.create(context, {
|
|
535
|
+
signal: { value: signal },
|
|
536
|
+
indexSearchStart: { value: start.promise.then(() => checkActive?.()) },
|
|
537
|
+
})
|
|
538
|
+
: context;
|
|
539
|
+
const searched = index.customIndex.search(searchCondition, searchContext, {
|
|
540
|
+
filter: waiting && recordFilter
|
|
541
|
+
? (id) => {
|
|
542
|
+
if (signal.aborted)
|
|
543
|
+
return false;
|
|
544
|
+
checkActive?.();
|
|
545
|
+
return recordFilter(id);
|
|
546
|
+
}
|
|
547
|
+
: recordFilter,
|
|
548
|
+
minResults,
|
|
492
549
|
});
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
550
|
+
const coverage = searched.indexCoverage;
|
|
551
|
+
if (!waiting && coverage && context?.responseHeaders) {
|
|
552
|
+
(0, Headers_ts_1.appendHeader)(context.responseHeaders, 'Harper-Index-Coverage', `${coverage.state}; lag=${coverage.lagUpperBoundMilliseconds}; tolerance=${coverage.maxLagMilliseconds}`, true);
|
|
553
|
+
(0, Headers_ts_1.appendHeader)(context.responseHeaders, 'Access-Control-Expose-Headers', 'Harper-Index-Coverage', true);
|
|
554
|
+
}
|
|
555
|
+
const processEntries = (entries) => {
|
|
556
|
+
const loaded = entries
|
|
557
|
+
.map((entry) => {
|
|
558
|
+
// if the custom index returns an entry with metadata, merge it with the loaded entry
|
|
559
|
+
if (typeof entry === 'object' && entry) {
|
|
560
|
+
const { key, ...otherProps } = entry;
|
|
561
|
+
if (key == null)
|
|
562
|
+
return extended_iterable_1.SKIP; // primaryKey missing from HNSW node — skip rather than crash
|
|
563
|
+
const loadedEntry = Table.primaryStore.getEntry(key, {
|
|
564
|
+
transaction: waiting ? transaction : context && Table._readTxnForContext(context),
|
|
565
|
+
});
|
|
566
|
+
if (!loadedEntry)
|
|
567
|
+
return extended_iterable_1.SKIP; // record was deleted/expired or not yet visible
|
|
568
|
+
(0, Table_ts_1.freezeRecord)(loadedEntry?.value);
|
|
569
|
+
recordRead(loadedEntry);
|
|
570
|
+
return { ...otherProps, ...loadedEntry };
|
|
571
|
+
}
|
|
572
|
+
return entry;
|
|
573
|
+
})
|
|
574
|
+
.filter((entry) => entry !== extended_iterable_1.SKIP);
|
|
575
|
+
if (index.customIndex.rescoreResults) {
|
|
576
|
+
const rescored = index.customIndex.rescoreResults(loaded, searchCondition, comparator, attribute_name);
|
|
577
|
+
if (rescored != null)
|
|
578
|
+
return rescored;
|
|
579
|
+
}
|
|
580
|
+
return loaded;
|
|
581
|
+
};
|
|
582
|
+
if (typeof searched?.then === 'function') {
|
|
583
|
+
let settled = false;
|
|
584
|
+
const pending = waiting
|
|
585
|
+
? searched
|
|
586
|
+
.then((entries) => {
|
|
587
|
+
if (controller.signal.aborted)
|
|
588
|
+
return [];
|
|
589
|
+
if (signal.aborted)
|
|
590
|
+
throw signal.reason ?? new Error('Index search aborted', { cause: signal.reason });
|
|
591
|
+
checkActive?.();
|
|
592
|
+
return processEntries(entries);
|
|
593
|
+
})
|
|
594
|
+
.finally(() => {
|
|
595
|
+
settled = true;
|
|
596
|
+
})
|
|
597
|
+
: searched.then(processEntries);
|
|
598
|
+
// A consumer may abandon this lazy iterable without calling next().
|
|
599
|
+
pending.catch(() => { });
|
|
600
|
+
const results = new extended_iterable_1.ExtendedIterable();
|
|
601
|
+
results.iterate = (options) => {
|
|
602
|
+
if (!options?.async) {
|
|
603
|
+
throw new Error('This index resolves search results asynchronously; the results must be consumed with async iteration');
|
|
604
|
+
}
|
|
605
|
+
// Overlapping next() calls share one cursor and cannot duplicate its first entry.
|
|
606
|
+
const iteratorPromise = pending.then((entries) => entries[Symbol.iterator]());
|
|
607
|
+
iteratorPromise.catch(() => { });
|
|
608
|
+
let closed = false;
|
|
609
|
+
return {
|
|
610
|
+
next() {
|
|
611
|
+
if (closed)
|
|
612
|
+
return Promise.resolve({ done: true, value: undefined });
|
|
613
|
+
start?.resolve();
|
|
614
|
+
return iteratorPromise.then((inner) => {
|
|
615
|
+
if (closed)
|
|
616
|
+
return { done: true, value: undefined };
|
|
617
|
+
checkActive?.();
|
|
618
|
+
return inner.next();
|
|
619
|
+
});
|
|
620
|
+
},
|
|
621
|
+
return(value) {
|
|
622
|
+
closed = true;
|
|
623
|
+
if (!settled)
|
|
624
|
+
controller?.abort();
|
|
625
|
+
iteratorPromise.then((inner) => inner.return?.(value), () => { });
|
|
626
|
+
return Promise.resolve({ done: true, value });
|
|
627
|
+
},
|
|
628
|
+
};
|
|
629
|
+
};
|
|
630
|
+
return results;
|
|
497
631
|
}
|
|
498
|
-
return
|
|
632
|
+
return processEntries(searched);
|
|
499
633
|
}
|
|
500
|
-
|
|
634
|
+
const scanned = index.getRange(rangeOptions).map(filter
|
|
501
635
|
? function ({ key, value }) {
|
|
502
636
|
let recordMatcher;
|
|
503
637
|
if (typeof key === 'string' && key.length > terms_ts_1.MAX_SEARCH_KEY_LENGTH) {
|
|
@@ -520,6 +654,14 @@ minResults) {
|
|
|
520
654
|
}));
|
|
521
655
|
}
|
|
522
656
|
: ({ value }) => value);
|
|
657
|
+
// Collapsing AFTER the map is required, not incidental: the condition's own filter tests one
|
|
658
|
+
// element at a time, so a record whose first entry fails it and whose second passes must
|
|
659
|
+
// still be reached. Collapsing first would settle that record on the failing entry and drop
|
|
660
|
+
// it. Scoped to attributes the schema declares multi-valued; a runtime array under an
|
|
661
|
+
// undeclared attribute repeats the same way but stays outside this boundary.
|
|
662
|
+
return scansOneIndexedValue || !findAttribute(Table.attributes, attribute_name)?.elements
|
|
663
|
+
? scanned
|
|
664
|
+
: distinctRecords(scanned);
|
|
523
665
|
}
|
|
524
666
|
else {
|
|
525
667
|
return Table.primaryStore
|
|
@@ -1077,6 +1219,96 @@ function filterByType(searchCondition, Table, context, filtered, isPrimaryKey, e
|
|
|
1077
1219
|
return recordFilter;
|
|
1078
1220
|
}
|
|
1079
1221
|
}
|
|
1222
|
+
/**
|
|
1223
|
+
* Estimates a range comparator's entry count from the store's statistical estimate, blended with
|
|
1224
|
+
* the table-fraction heuristic by the estimate's confidence so low-confidence estimates degrade
|
|
1225
|
+
* to the old behavior. Returns undefined (caller falls back to the heuristic) when the store
|
|
1226
|
+
* cannot estimate, the shape is unexpected, or the executed range wouldn't match this one.
|
|
1227
|
+
*/
|
|
1228
|
+
function estimateRangeCondition(table, condition, searchType, fraction) {
|
|
1229
|
+
const attributeName = condition[0] ?? condition.attribute;
|
|
1230
|
+
const isPrimaryKey = attributeName === table.primaryKey;
|
|
1231
|
+
const store = isPrimaryKey ? table.primaryStore : usableIndex(table, attributeName);
|
|
1232
|
+
// LMDB-backed and custom index stores do not implement estimateCount
|
|
1233
|
+
if (typeof store?.estimateCount !== 'function')
|
|
1234
|
+
return undefined;
|
|
1235
|
+
let value = condition[1] ?? condition.value;
|
|
1236
|
+
if (value instanceof Date)
|
|
1237
|
+
value = value.getTime();
|
|
1238
|
+
let range;
|
|
1239
|
+
switch (searchType) {
|
|
1240
|
+
case 'lt':
|
|
1241
|
+
// `start: true` mirrors searchByIndex: `true` sorts above `null`, so an indexNulls
|
|
1242
|
+
// index's `[null, primaryKey]` entries are outside the executed range
|
|
1243
|
+
range = { start: true, end: value };
|
|
1244
|
+
break;
|
|
1245
|
+
case 'le':
|
|
1246
|
+
range = { start: true, end: value, inclusiveEnd: true };
|
|
1247
|
+
break;
|
|
1248
|
+
case 'gt':
|
|
1249
|
+
range = { start: value, exclusiveStart: true };
|
|
1250
|
+
break;
|
|
1251
|
+
case 'ge':
|
|
1252
|
+
range = { start: value };
|
|
1253
|
+
break;
|
|
1254
|
+
case 'between':
|
|
1255
|
+
case 'gele':
|
|
1256
|
+
case 'gelt':
|
|
1257
|
+
case 'gtlt':
|
|
1258
|
+
case 'gtle': {
|
|
1259
|
+
if (!Array.isArray(value))
|
|
1260
|
+
return undefined;
|
|
1261
|
+
let [start, end] = value;
|
|
1262
|
+
if (start instanceof Date)
|
|
1263
|
+
start = start.getTime();
|
|
1264
|
+
if (end instanceof Date)
|
|
1265
|
+
end = end.getTime();
|
|
1266
|
+
range = {
|
|
1267
|
+
start,
|
|
1268
|
+
end,
|
|
1269
|
+
inclusiveEnd: searchType === 'between' || searchType === 'gele' || searchType === 'gtle',
|
|
1270
|
+
exclusiveStart: searchType === 'gtlt' || searchType === 'gtle',
|
|
1271
|
+
};
|
|
1272
|
+
break;
|
|
1273
|
+
}
|
|
1274
|
+
case 'starts_with': {
|
|
1275
|
+
const prefix = value?.toString();
|
|
1276
|
+
if (!prefix)
|
|
1277
|
+
return undefined;
|
|
1278
|
+
range = { start: prefix, end: getStringPrefixUpperBound(prefix) };
|
|
1279
|
+
break;
|
|
1280
|
+
}
|
|
1281
|
+
case 'prefix': {
|
|
1282
|
+
let start = Array.isArray(value) ? value : [value, null];
|
|
1283
|
+
if (start[start.length - 1] != null)
|
|
1284
|
+
start = start.concat(null);
|
|
1285
|
+
const end = start.slice(0);
|
|
1286
|
+
end[end.length - 1] = ordered_binary_1.MAXIMUM_KEY;
|
|
1287
|
+
range = { start, end };
|
|
1288
|
+
break;
|
|
1289
|
+
}
|
|
1290
|
+
default:
|
|
1291
|
+
return undefined;
|
|
1292
|
+
}
|
|
1293
|
+
// Long string bounds get truncated + filtered at execution (searchByIndex), so the
|
|
1294
|
+
// executed range is wider than this one; don't estimate what won't be iterated.
|
|
1295
|
+
if ((typeof range.start === 'string' && range.start.length > terms_ts_1.MAX_SEARCH_KEY_LENGTH) ||
|
|
1296
|
+
(typeof range.end === 'string' && range.end.length > terms_ts_1.MAX_SEARCH_KEY_LENGTH)) {
|
|
1297
|
+
return undefined;
|
|
1298
|
+
}
|
|
1299
|
+
let count, confidence;
|
|
1300
|
+
try {
|
|
1301
|
+
({ count, confidence } = store.estimateCount(range) ?? {});
|
|
1302
|
+
}
|
|
1303
|
+
catch {
|
|
1304
|
+
// a concurrently closing/dropped store must degrade the plan, not fail the query
|
|
1305
|
+
return undefined;
|
|
1306
|
+
}
|
|
1307
|
+
if (!Number.isFinite(count) || count < 0 || !Number.isFinite(confidence) || confidence < 0 || confidence > 1)
|
|
1308
|
+
return undefined;
|
|
1309
|
+
const heuristic = fraction * estimatedEntryCount(table.primaryStore) + 1;
|
|
1310
|
+
return Math.max(1, Math.round(confidence * count + (1 - confidence) * heuristic));
|
|
1311
|
+
}
|
|
1080
1312
|
/** The index a condition can be driven by; searchByIndex refuses a rebuilding one, so it reads as absent. */
|
|
1081
1313
|
function usableIndex(table, attributeName) {
|
|
1082
1314
|
const index = attributeName == null ? undefined : table.indices[attributeName];
|
|
@@ -1133,6 +1365,14 @@ function estimateCondition(table) {
|
|
|
1133
1365
|
if (drivesRebuildingIndex(table, condition[0] ?? condition.attribute)) {
|
|
1134
1366
|
condition.estimated_count = Infinity;
|
|
1135
1367
|
}
|
|
1368
|
+
else if (condition.negated) {
|
|
1369
|
+
// a negated condition always executes as a full scan (searchByIndex forces
|
|
1370
|
+
// needFullScan), so follow the filter-only convention used by contains/ends_with:
|
|
1371
|
+
// estimate Infinity so its positive-range estimate can never win the driving-condition
|
|
1372
|
+
// ordering. Short-circuit here rather than computing (and discarding) a positive-range
|
|
1373
|
+
// estimate that would cross the native FFI boundary for nothing.
|
|
1374
|
+
condition.estimated_count = Infinity;
|
|
1375
|
+
}
|
|
1136
1376
|
else if (searchType === terms_ts_1.SEARCH_TYPES.EQUALS || !searchType) {
|
|
1137
1377
|
const attribute_name = condition[0] ?? condition.attribute;
|
|
1138
1378
|
if (attribute_name == null || attribute_name === table.primaryKey)
|
|
@@ -1191,12 +1431,15 @@ function estimateCondition(table) {
|
|
|
1191
1431
|
}
|
|
1192
1432
|
else
|
|
1193
1433
|
condition.estimated_count = Infinity;
|
|
1194
|
-
// for range queries (betweens, startsWith, greater, etc.), just arbitrarily guess
|
|
1195
1434
|
}
|
|
1196
1435
|
else if (searchType === 'starts_with' || searchType === 'prefix')
|
|
1197
|
-
condition.estimated_count =
|
|
1436
|
+
condition.estimated_count =
|
|
1437
|
+
estimateRangeCondition(table, condition, searchType, STARTS_WITH_ESTIMATE) ??
|
|
1438
|
+
STARTS_WITH_ESTIMATE * estimatedEntryCount(table.primaryStore) + 1;
|
|
1198
1439
|
else if (searchType === 'between')
|
|
1199
|
-
condition.estimated_count =
|
|
1440
|
+
condition.estimated_count =
|
|
1441
|
+
estimateRangeCondition(table, condition, searchType, BETWEEN_ESTIMATE) ??
|
|
1442
|
+
BETWEEN_ESTIMATE * estimatedEntryCount(table.primaryStore) + 1;
|
|
1200
1443
|
else if (searchType === 'sort') {
|
|
1201
1444
|
const attribute_name = condition[0] ?? condition.attribute;
|
|
1202
1445
|
const index = usableIndex(table, attribute_name);
|
|
@@ -1214,7 +1457,9 @@ function estimateCondition(table) {
|
|
|
1214
1457
|
// allow custom index to define its own estimation of counts
|
|
1215
1458
|
condition.estimated_count = index.customIndex.estimateCount(condition.value);
|
|
1216
1459
|
else
|
|
1217
|
-
condition.estimated_count =
|
|
1460
|
+
condition.estimated_count =
|
|
1461
|
+
estimateRangeCondition(table, condition, searchType, OPEN_RANGE_ESTIMATE) ??
|
|
1462
|
+
OPEN_RANGE_ESTIMATE * estimatedEntryCount(table.primaryStore) + 1;
|
|
1218
1463
|
}
|
|
1219
1464
|
// we give a condition significantly more weight/preference if we will be ordering by it
|
|
1220
1465
|
if (typeof condition.descending === 'boolean')
|
|
@@ -1427,6 +1672,7 @@ function parseBlock(query, expectedEnd) {
|
|
|
1427
1672
|
break;
|
|
1428
1673
|
case 'group-by':
|
|
1429
1674
|
recordError('group by is not implemented yet');
|
|
1675
|
+
break;
|
|
1430
1676
|
case 'sort':
|
|
1431
1677
|
query.sort = toSortObject(args);
|
|
1432
1678
|
break;
|