@harperfast/harper 5.0.0-alpha.10 → 5.0.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/bin/BinObjects.js +17 -0
- package/bin/cliOperations.js +157 -0
- package/bin/copyDb.ts +280 -0
- package/bin/harper.js +156 -0
- package/bin/install.js +15 -0
- package/bin/lite.js +5 -0
- package/bin/restart.js +201 -0
- package/bin/run.js +409 -0
- package/bin/status.js +65 -0
- package/bin/stop.js +22 -0
- package/bin/upgrade.js +134 -0
- package/components/Application.ts +646 -0
- package/components/ApplicationScope.ts +49 -0
- package/components/Component.ts +53 -0
- package/components/ComponentV1.ts +342 -0
- package/components/DEFAULT_CONFIG.ts +18 -0
- package/components/EntryHandler.ts +227 -0
- package/components/Logger.ts +14 -0
- package/components/OptionsWatcher.ts +354 -0
- package/components/PluginModule.ts +6 -0
- package/components/Scope.ts +329 -0
- package/components/componentLoader.ts +529 -0
- package/components/deriveCommonPatternBase.ts +31 -0
- package/components/deriveGlobOptions.ts +44 -0
- package/components/deriveURLPath.ts +57 -0
- package/components/operations.js +658 -0
- package/components/operationsValidation.js +246 -0
- package/components/packageComponent.ts +39 -0
- package/components/requestRestart.ts +26 -0
- package/components/resolveBaseURLPath.ts +38 -0
- package/components/status/ComponentStatus.ts +110 -0
- package/components/status/ComponentStatusRegistry.ts +251 -0
- package/components/status/api.ts +153 -0
- package/components/status/crossThread.ts +405 -0
- package/components/status/errors.ts +152 -0
- package/components/status/index.ts +44 -0
- package/components/status/internal.ts +65 -0
- package/components/status/registry.ts +12 -0
- package/components/status/types.ts +96 -0
- package/config/RootConfigWatcher.ts +59 -0
- package/config/configHelpers.ts +11 -0
- package/config/configUtils.js +967 -0
- package/config/harperConfigEnvVars.ts +641 -0
- package/dataLayer/CreateAttributeObject.js +25 -0
- package/dataLayer/CreateTableObject.js +11 -0
- package/dataLayer/DataLayerObjects.js +43 -0
- package/dataLayer/DeleteBeforeObject.js +22 -0
- package/dataLayer/DeleteObject.js +25 -0
- package/dataLayer/DropAttributeObject.js +11 -0
- package/dataLayer/GetBackupObject.js +22 -0
- package/dataLayer/InsertObject.js +24 -0
- package/dataLayer/ReadAuditLogObject.js +24 -0
- package/dataLayer/SQLSearch.js +1335 -0
- package/dataLayer/SearchByConditionsObject.js +61 -0
- package/dataLayer/SearchByHashObject.js +21 -0
- package/dataLayer/SearchObject.js +45 -0
- package/dataLayer/SqlSearchObject.js +14 -0
- package/dataLayer/UpdateObject.js +23 -0
- package/dataLayer/UpsertObject.js +23 -0
- package/dataLayer/bulkLoad.js +813 -0
- package/dataLayer/dataObjects/BulkLoadObjects.js +27 -0
- package/dataLayer/dataObjects/UpsertObject.js +23 -0
- package/dataLayer/delete.js +164 -0
- package/dataLayer/export.js +381 -0
- package/dataLayer/getBackup.js +40 -0
- package/dataLayer/harperBridge/BridgeMethods.js +81 -0
- package/dataLayer/harperBridge/ResourceBridge.ts +633 -0
- package/dataLayer/harperBridge/bridgeUtility/insertUpdateReturnObj.js +28 -0
- package/dataLayer/harperBridge/bridgeUtility/insertUpdateValidate.js +88 -0
- package/dataLayer/harperBridge/harperBridge.js +21 -0
- package/dataLayer/harperBridge/lmdbBridge/LMDBBridge.js +119 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/DeleteAuditLogsBeforeResults.js +19 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateAttribute.js +112 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateRecords.js +67 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateSchema.js +31 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateTable.js +94 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteAuditLogsBefore.js +98 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteRecords.js +89 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropAttribute.js +109 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropSchema.js +107 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropTable.js +137 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbFlush.js +35 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetBackup.js +111 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByHash.js +28 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByValue.js +29 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbReadAuditLog.js +207 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByConditions.js +156 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByHash.js +21 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByValue.js +30 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbTransaction.js +19 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpdateRecords.js +64 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpsertRecords.js +70 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBCreateAttributeObject.js +22 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBDeleteTransactionObject.js +23 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBInsertTransactionObject.js +22 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBTransactionObject.js +23 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpdateTransactionObject.js +24 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBUpsertTransactionObject.js +24 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/TableSizeObject.js +25 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializeHashSearch.js +21 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +157 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCheckForNewAttributes.js +94 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCreateTransactionsAuditEnvironment.js +39 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbGetTableSize.js +34 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbProcessRows.js +100 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbSearch.js +371 -0
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbWriteTransaction.js +109 -0
- package/dataLayer/hdbInfoController.js +254 -0
- package/dataLayer/insert.js +266 -0
- package/dataLayer/readAuditLog.js +59 -0
- package/dataLayer/schema.js +366 -0
- package/dataLayer/schemaDescribe.js +289 -0
- package/dataLayer/search.js +60 -0
- package/dataLayer/transaction.js +17 -0
- package/dataLayer/update.js +124 -0
- package/dist/components/Logger.d.ts +12 -0
- package/dist/components/Logger.js +3 -0
- package/dist/components/Logger.js.map +1 -0
- package/dist/components/Scope.d.ts +14 -4
- package/dist/components/Scope.js +18 -10
- package/dist/components/Scope.js.map +1 -1
- package/dist/components/componentLoader.js +16 -9
- package/dist/components/componentLoader.js.map +1 -1
- package/dist/components/operations.js +2 -2
- package/dist/components/operations.js.map +1 -1
- package/dist/config/configUtils.d.ts +1 -1
- package/dist/config/configUtils.js +1 -1
- package/dist/config/configUtils.js.map +1 -1
- package/dist/dataLayer/CreateTableObject.d.ts +2 -2
- package/dist/dataLayer/CreateTableObject.js +2 -2
- package/dist/dataLayer/CreateTableObject.js.map +1 -1
- package/dist/dataLayer/delete.d.ts +1 -1
- package/dist/dataLayer/schema.js +6 -5
- package/dist/dataLayer/schema.js.map +1 -1
- package/dist/dataLayer/schemaDescribe.js +1 -1
- package/dist/dataLayer/schemaDescribe.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/resources/DatabaseTransaction.d.ts +1 -1
- package/dist/resources/IterableEventQueue.d.ts +1 -1
- package/dist/resources/LMDBTransaction.d.ts +5 -1
- package/dist/resources/Resource.d.ts +1 -1
- package/dist/resources/RocksIndexStore.d.ts +3 -3
- package/dist/resources/RocksTransactionLogStore.d.ts +6 -3
- package/dist/resources/Table.d.ts +15 -6
- package/dist/resources/Table.js +4 -1
- package/dist/resources/Table.js.map +1 -1
- package/dist/resources/analytics/read.js +32 -22
- package/dist/resources/analytics/read.js.map +1 -1
- package/dist/resources/analytics/write.js +3 -6
- package/dist/resources/analytics/write.js.map +1 -1
- package/dist/resources/auditStore.d.ts +3 -3
- package/dist/resources/blob.d.ts +25 -2
- package/dist/resources/databases.d.ts +12 -2
- package/dist/resources/databases.js +22 -19
- package/dist/resources/databases.js.map +1 -1
- package/dist/resources/search.js +11 -5
- package/dist/resources/search.js.map +1 -1
- package/dist/resources/transaction.d.ts +2 -1
- package/dist/security/auth.js +1 -1
- package/dist/security/auth.js.map +1 -1
- package/dist/security/cryptoHash.d.ts +2 -2
- package/dist/security/jsLoader.js +243 -66
- package/dist/security/jsLoader.js.map +1 -1
- package/dist/security/keys.js +4 -5
- package/dist/security/keys.js.map +1 -1
- package/dist/security/user.js +3 -3
- package/dist/security/user.js.map +1 -1
- package/dist/server/REST.js +16 -2
- package/dist/server/REST.js.map +1 -1
- package/dist/server/Server.d.ts +2 -1
- package/dist/server/Server.js.map +1 -1
- package/dist/server/fastifyRoutes/plugins/hdbCore.d.ts +6 -1
- package/dist/server/fastifyRoutes.js +2 -0
- package/dist/server/fastifyRoutes.js.map +1 -1
- package/dist/server/http.js +12 -6
- package/dist/server/http.js.map +1 -1
- package/dist/server/jobs/JobObject.d.ts +3 -3
- package/dist/server/loadRootComponents.js +1 -0
- package/dist/server/loadRootComponents.js.map +1 -1
- package/dist/server/operationsServer.js +3 -1
- package/dist/server/operationsServer.js.map +1 -1
- package/dist/server/serverHelpers/JSONStream.d.ts +3 -3
- package/dist/server/serverHelpers/Request.d.ts +5 -5
- package/dist/server/serverHelpers/requestTimePlugin.d.ts +1 -1
- package/dist/server/threads/manageThreads.d.ts +2 -2
- package/dist/server/threads/manageThreads.js +50 -35
- package/dist/server/threads/manageThreads.js.map +1 -1
- package/dist/server/threads/socketRouter.d.ts +1 -1
- package/dist/sqlTranslator/deleteTranslator.d.ts +1 -1
- package/dist/utility/AWS/AWSConnector.d.ts +3 -2
- package/dist/utility/common_utils.d.ts +3 -3
- package/dist/utility/environment/systemInformation.d.ts +1 -0
- package/dist/utility/functions/date/dateFunctions.d.ts +11 -11
- package/dist/utility/globalSchema.d.ts +1 -1
- package/dist/utility/hdbTerms.d.ts +3 -0
- package/dist/utility/hdbTerms.js +3 -0
- package/dist/utility/hdbTerms.js.map +1 -1
- package/dist/utility/installation.d.ts +2 -4
- package/dist/utility/installation.js.map +1 -1
- package/dist/utility/lmdb/commonUtility.d.ts +1 -0
- package/dist/utility/lmdb/deleteUtility.d.ts +1 -0
- package/dist/utility/lmdb/environmentUtility.d.ts +1 -0
- package/dist/utility/lmdb/searchUtility.d.ts +2 -1
- package/dist/utility/lmdb/writeUtility.d.ts +1 -0
- package/dist/utility/logging/harper_logger.d.ts +6 -6
- package/dist/utility/processManagement/processManagement.d.ts +1 -1
- package/dist/utility/processManagement/servicesConfig.d.ts +12 -6
- package/dist/validation/common_validators.d.ts +4 -3
- package/dist/validation/configValidator.d.ts +3 -2
- package/index.d.ts +56 -0
- package/index.js +41 -0
- package/json/systemSchema.json +373 -0
- package/launchServiceScripts/launchHarperDB.js +3 -0
- package/launchServiceScripts/utility/checkNodeVersion.js +15 -0
- package/package.json +21 -3
- package/resources/DatabaseTransaction.ts +378 -0
- package/resources/ErrorResource.ts +57 -0
- package/resources/IterableEventQueue.ts +94 -0
- package/resources/LMDBTransaction.ts +349 -0
- package/resources/RecordEncoder.ts +702 -0
- package/resources/RequestTarget.ts +134 -0
- package/resources/Resource.ts +789 -0
- package/resources/ResourceInterface.ts +221 -0
- package/resources/ResourceInterfaceV2.ts +53 -0
- package/resources/ResourceV2.ts +67 -0
- package/resources/Resources.ts +162 -0
- package/resources/RocksIndexStore.ts +70 -0
- package/resources/RocksTransactionLogStore.ts +352 -0
- package/resources/Table.ts +4527 -0
- package/resources/analytics/hostnames.ts +72 -0
- package/resources/analytics/metadata.ts +10 -0
- package/resources/analytics/read.ts +252 -0
- package/resources/analytics/write.ts +803 -0
- package/resources/auditStore.ts +556 -0
- package/resources/blob.ts +1268 -0
- package/resources/crdt.ts +125 -0
- package/resources/dataLoader.ts +527 -0
- package/resources/databases.ts +1290 -0
- package/resources/graphql.ts +221 -0
- package/resources/indexes/HierarchicalNavigableSmallWorld.ts +638 -0
- package/resources/indexes/customIndexes.ts +7 -0
- package/resources/indexes/vector.ts +38 -0
- package/resources/jsResource.ts +86 -0
- package/resources/loadEnv.ts +22 -0
- package/resources/login.ts +18 -0
- package/resources/openApi.ts +409 -0
- package/resources/registrationDeprecated.ts +8 -0
- package/resources/replayLogs.ts +136 -0
- package/resources/roles.ts +98 -0
- package/resources/search.ts +1301 -0
- package/resources/tracked.ts +584 -0
- package/resources/transaction.ts +89 -0
- package/resources/transactionBroadcast.ts +258 -0
- package/security/auth.ts +376 -0
- package/security/certificateVerification/certificateVerificationSource.ts +84 -0
- package/security/certificateVerification/configValidation.ts +107 -0
- package/security/certificateVerification/crlVerification.ts +623 -0
- package/security/certificateVerification/index.ts +121 -0
- package/security/certificateVerification/ocspVerification.ts +148 -0
- package/security/certificateVerification/pkijs-ed25519-patch.ts +188 -0
- package/security/certificateVerification/types.ts +128 -0
- package/security/certificateVerification/verificationConfig.ts +138 -0
- package/security/certificateVerification/verificationUtils.ts +447 -0
- package/security/cryptoHash.js +42 -0
- package/security/data_objects/PermissionAttributeResponseObject.js +15 -0
- package/security/data_objects/PermissionResponseObject.js +115 -0
- package/security/data_objects/PermissionTableResponseObject.js +20 -0
- package/security/fastifyAuth.js +169 -0
- package/security/impersonation.ts +160 -0
- package/security/jsLoader.ts +716 -0
- package/security/keys.js +948 -0
- package/security/permissionsTranslator.js +300 -0
- package/security/role.js +218 -0
- package/security/tokenAuthentication.ts +228 -0
- package/security/user.ts +449 -0
- package/server/DurableSubscriptionsSession.ts +503 -0
- package/server/REST.ts +407 -0
- package/server/Server.ts +89 -0
- package/server/fastifyRoutes/helpers/getCORSOptions.js +36 -0
- package/server/fastifyRoutes/helpers/getHeaderTimeoutConfig.js +15 -0
- package/server/fastifyRoutes/helpers/getServerOptions.js +33 -0
- package/server/fastifyRoutes/plugins/hdbCore.js +39 -0
- package/server/fastifyRoutes.ts +205 -0
- package/server/graphqlQuerying.ts +700 -0
- package/server/http.ts +640 -0
- package/server/itc/serverHandlers.js +161 -0
- package/server/itc/utility/ITCEventObject.js +10 -0
- package/server/jobs/JobObject.js +24 -0
- package/server/jobs/jobProcess.js +69 -0
- package/server/jobs/jobRunner.js +162 -0
- package/server/jobs/jobs.js +304 -0
- package/server/loadRootComponents.js +44 -0
- package/server/mqtt.ts +485 -0
- package/server/nodeName.ts +75 -0
- package/server/operationsServer.ts +313 -0
- package/server/serverHelpers/Headers.ts +108 -0
- package/server/serverHelpers/JSONStream.ts +269 -0
- package/server/serverHelpers/OperationFunctionObject.ts +13 -0
- package/server/serverHelpers/Request.ts +158 -0
- package/server/serverHelpers/contentTypes.ts +637 -0
- package/server/serverHelpers/requestTimePlugin.js +57 -0
- package/server/serverHelpers/serverHandlers.js +148 -0
- package/server/serverHelpers/serverUtilities.ts +473 -0
- package/server/serverRegistry.ts +8 -0
- package/server/static.ts +187 -0
- package/server/status/definitions.ts +37 -0
- package/server/status/index.ts +125 -0
- package/server/storageReclamation.ts +93 -0
- package/server/threads/itc.js +89 -0
- package/server/threads/manageThreads.js +594 -0
- package/server/threads/socketRouter.ts +360 -0
- package/server/threads/threadServer.js +279 -0
- package/server/throttle.ts +73 -0
- package/sqlTranslator/SelectValidator.js +330 -0
- package/sqlTranslator/alasqlFunctionImporter.js +62 -0
- package/sqlTranslator/deleteTranslator.js +67 -0
- package/sqlTranslator/index.js +242 -0
- package/sqlTranslator/sql_statement_bucket.js +472 -0
- package/static/defaultConfig.yaml +3 -0
- package/studio/web/HDBDogOnly.svg +78 -0
- package/studio/web/assets/PPRadioGrotesk-Bold-DDaUYG8E.woff +0 -0
- package/studio/web/assets/fa-brands-400-CEJbCg16.woff +0 -0
- package/studio/web/assets/fa-brands-400-CSYNqBb_.ttf +0 -0
- package/studio/web/assets/fa-brands-400-DnkPfk3o.eot +0 -0
- package/studio/web/assets/fa-brands-400-UxlILjvJ.woff2 +0 -0
- package/studio/web/assets/fa-brands-400-cH1MgKbP.svg +3717 -0
- package/studio/web/assets/fa-regular-400-BhTwtT8w.eot +0 -0
- package/studio/web/assets/fa-regular-400-D1vz6WBx.ttf +0 -0
- package/studio/web/assets/fa-regular-400-DFnMcJPd.woff +0 -0
- package/studio/web/assets/fa-regular-400-DGzu1beS.woff2 +0 -0
- package/studio/web/assets/fa-regular-400-gwj8Pxq-.svg +801 -0
- package/studio/web/assets/fa-solid-900-B4ZZ7kfP.svg +5034 -0
- package/studio/web/assets/fa-solid-900-B6Axprfb.eot +0 -0
- package/studio/web/assets/fa-solid-900-BUswJgRo.woff2 +0 -0
- package/studio/web/assets/fa-solid-900-DOXgCApm.woff +0 -0
- package/studio/web/assets/fa-solid-900-mxuxnBEa.ttf +0 -0
- package/studio/web/assets/index-BTgXJX9d.js +235 -0
- package/studio/web/assets/index-BTgXJX9d.js.map +1 -0
- package/studio/web/assets/index-C-GXfcup.js +37 -0
- package/studio/web/assets/index-C-GXfcup.js.map +1 -0
- package/studio/web/assets/index-PFlNdimM.js +2 -0
- package/studio/web/assets/index-PFlNdimM.js.map +1 -0
- package/studio/web/assets/index-Y2g_iFpU.css +1 -0
- package/studio/web/assets/index-jiPwkrsB.css +1 -0
- package/studio/web/assets/index.lazy-C3TJZJ4o.js +266 -0
- package/studio/web/assets/index.lazy-C3TJZJ4o.js.map +1 -0
- package/studio/web/assets/profiler-DotzgiCJ.js +2 -0
- package/studio/web/assets/profiler-DotzgiCJ.js.map +1 -0
- package/studio/web/assets/react-redux-VxUEx_mU.js +6 -0
- package/studio/web/assets/react-redux-VxUEx_mU.js.map +1 -0
- package/studio/web/assets/startRecording-B_9J9Csd.js +3 -0
- package/studio/web/assets/startRecording-B_9J9Csd.js.map +1 -0
- package/studio/web/fabric-signup-background.webp +0 -0
- package/studio/web/fabric-signup-text.png +0 -0
- package/studio/web/favicon_purple.png +0 -0
- package/studio/web/github-icon.svg +15 -0
- package/studio/web/harper-fabric_black.png +0 -0
- package/studio/web/harper-fabric_white.png +0 -0
- package/studio/web/harper-studio_white.png +0 -0
- package/studio/web/index.html +16 -0
- package/studio/web/running.css +148 -0
- package/studio/web/running.html +147 -0
- package/studio/web/running.js +111 -0
- package/upgrade/UpgradeObjects.js +13 -0
- package/upgrade/directives/directivesController.js +90 -0
- package/upgrade/directivesManager.js +139 -0
- package/upgrade/upgradePrompt.js +124 -0
- package/upgrade/upgradeUtilities.js +28 -0
- package/utility/AWS/AWSConnector.js +29 -0
- package/utility/OperationFunctionCaller.js +63 -0
- package/utility/assignCmdEnvVariables.js +62 -0
- package/utility/common_utils.js +867 -0
- package/utility/environment/environmentManager.js +208 -0
- package/utility/environment/systemInformation.js +355 -0
- package/utility/errors/commonErrors.js +267 -0
- package/utility/errors/hdbError.js +146 -0
- package/utility/functions/date/dateFunctions.js +65 -0
- package/utility/functions/geo.js +355 -0
- package/utility/functions/sql/alaSQLExtension.js +104 -0
- package/utility/globalSchema.js +35 -0
- package/utility/hdbTerms.ts +819 -0
- package/utility/install/checkJWTTokensExist.js +62 -0
- package/utility/install/harperdb.conf +15 -0
- package/utility/install/harperdb.service +14 -0
- package/utility/install/installer.js +635 -0
- package/utility/installation.ts +30 -0
- package/utility/lmdb/DBIDefinition.js +20 -0
- package/utility/lmdb/DeleteRecordsResponseObject.js +25 -0
- package/utility/lmdb/InsertRecordsResponseObject.js +22 -0
- package/utility/lmdb/OpenDBIObject.js +31 -0
- package/utility/lmdb/OpenEnvironmentObject.js +41 -0
- package/utility/lmdb/UpdateRecordsResponseObject.js +25 -0
- package/utility/lmdb/UpsertRecordsResponseObject.js +22 -0
- package/utility/lmdb/cleanLMDBMap.js +65 -0
- package/utility/lmdb/commonUtility.js +119 -0
- package/utility/lmdb/deleteUtility.js +128 -0
- package/utility/lmdb/environmentUtility.js +477 -0
- package/utility/lmdb/searchCursorFunctions.js +187 -0
- package/utility/lmdb/searchUtility.js +918 -0
- package/utility/lmdb/terms.js +57 -0
- package/utility/lmdb/writeUtility.js +407 -0
- package/utility/logging/harper_logger.js +876 -0
- package/utility/logging/logRotator.js +157 -0
- package/utility/logging/logger.ts +24 -0
- package/utility/logging/readLog.js +355 -0
- package/utility/logging/transactionLog.js +57 -0
- package/utility/mount_hdb.js +59 -0
- package/utility/npmUtilities.js +102 -0
- package/utility/operationPermissions.ts +112 -0
- package/utility/operation_authorization.js +836 -0
- package/utility/packageUtils.js +55 -0
- package/utility/password.ts +99 -0
- package/utility/processManagement/processManagement.js +187 -0
- package/utility/processManagement/servicesConfig.js +56 -0
- package/utility/scripts/restartHdb.js +24 -0
- package/utility/scripts/user_data.sh +13 -0
- package/utility/signalling.js +36 -0
- package/utility/terms/certificates.js +81 -0
- package/utility/when.ts +20 -0
- package/v1.d.ts +39 -0
- package/v1.js +41 -0
- package/v2.d.ts +39 -0
- package/v2.js +41 -0
- package/validation/bulkDeleteValidator.js +24 -0
- package/validation/check_permissions.js +19 -0
- package/validation/common_validators.js +95 -0
- package/validation/configValidator.js +331 -0
- package/validation/deleteValidator.js +15 -0
- package/validation/fileLoadValidator.js +153 -0
- package/validation/insertValidator.js +40 -0
- package/validation/installValidator.js +37 -0
- package/validation/readLogValidator.js +64 -0
- package/validation/role_validation.js +320 -0
- package/validation/schemaMetadataValidator.js +42 -0
- package/validation/searchValidator.js +166 -0
- package/validation/statusValidator.ts +66 -0
- package/validation/transactionLogValidator.js +33 -0
- package/validation/user_validation.js +55 -0
- package/validation/validationWrapper.js +105 -0
- package/dist/resources/analytics/profile.d.ts +0 -2
- package/dist/resources/analytics/profile.js +0 -144
- package/dist/resources/analytics/profile.js.map +0 -1
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
import { Transaction as LMDBTransaction } from 'lmdb';
|
|
2
|
+
import { getNextMonotonicTime } from '../utility/lmdb/commonUtility.js';
|
|
3
|
+
import { ServerError } from '../utility/errors/hdbError.js';
|
|
4
|
+
import * as harperLogger from '../utility/logging/harper_logger.js';
|
|
5
|
+
import type { Context, Id } from './ResourceInterface.ts';
|
|
6
|
+
import * as envMngr from '../utility/environment/environmentManager.js';
|
|
7
|
+
import { CONFIG_PARAMS } from '../utility/hdbTerms.ts';
|
|
8
|
+
import { convertToMS } from '../utility/common_utils.js';
|
|
9
|
+
import { when } from '../utility/when.ts';
|
|
10
|
+
import { Transaction as RocksTransaction, type Store as RocksStore } from '@harperfast/rocksdb-js';
|
|
11
|
+
import type { RootDatabaseKind } from './databases.ts';
|
|
12
|
+
import type { Entry } from './RecordEncoder.ts';
|
|
13
|
+
|
|
14
|
+
const trackedTxns = new Set<DatabaseTransaction>();
|
|
15
|
+
const MAX_OUTSTANDING_TXN_DURATION = convertToMS(envMngr.get(CONFIG_PARAMS.STORAGE_MAXTRANSACTIONQUEUETIME)) || 45000; // Allow write transactions to be queued for up to 25 seconds before we start rejecting them
|
|
16
|
+
const DEBUG_LONG_TXNS = envMngr.get(CONFIG_PARAMS.STORAGE_DEBUGLONGTRANSACTIONS);
|
|
17
|
+
export const TRANSACTION_STATE = {
|
|
18
|
+
CLOSED: 0, // the transaction has been committed or aborted and can no longer be used for writes (if read txn is active, it can be used for reads)
|
|
19
|
+
OPEN: 1, // the transaction is open and can be used for reads and writes
|
|
20
|
+
LINGERING: 2, // the transaction has completed a read, but can be used for immediate writes
|
|
21
|
+
};
|
|
22
|
+
let outstandingCommit, outstandingCommitStart;
|
|
23
|
+
let confirmReplication;
|
|
24
|
+
export function replicationConfirmation(callback) {
|
|
25
|
+
confirmReplication = callback;
|
|
26
|
+
}
|
|
27
|
+
let txnExpiration = envMngr.get(CONFIG_PARAMS.STORAGE_MAXTRANSACTIONOPENTIME) ?? 30000;
|
|
28
|
+
|
|
29
|
+
class StartedTransaction extends Error {}
|
|
30
|
+
|
|
31
|
+
type MaybePromise<T> = T | Promise<T>;
|
|
32
|
+
|
|
33
|
+
export type CommitOptions = {
|
|
34
|
+
doneWriting?: boolean;
|
|
35
|
+
timestamp?: number;
|
|
36
|
+
retries?: number;
|
|
37
|
+
flush?: boolean;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
type ReadTransaction = (LMDBTransaction | RocksTransaction) & {
|
|
41
|
+
openTimer?: number;
|
|
42
|
+
retryRisk?: number;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export type TransactionWrite = {
|
|
46
|
+
key: Id;
|
|
47
|
+
store: RootDatabaseKind;
|
|
48
|
+
invalidated?: boolean;
|
|
49
|
+
entry?: Partial<Entry>;
|
|
50
|
+
before?: () => void | Promise<void>;
|
|
51
|
+
beforeIntermediate?: () => void | Promise<void>;
|
|
52
|
+
commit?: (txnTime: number, existingEntry: Entry, retry: boolean, transaction: RocksTransaction) => void;
|
|
53
|
+
validate?: (txnTime: number) => void;
|
|
54
|
+
fullUpdate?: boolean;
|
|
55
|
+
saved?: boolean;
|
|
56
|
+
deferSave?: boolean;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
type RocksTransactionWithRetry = RocksTransaction & { isRetry?: boolean };
|
|
60
|
+
|
|
61
|
+
export class DatabaseTransaction implements Transaction {
|
|
62
|
+
#context: Context;
|
|
63
|
+
writes: TransactionWrite[] = []; // the set of writes to commit if the conditions are met
|
|
64
|
+
completions: Promise<void>[] = []; // the set of outstanding async operations to complete
|
|
65
|
+
db: RootDatabaseKind;
|
|
66
|
+
transaction: RocksTransactionWithRetry;
|
|
67
|
+
readTxn: ReadTransaction;
|
|
68
|
+
readTxnRefCount: number;
|
|
69
|
+
readTxnsUsed: number;
|
|
70
|
+
timeout: number;
|
|
71
|
+
validated = 0;
|
|
72
|
+
timestamp = 0;
|
|
73
|
+
retries = 0;
|
|
74
|
+
declare next: DatabaseTransaction;
|
|
75
|
+
declare stale: boolean;
|
|
76
|
+
declare startedFrom?: {
|
|
77
|
+
resourceName: string;
|
|
78
|
+
method: string;
|
|
79
|
+
};
|
|
80
|
+
declare stackTraces?: StartedTransaction[];
|
|
81
|
+
overloadChecked: boolean;
|
|
82
|
+
open = TRANSACTION_STATE.OPEN;
|
|
83
|
+
replicatedConfirmation: number;
|
|
84
|
+
|
|
85
|
+
getReadTxn(): ReadTransaction {
|
|
86
|
+
this.readTxnRefCount = (this.readTxnRefCount || 0) + 1;
|
|
87
|
+
this.timeout = txnExpiration; // reset the timeout
|
|
88
|
+
if (this.transaction) {
|
|
89
|
+
if (this.transaction.openTimer) this.transaction.openTimer = 0;
|
|
90
|
+
return this.transaction;
|
|
91
|
+
}
|
|
92
|
+
if (this.open !== TRANSACTION_STATE.OPEN) return; // can not start a new read transaction as there is no future commit that will take place, just have to allow the read to latest database state
|
|
93
|
+
|
|
94
|
+
this.transaction = new RocksTransaction(this.db.store);
|
|
95
|
+
if (this.timestamp) {
|
|
96
|
+
this.transaction.setTimestamp(this.timestamp);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
this.readTxnsUsed = 1;
|
|
100
|
+
if (DEBUG_LONG_TXNS) {
|
|
101
|
+
this.stackTraces = [new StartedTransaction()];
|
|
102
|
+
}
|
|
103
|
+
if (this.transaction.openTimer) this.transaction.openTimer = 0;
|
|
104
|
+
trackedTxns.add(this);
|
|
105
|
+
return this.transaction;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
useReadTxn() {
|
|
109
|
+
const readTxn = this.getReadTxn();
|
|
110
|
+
if (DEBUG_LONG_TXNS) this.stackTraces.push(new StartedTransaction());
|
|
111
|
+
this.readTxnsUsed++;
|
|
112
|
+
return readTxn;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
doneReadTxn() {
|
|
116
|
+
if (!this.transaction) return;
|
|
117
|
+
if (--this.readTxnsUsed === 0) {
|
|
118
|
+
trackedTxns.delete(this);
|
|
119
|
+
this.transaction?.abort();
|
|
120
|
+
this.transaction = null;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
disregardReadTxn(): void {
|
|
125
|
+
if (--this.readTxnRefCount === 0 && this.readTxnsUsed === 1) {
|
|
126
|
+
this.doneReadTxn();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
checkOverloaded() {
|
|
131
|
+
if (
|
|
132
|
+
outstandingCommit &&
|
|
133
|
+
!this.overloadChecked &&
|
|
134
|
+
performance.now() - outstandingCommitStart > MAX_OUTSTANDING_TXN_DURATION
|
|
135
|
+
) {
|
|
136
|
+
throw new ServerError('Outstanding write transactions have too long of queue, please try again later', 503);
|
|
137
|
+
}
|
|
138
|
+
this.overloadChecked = true; // only check this once, don't interrupt ongoing transactions that have already made writes
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
addWrite(operation: TransactionWrite) {
|
|
142
|
+
if (this.open === TRANSACTION_STATE.CLOSED) {
|
|
143
|
+
throw new Error('Can not use a transaction that is no longer open');
|
|
144
|
+
}
|
|
145
|
+
this.writes.push(operation);
|
|
146
|
+
if (!operation.deferSave) {
|
|
147
|
+
// Setting saved to false means to defer saving
|
|
148
|
+
this.save(operation);
|
|
149
|
+
}
|
|
150
|
+
return operation;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
save(operation: TransactionWrite, reloadEntry = false) {
|
|
154
|
+
let txnTime = this.timestamp;
|
|
155
|
+
if (!this.transaction) {
|
|
156
|
+
this.transaction = new RocksTransaction(this.db.store as RocksStore);
|
|
157
|
+
if (txnTime) {
|
|
158
|
+
this.transaction.setTimestamp(txnTime);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (this.retries > 0) {
|
|
162
|
+
// this is marks the rocks transaction as a retry so we don't write the transaction log again
|
|
163
|
+
this.transaction.isRetry = true;
|
|
164
|
+
}
|
|
165
|
+
if (!txnTime) txnTime = this.timestamp = this.transaction.getTimestamp();
|
|
166
|
+
if (reloadEntry || operation.entry === undefined) {
|
|
167
|
+
operation.entry = operation.store.getEntry(operation.key, { transaction: this.transaction });
|
|
168
|
+
}
|
|
169
|
+
operation.saved = true;
|
|
170
|
+
// immediately execute in this transaction
|
|
171
|
+
if (operation.validate?.(txnTime) === false) return;
|
|
172
|
+
let result: Promise<void> = operation.before?.() as Promise<void>;
|
|
173
|
+
if (result?.then) this.completions.push(result);
|
|
174
|
+
result = operation.beforeIntermediate?.() as Promise<void>;
|
|
175
|
+
if (result?.then) this.completions.push(result);
|
|
176
|
+
operation.commit(txnTime, operation.entry, this.retries > 0, this.transaction);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Resolves with information on the timestamp and success of the commit
|
|
181
|
+
*/
|
|
182
|
+
commit(options: CommitOptions = {}): MaybePromise<CommitResolution> {
|
|
183
|
+
for (let i = 0; i < this.writes.length; i++) {
|
|
184
|
+
let operation = this.writes[i];
|
|
185
|
+
if (this.retries === 0 && operation.saved) continue;
|
|
186
|
+
this.save(operation, i < this.validated);
|
|
187
|
+
}
|
|
188
|
+
this.validated = this.writes.length;
|
|
189
|
+
return when(this.completions.length > 0 ? Promise.all(this.completions) : null, () => {
|
|
190
|
+
let commitResolution: MaybePromise<void>;
|
|
191
|
+
if (--this.readTxnsUsed > 0) {
|
|
192
|
+
// we still have outstanding iterators using the transaction, we can't just commit/abort it, we will still
|
|
193
|
+
// need to use it
|
|
194
|
+
commitResolution =
|
|
195
|
+
this.writes.length > 0
|
|
196
|
+
? this.transaction?.commit({ renewAfterCommit: true /* Try to use RocksDB's CommitAndTryCreateSnapshot */ })
|
|
197
|
+
: // don't abort, we still have outstanding reads to complete
|
|
198
|
+
null;
|
|
199
|
+
} else {
|
|
200
|
+
// no more reads need to be performed, just commit/abort based if there are any writes
|
|
201
|
+
trackedTxns.delete(this);
|
|
202
|
+
if (this.transaction) {
|
|
203
|
+
if (this.writes.length > 0) {
|
|
204
|
+
commitResolution = this.transaction.commit();
|
|
205
|
+
} else {
|
|
206
|
+
commitResolution = this.transaction.abort();
|
|
207
|
+
this.transaction = null; // immediately clear transaction, no need to wait
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
if (commitResolution) {
|
|
213
|
+
if (!outstandingCommit) {
|
|
214
|
+
outstandingCommit = commitResolution;
|
|
215
|
+
outstandingCommitStart = performance.now();
|
|
216
|
+
outstandingCommit.finally(() => {
|
|
217
|
+
outstandingCommit = null;
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
const completions = [];
|
|
221
|
+
return commitResolution.then(
|
|
222
|
+
() => {
|
|
223
|
+
this.transaction.onCommit?.();
|
|
224
|
+
this.transaction = null; // the native transaction is done (reset if needed)
|
|
225
|
+
if (this.next) {
|
|
226
|
+
completions.push(this.next.commit(options));
|
|
227
|
+
}
|
|
228
|
+
if (options?.flush) {
|
|
229
|
+
completions.push(this.writes[0].store.flushed);
|
|
230
|
+
}
|
|
231
|
+
if (this.replicatedConfirmation) {
|
|
232
|
+
// if we want to wait for replication confirmation, we need to track the transaction times
|
|
233
|
+
// and when replication notifications come in, we count the number of confirms until we reach the desired number
|
|
234
|
+
const databaseName = this.writes[0].store.rootStore.databaseName;
|
|
235
|
+
const lastWrite = this.writes[this.writes.length - 1];
|
|
236
|
+
if (confirmReplication && lastWrite) {
|
|
237
|
+
completions.push(
|
|
238
|
+
confirmReplication(
|
|
239
|
+
databaseName,
|
|
240
|
+
lastWrite.store.getEntry(lastWrite.key).version,
|
|
241
|
+
this.replicatedConfirmation
|
|
242
|
+
)
|
|
243
|
+
);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
// now reset transactions tracking; this transaction be reused and committed again
|
|
247
|
+
this.writes = [];
|
|
248
|
+
if (this.#context?.resourceCache) this.#context.resourceCache = null;
|
|
249
|
+
this.next = null;
|
|
250
|
+
let txnTime = this.timestamp;
|
|
251
|
+
this.timestamp = 0; // reset the timestamp as well
|
|
252
|
+
return Promise.all(completions).then(() => {
|
|
253
|
+
return {
|
|
254
|
+
txnTime,
|
|
255
|
+
};
|
|
256
|
+
});
|
|
257
|
+
},
|
|
258
|
+
(error) => {
|
|
259
|
+
if (error.code === 'ERR_BUSY') {
|
|
260
|
+
// if the transaction failed due to concurrent changes, we need to retry. First record this as an increased risk of contention/retry
|
|
261
|
+
// for future transactions
|
|
262
|
+
this.retries++;
|
|
263
|
+
return this.commit(options); // try again
|
|
264
|
+
} else throw error;
|
|
265
|
+
}
|
|
266
|
+
);
|
|
267
|
+
}
|
|
268
|
+
const txnResolution: CommitResolution = {
|
|
269
|
+
txnTime: this.timestamp,
|
|
270
|
+
};
|
|
271
|
+
if (this.next) {
|
|
272
|
+
// now run any other transactions
|
|
273
|
+
options.timestamp = this.timestamp;
|
|
274
|
+
const nextResolution = this.next?.commit(options);
|
|
275
|
+
if (nextResolution?.then)
|
|
276
|
+
return nextResolution?.then((nextResolution) => ({
|
|
277
|
+
txnTime: this.timestamp,
|
|
278
|
+
next: nextResolution,
|
|
279
|
+
}));
|
|
280
|
+
txnResolution.next = nextResolution;
|
|
281
|
+
}
|
|
282
|
+
return txnResolution;
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
abort(): void {
|
|
286
|
+
while (this.readTxnsUsed > 0) this.doneReadTxn(); // release the read snapshot when we abort, we assume we don't need it
|
|
287
|
+
this.open = TRANSACTION_STATE.CLOSED;
|
|
288
|
+
// reset the transaction
|
|
289
|
+
this.writes = [];
|
|
290
|
+
if (this.#context?.resourceCache) this.#context.resourceCache = null;
|
|
291
|
+
}
|
|
292
|
+
directCommitSync(): void {
|
|
293
|
+
trackedTxns.delete(this);
|
|
294
|
+
this.transaction?.commitSync();
|
|
295
|
+
}
|
|
296
|
+
getContext() {
|
|
297
|
+
return this.#context;
|
|
298
|
+
}
|
|
299
|
+
setContext(context) {
|
|
300
|
+
this.#context = context;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
export interface CommitResolution {
|
|
304
|
+
txnTime: number;
|
|
305
|
+
next?: CommitResolution;
|
|
306
|
+
}
|
|
307
|
+
export interface Transaction {
|
|
308
|
+
commit(options): MaybePromise<CommitResolution>;
|
|
309
|
+
abort?(): any;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
export class ImmediateTransaction extends DatabaseTransaction {
|
|
313
|
+
isCommitting = false;
|
|
314
|
+
constructor(db: RootDatabaseKind) {
|
|
315
|
+
super();
|
|
316
|
+
this.db = db;
|
|
317
|
+
}
|
|
318
|
+
save(transaction: ImmediateTransaction) {
|
|
319
|
+
if (this.isCommitting) {
|
|
320
|
+
// if we are in the commit, do the save and force a reload so we get a read within the transaction
|
|
321
|
+
super.save(transaction, true);
|
|
322
|
+
} else {
|
|
323
|
+
this.isCommitting = true;
|
|
324
|
+
return when(this.commit(), () => {
|
|
325
|
+
this.isCommitting = false;
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
get timestamp() {
|
|
331
|
+
return this._timestamp || (this._timestamp = getNextMonotonicTime());
|
|
332
|
+
}
|
|
333
|
+
getReadTxn() {
|
|
334
|
+
return; // no transaction means read latest
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
let timer;
|
|
339
|
+
|
|
340
|
+
function startMonitoringTxns() {
|
|
341
|
+
timer = setInterval(function () {
|
|
342
|
+
for (const txn of trackedTxns) {
|
|
343
|
+
if (txn.timeout <= 0) {
|
|
344
|
+
const url = txn.getContext()?.url;
|
|
345
|
+
harperLogger.error(
|
|
346
|
+
`Transaction was open too long and has been committed, from table: ${
|
|
347
|
+
txn.db?.name + (url ? ' path: ' + url : '')
|
|
348
|
+
}`,
|
|
349
|
+
...(txn.startedFrom ? [`was started from ${txn.startedFrom.resourceName}.${txn.startedFrom.method}`] : []),
|
|
350
|
+
...(DEBUG_LONG_TXNS ? ['starting stack trace', txn.stackTraces] : [])
|
|
351
|
+
);
|
|
352
|
+
// reset the transaction
|
|
353
|
+
try {
|
|
354
|
+
const result = txn.commit();
|
|
355
|
+
if (result?.then) {
|
|
356
|
+
result.catch((error) => {
|
|
357
|
+
harperLogger.debug?.(`Error committing timed out transaction: ${error.message}`);
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
} catch (error) {
|
|
361
|
+
harperLogger.debug?.(`Error committing timed out transaction: ${error.message}`);
|
|
362
|
+
}
|
|
363
|
+
txn.timeout = txnExpiration;
|
|
364
|
+
} else {
|
|
365
|
+
txn.timeout -= txnExpiration;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}, txnExpiration).unref();
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
startMonitoringTxns();
|
|
372
|
+
|
|
373
|
+
export function setTxnExpiration(ms) {
|
|
374
|
+
clearInterval(timer);
|
|
375
|
+
txnExpiration = ms;
|
|
376
|
+
startMonitoringTxns();
|
|
377
|
+
return trackedTxns;
|
|
378
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Resource } from './Resource.ts';
|
|
2
|
+
import type { Context } from './ResourceInterface.ts';
|
|
3
|
+
/**
|
|
4
|
+
* ErrorResource is a Resource that throws an error on any request, communicating to the client when attempts are made
|
|
5
|
+
* to access endpoints/resources that had an internal error in their configuration or setup. This helps ensure that
|
|
6
|
+
* if there is a problem with a resource, it is immediately apparent and can be fixed.
|
|
7
|
+
*/
|
|
8
|
+
export class ErrorResource implements Resource {
|
|
9
|
+
error: Error;
|
|
10
|
+
constructor(error: Error) {
|
|
11
|
+
this.error = error;
|
|
12
|
+
}
|
|
13
|
+
isError = true;
|
|
14
|
+
allowRead(): never {
|
|
15
|
+
throw this.error;
|
|
16
|
+
}
|
|
17
|
+
allowUpdate(): never {
|
|
18
|
+
throw this.error;
|
|
19
|
+
}
|
|
20
|
+
allowCreate(): never {
|
|
21
|
+
throw this.error;
|
|
22
|
+
}
|
|
23
|
+
allowDelete(): never {
|
|
24
|
+
throw this.error;
|
|
25
|
+
}
|
|
26
|
+
getId(): never {
|
|
27
|
+
throw this.error;
|
|
28
|
+
}
|
|
29
|
+
getContext(): Context {
|
|
30
|
+
throw this.error;
|
|
31
|
+
}
|
|
32
|
+
get(): never {
|
|
33
|
+
throw this.error;
|
|
34
|
+
}
|
|
35
|
+
post(): never {
|
|
36
|
+
throw this.error;
|
|
37
|
+
}
|
|
38
|
+
put(): never {
|
|
39
|
+
throw this.error;
|
|
40
|
+
}
|
|
41
|
+
delete(): never {
|
|
42
|
+
throw this.error;
|
|
43
|
+
}
|
|
44
|
+
connect(): never {
|
|
45
|
+
throw this.error;
|
|
46
|
+
}
|
|
47
|
+
getResource() {
|
|
48
|
+
// all child paths resolve back to reporting this error
|
|
49
|
+
return this;
|
|
50
|
+
}
|
|
51
|
+
publish(): never {
|
|
52
|
+
throw this.error;
|
|
53
|
+
}
|
|
54
|
+
subscribe(): never {
|
|
55
|
+
throw this.error;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
|
|
3
|
+
export class IterableEventQueue<Event extends object = any> extends EventEmitter {
|
|
4
|
+
resolveNext: null | ((args: { value: Event }) => void) = null;
|
|
5
|
+
queue: any[];
|
|
6
|
+
hasDataListeners: boolean;
|
|
7
|
+
drainCloseListener: boolean;
|
|
8
|
+
currentDrainResolver: null | ((draining: boolean) => void) = null;
|
|
9
|
+
[Symbol.asyncIterator](): AsyncIterator<Event> {
|
|
10
|
+
const iterator = new EventQueueIterator<Event>();
|
|
11
|
+
iterator.queue = this;
|
|
12
|
+
// @ts-expect-error The EventQueueIterator is acceptable as an AsyncIterator
|
|
13
|
+
return iterator;
|
|
14
|
+
}
|
|
15
|
+
push(message: Event) {
|
|
16
|
+
this.send(message);
|
|
17
|
+
}
|
|
18
|
+
send(message: Event) {
|
|
19
|
+
if (this.resolveNext) {
|
|
20
|
+
this.resolveNext({ value: message });
|
|
21
|
+
this.resolveNext = null;
|
|
22
|
+
} else if (this.hasDataListeners) {
|
|
23
|
+
this.emit('data', message);
|
|
24
|
+
} else {
|
|
25
|
+
if (!this.queue) this.queue = [];
|
|
26
|
+
this.queue.push(message);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
getNextMessage() {
|
|
30
|
+
const message = this.queue?.shift();
|
|
31
|
+
if (!message) this.emit('drained');
|
|
32
|
+
return message;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Wait for the queue to be drained, resolving to true to continue or false if the queue was closed before draining.
|
|
37
|
+
*/
|
|
38
|
+
waitForDrain(): Promise<boolean> {
|
|
39
|
+
return new Promise((resolve) => {
|
|
40
|
+
if (!this.queue || this.queue.length === 0) resolve(true);
|
|
41
|
+
else {
|
|
42
|
+
this.once('drained', () => resolve(true));
|
|
43
|
+
this.currentDrainResolver = resolve;
|
|
44
|
+
if (!this.drainCloseListener) {
|
|
45
|
+
this.drainCloseListener = true;
|
|
46
|
+
this.on('close', () => {
|
|
47
|
+
this.currentDrainResolver?.(false);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
on(eventName: 'data' | string, listener: ((data: Event) => void) | any) {
|
|
54
|
+
if (eventName === 'data' && !this.hasDataListeners) {
|
|
55
|
+
this.hasDataListeners = true;
|
|
56
|
+
while (this.queue?.length > 0) listener(this.queue.shift());
|
|
57
|
+
}
|
|
58
|
+
return super.on(eventName, listener);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
class EventQueueIterator<Event extends object = any> implements AsyncIterator<Event> {
|
|
63
|
+
queue: IterableEventQueue<Event>;
|
|
64
|
+
push(message: Event) {
|
|
65
|
+
this.queue.send(message);
|
|
66
|
+
}
|
|
67
|
+
// @ts-expect-error TypeScript is wrong, the JS engine accepts MaybePromise<...>
|
|
68
|
+
next(): { value: Event } | Promise<{ value: Event }> {
|
|
69
|
+
const message = this.queue.getNextMessage();
|
|
70
|
+
if (message) {
|
|
71
|
+
return {
|
|
72
|
+
value: message,
|
|
73
|
+
};
|
|
74
|
+
} else {
|
|
75
|
+
return new Promise((resolve) => (this.queue.resolveNext = resolve));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// @ts-expect-error TypeScript is wrong, the JS engine accepts MaybePromise<...>
|
|
79
|
+
return(value: Event): { value: Event; done: true } {
|
|
80
|
+
this.queue.emit('close');
|
|
81
|
+
return {
|
|
82
|
+
value,
|
|
83
|
+
done: true,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
// @ts-expect-error TypeScript is wrong, the JS engine accepts MaybePromise<...>
|
|
87
|
+
throw(error) {
|
|
88
|
+
this.queue.emit('close', error);
|
|
89
|
+
return {
|
|
90
|
+
done: true,
|
|
91
|
+
value: undefined,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|