mindoodb 0.0.85 → 0.0.88
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/README-server.md +6 -2
- package/README.md +6 -4
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.d.ts.map +1 -1
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js +2 -1
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js.map +1 -1
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts +151 -12
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts.map +1 -1
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js +340 -24
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js.map +1 -1
- package/dist/browser/index.mjs +14 -0
- package/dist/cloudflare/DurableObjectSql.d.ts +56 -0
- package/dist/cloudflare/DurableObjectSql.d.ts.map +1 -0
- package/dist/cloudflare/DurableObjectSql.js +180 -0
- package/dist/cloudflare/DurableObjectSql.js.map +1 -0
- package/dist/cloudflare/MindooDatabaseObject.d.ts +86 -0
- package/dist/cloudflare/MindooDatabaseObject.d.ts.map +1 -0
- package/dist/cloudflare/MindooDatabaseObject.js +614 -0
- package/dist/cloudflare/MindooDatabaseObject.js.map +1 -0
- package/dist/cloudflare/MindooServerObject.d.ts +63 -0
- package/dist/cloudflare/MindooServerObject.d.ts.map +1 -0
- package/dist/cloudflare/MindooServerObject.js +521 -0
- package/dist/cloudflare/MindooServerObject.js.map +1 -0
- package/dist/cloudflare/WorkersCryptoAdapter.d.ts +7 -0
- package/dist/cloudflare/WorkersCryptoAdapter.d.ts.map +1 -0
- package/dist/cloudflare/WorkersCryptoAdapter.js +14 -0
- package/dist/cloudflare/WorkersCryptoAdapter.js.map +1 -0
- package/dist/cloudflare/host.d.ts +49 -0
- package/dist/cloudflare/host.d.ts.map +1 -0
- package/dist/cloudflare/host.js +104 -0
- package/dist/cloudflare/host.js.map +1 -0
- package/dist/cloudflare/http.d.ts +91 -0
- package/dist/cloudflare/http.d.ts.map +1 -0
- package/dist/cloudflare/http.js +266 -0
- package/dist/cloudflare/http.js.map +1 -0
- package/dist/cloudflare/index.d.ts +12 -0
- package/dist/cloudflare/index.d.ts.map +1 -0
- package/dist/cloudflare/index.js +20 -0
- package/dist/cloudflare/index.js.map +1 -0
- package/dist/cloudflare/storeRpc.d.ts +22 -0
- package/dist/cloudflare/storeRpc.d.ts.map +1 -0
- package/dist/cloudflare/storeRpc.js +85 -0
- package/dist/cloudflare/storeRpc.js.map +1 -0
- package/dist/cloudflare/types.d.ts +101 -0
- package/dist/cloudflare/types.d.ts.map +1 -0
- package/dist/cloudflare/types.js +10 -0
- package/dist/cloudflare/types.js.map +1 -0
- package/dist/cloudflare/worker.d.ts +25 -0
- package/dist/cloudflare/worker.d.ts.map +1 -0
- package/dist/cloudflare/worker.js +170 -0
- package/dist/cloudflare/worker.js.map +1 -0
- package/dist/core/BaseMindooDB.d.ts +95 -10
- package/dist/core/BaseMindooDB.d.ts.map +1 -1
- package/dist/core/BaseMindooDB.js +441 -98
- package/dist/core/BaseMindooDB.js.map +1 -1
- package/dist/core/BaseMindooTenant.d.ts +43 -0
- package/dist/core/BaseMindooTenant.d.ts.map +1 -1
- package/dist/core/BaseMindooTenant.js +157 -6
- package/dist/core/BaseMindooTenant.js.map +1 -1
- package/dist/core/BaseMindooTenantDirectory.d.ts +103 -0
- package/dist/core/BaseMindooTenantDirectory.d.ts.map +1 -1
- package/dist/core/BaseMindooTenantDirectory.js +371 -8
- package/dist/core/BaseMindooTenantDirectory.js.map +1 -1
- package/dist/core/BaseMindooTenantFactory.d.ts.map +1 -1
- package/dist/core/BaseMindooTenantFactory.js +2 -1
- package/dist/core/BaseMindooTenantFactory.js.map +1 -1
- package/dist/core/ChangeDocDraft.d.ts +133 -0
- package/dist/core/ChangeDocDraft.d.ts.map +1 -0
- package/dist/core/ChangeDocDraft.js +492 -0
- package/dist/core/ChangeDocDraft.js.map +1 -0
- package/dist/core/MindooDBServerAdmin.d.ts.map +1 -1
- package/dist/core/MindooDBServerAdmin.js +2 -1
- package/dist/core/MindooDBServerAdmin.js.map +1 -1
- package/dist/core/accesscontrol/directoryProjection.d.ts.map +1 -1
- package/dist/core/accesscontrol/directoryProjection.js +19 -0
- package/dist/core/accesscontrol/directoryProjection.js.map +1 -1
- package/dist/core/accesscontrol/evaluate.d.ts +14 -0
- package/dist/core/accesscontrol/evaluate.d.ts.map +1 -1
- package/dist/core/accesscontrol/evaluate.js +42 -1
- package/dist/core/accesscontrol/evaluate.js.map +1 -1
- package/dist/core/accesscontrol/types.d.ts +88 -4
- package/dist/core/accesscontrol/types.d.ts.map +1 -1
- package/dist/core/accesscontrol/types.js +114 -1
- package/dist/core/accesscontrol/types.js.map +1 -1
- package/dist/core/appendonlystores/network/AuthenticationService.d.ts +14 -0
- package/dist/core/appendonlystores/network/AuthenticationService.d.ts.map +1 -1
- package/dist/core/appendonlystores/network/AuthenticationService.js +27 -7
- package/dist/core/appendonlystores/network/AuthenticationService.js.map +1 -1
- package/dist/core/appendonlystores/network/IrohNetworkTransport.d.ts.map +1 -1
- package/dist/core/appendonlystores/network/IrohNetworkTransport.js +12 -0
- package/dist/core/appendonlystores/network/IrohNetworkTransport.js.map +1 -1
- package/dist/core/appendonlystores/network/IrohStreamIO.d.ts.map +1 -1
- package/dist/core/appendonlystores/network/IrohStreamIO.js +3 -23
- package/dist/core/appendonlystores/network/IrohStreamIO.js.map +1 -1
- package/dist/core/appendonlystores/rpc/RpcContentAddressedStore.d.ts +6 -0
- package/dist/core/appendonlystores/rpc/RpcContentAddressedStore.d.ts.map +1 -1
- package/dist/core/appendonlystores/rpc/RpcContentAddressedStore.js +20 -1
- package/dist/core/appendonlystores/rpc/RpcContentAddressedStore.js.map +1 -1
- package/dist/core/appendonlystores/rpc/storeRpcCodec.d.ts.map +1 -1
- package/dist/core/appendonlystores/rpc/storeRpcCodec.js +3 -23
- package/dist/core/appendonlystores/rpc/storeRpcCodec.js.map +1 -1
- package/dist/core/appendonlystores/sqlite/SqliteContentAddressedStore.d.ts +7 -0
- package/dist/core/appendonlystores/sqlite/SqliteContentAddressedStore.d.ts.map +1 -1
- package/dist/core/appendonlystores/sqlite/SqliteContentAddressedStore.js +39 -30
- package/dist/core/appendonlystores/sqlite/SqliteContentAddressedStore.js.map +1 -1
- package/dist/core/appendonlystores/sqlite/SqliteDriver.d.ts +37 -1
- package/dist/core/appendonlystores/sqlite/SqliteDriver.d.ts.map +1 -1
- package/dist/core/appendonlystores/sqlite/SqliteDriver.js +99 -40
- package/dist/core/appendonlystores/sqlite/SqliteDriver.js.map +1 -1
- package/dist/core/appendonlystores/syncStores.d.ts.map +1 -1
- package/dist/core/appendonlystores/syncStores.js +25 -5
- package/dist/core/appendonlystores/syncStores.js.map +1 -1
- package/dist/core/appendonlystores/types.d.ts +7 -1
- package/dist/core/appendonlystores/types.d.ts.map +1 -1
- package/dist/core/appendonlystores/types.js +1 -0
- package/dist/core/appendonlystores/types.js.map +1 -1
- package/dist/core/builtinDbInvariants.d.ts +49 -0
- package/dist/core/builtinDbInvariants.d.ts.map +1 -1
- package/dist/core/builtinDbInvariants.js +86 -1
- package/dist/core/builtinDbInvariants.js.map +1 -1
- package/dist/core/crypto/AuthChallenge.d.ts +68 -0
- package/dist/core/crypto/AuthChallenge.d.ts.map +1 -0
- package/dist/core/crypto/AuthChallenge.js +118 -0
- package/dist/core/crypto/AuthChallenge.js.map +1 -0
- package/dist/core/crypto/DomainStatement.d.ts +5 -3
- package/dist/core/crypto/DomainStatement.d.ts.map +1 -1
- package/dist/core/crypto/DomainStatement.js +5 -3
- package/dist/core/crypto/DomainStatement.js.map +1 -1
- package/dist/core/crypto/encryptedFields.d.ts +11 -0
- package/dist/core/crypto/encryptedFields.d.ts.map +1 -1
- package/dist/core/crypto/encryptedFields.js +18 -0
- package/dist/core/crypto/encryptedFields.js.map +1 -1
- package/dist/core/expressions/evaluateExpression.d.ts +8 -0
- package/dist/core/expressions/evaluateExpression.d.ts.map +1 -1
- package/dist/core/expressions/evaluateExpression.js +29 -4
- package/dist/core/expressions/evaluateExpression.js.map +1 -1
- package/dist/core/expressions/metadata.js +4 -4
- package/dist/core/expressions/metadata.js.map +1 -1
- package/dist/core/index.d.ts +3 -3
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +17 -6
- package/dist/core/index.js.map +1 -1
- package/dist/core/query/executeQuery.d.ts.map +1 -1
- package/dist/core/query/executeQuery.js +5 -1
- package/dist/core/query/executeQuery.js.map +1 -1
- package/dist/core/query/executeQueryInclude.d.ts.map +1 -1
- package/dist/core/query/executeQueryInclude.js +2 -0
- package/dist/core/query/executeQueryInclude.js.map +1 -1
- package/dist/core/query/queryView.d.ts.map +1 -1
- package/dist/core/query/queryView.js +5 -1
- package/dist/core/query/queryView.js.map +1 -1
- package/dist/core/types.d.ts +204 -10
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/uri/MindooURI.d.ts.map +1 -1
- package/dist/core/uri/MindooURI.js +3 -24
- package/dist/core/uri/MindooURI.js.map +1 -1
- package/dist/core/userkeys/index.d.ts +1 -0
- package/dist/core/userkeys/index.d.ts.map +1 -1
- package/dist/core/userkeys/index.js +5 -1
- package/dist/core/userkeys/index.js.map +1 -1
- package/dist/core/userkeys/sealedValues.d.ts +54 -0
- package/dist/core/userkeys/sealedValues.d.ts.map +1 -0
- package/dist/core/userkeys/sealedValues.js +67 -0
- package/dist/core/userkeys/sealedValues.js.map +1 -0
- package/dist/core/utils/base64.d.ts +17 -0
- package/dist/core/utils/base64.d.ts.map +1 -0
- package/dist/core/utils/base64.js +54 -0
- package/dist/core/utils/base64.js.map +1 -0
- package/dist/core/utils/dynamicImportInterop.d.ts +10 -0
- package/dist/core/utils/dynamicImportInterop.d.ts.map +1 -0
- package/dist/core/utils/dynamicImportInterop.js +22 -0
- package/dist/core/utils/dynamicImportInterop.js.map +1 -0
- package/dist/core/utils/idGeneration.d.ts.map +1 -1
- package/dist/core/utils/idGeneration.js +14 -3
- package/dist/core/utils/idGeneration.js.map +1 -1
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.d.ts.map +1 -1
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.js +7 -0
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.js.map +1 -1
- package/dist/node/server/FsServerDataStore.d.ts +23 -0
- package/dist/node/server/FsServerDataStore.d.ts.map +1 -0
- package/dist/node/server/FsServerDataStore.js +59 -0
- package/dist/node/server/FsServerDataStore.js.map +1 -0
- package/dist/node/server/IrohServerEndpoint.d.ts +1 -1
- package/dist/node/server/IrohServerEndpoint.d.ts.map +1 -1
- package/dist/node/server/IrohServerRpc.d.ts +5 -5
- package/dist/node/server/IrohServerRpc.d.ts.map +1 -1
- package/dist/node/server/IrohServerRpc.js +1 -1
- package/dist/node/server/IrohServerRpc.js.map +1 -1
- package/dist/node/server/MindooDBServer.d.ts +29 -150
- package/dist/node/server/MindooDBServer.d.ts.map +1 -1
- package/dist/node/server/MindooDBServer.js +160 -1573
- package/dist/node/server/MindooDBServer.js.map +1 -1
- package/dist/node/server/PurgedDocRegistry.d.ts +4 -27
- package/dist/node/server/PurgedDocRegistry.d.ts.map +1 -1
- package/dist/node/server/PurgedDocRegistry.js +6 -83
- package/dist/node/server/PurgedDocRegistry.js.map +1 -1
- package/dist/node/server/StoreFactory.d.ts +1 -1
- package/dist/node/server/StoreFactory.d.ts.map +1 -1
- package/dist/node/server/TenantManager.d.ts +16 -284
- package/dist/node/server/TenantManager.d.ts.map +1 -1
- package/dist/node/server/TenantManager.js +35 -1168
- package/dist/node/server/TenantManager.js.map +1 -1
- package/dist/node/server/add-to-network.js +1 -1
- package/dist/node/server/add-to-network.js.map +1 -1
- package/dist/node/server/config.d.ts +11 -15
- package/dist/node/server/config.d.ts.map +1 -1
- package/dist/node/server/config.js +30 -245
- package/dist/node/server/config.js.map +1 -1
- package/dist/node/server/expressAdapter.d.ts +23 -0
- package/dist/node/server/expressAdapter.d.ts.map +1 -0
- package/dist/node/server/expressAdapter.js +108 -0
- package/dist/node/server/expressAdapter.js.map +1 -0
- package/dist/node/server/nativeIrohStreamIO.d.ts +1 -1
- package/dist/node/server/nativeIrohStreamIO.d.ts.map +1 -1
- package/dist/node/server/peer/FileClusterAuditStorage.d.ts +16 -0
- package/dist/node/server/peer/FileClusterAuditStorage.d.ts.map +1 -0
- package/dist/node/server/peer/FileClusterAuditStorage.js +39 -0
- package/dist/node/server/peer/FileClusterAuditStorage.js.map +1 -0
- package/dist/node/server/peer/IrohPeerLink.d.ts +1 -1
- package/dist/node/server/peer/IrohPeerLink.d.ts.map +1 -1
- package/dist/node/server/peer/routes.d.ts +10 -44
- package/dist/node/server/peer/routes.d.ts.map +1 -1
- package/dist/node/server/peer/routes.js +33 -275
- package/dist/node/server/peer/routes.js.map +1 -1
- package/dist/node/server/resolveServerPassword.js +1 -1
- package/dist/node/server/resolveServerPassword.js.map +1 -1
- package/dist/node/server/server.js +1 -1
- package/dist/node/server/server.js.map +1 -1
- package/dist/node/server/serverinit.js +1 -1
- package/dist/node/server/serverinit.js.map +1 -1
- package/dist/server/CapabilityMatcher.d.ts +60 -0
- package/dist/server/CapabilityMatcher.d.ts.map +1 -0
- package/dist/server/CapabilityMatcher.js +138 -0
- package/dist/server/CapabilityMatcher.js.map +1 -0
- package/dist/server/DeviceDiscoveryService.d.ts +36 -0
- package/dist/server/DeviceDiscoveryService.d.ts.map +1 -0
- package/dist/server/DeviceDiscoveryService.js +164 -0
- package/dist/server/DeviceDiscoveryService.js.map +1 -0
- package/dist/server/PurgedDocRegistry.d.ts +35 -0
- package/dist/server/PurgedDocRegistry.d.ts.map +1 -0
- package/dist/server/PurgedDocRegistry.js +90 -0
- package/dist/server/PurgedDocRegistry.js.map +1 -0
- package/dist/server/ServerDataStore.d.ts +67 -0
- package/dist/server/ServerDataStore.d.ts.map +1 -0
- package/dist/server/ServerDataStore.js +88 -0
- package/dist/server/ServerDataStore.js.map +1 -0
- package/dist/server/SyncEventBus.d.ts +39 -0
- package/dist/server/SyncEventBus.d.ts.map +1 -0
- package/dist/server/SyncEventBus.js +41 -0
- package/dist/server/SyncEventBus.js.map +1 -0
- package/dist/server/SystemAdminAuth.d.ts +82 -0
- package/dist/server/SystemAdminAuth.d.ts.map +1 -0
- package/dist/server/SystemAdminAuth.js +227 -0
- package/dist/server/SystemAdminAuth.js.map +1 -0
- package/dist/server/TenantManager.d.ts +366 -0
- package/dist/server/TenantManager.d.ts.map +1 -0
- package/dist/server/TenantManager.js +1416 -0
- package/dist/server/TenantManager.js.map +1 -0
- package/dist/server/http/MindooDBServerCore.d.ts +313 -0
- package/dist/server/http/MindooDBServerCore.d.ts.map +1 -0
- package/dist/server/http/MindooDBServerCore.js +1410 -0
- package/dist/server/http/MindooDBServerCore.js.map +1 -0
- package/dist/server/http/types.d.ts +89 -0
- package/dist/server/http/types.d.ts.map +1 -0
- package/dist/server/http/types.js +29 -0
- package/dist/server/http/types.js.map +1 -0
- package/dist/server/index.d.ts +32 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +76 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/peer/ClusterAuditLog.d.ts +71 -0
- package/dist/server/peer/ClusterAuditLog.d.ts.map +1 -0
- package/dist/server/peer/ClusterAuditLog.js +81 -0
- package/dist/server/peer/ClusterAuditLog.js.map +1 -0
- package/dist/server/peer/ClusterJobRunner.d.ts +43 -0
- package/dist/server/peer/ClusterJobRunner.d.ts.map +1 -0
- package/dist/server/peer/ClusterJobRunner.js +119 -0
- package/dist/server/peer/ClusterJobRunner.js.map +1 -0
- package/dist/server/peer/ClusterManager.d.ts +149 -0
- package/dist/server/peer/ClusterManager.d.ts.map +1 -0
- package/dist/server/peer/ClusterManager.js +292 -0
- package/dist/server/peer/ClusterManager.js.map +1 -0
- package/dist/server/peer/PeerAuthService.d.ts +69 -0
- package/dist/server/peer/PeerAuthService.d.ts.map +1 -0
- package/dist/server/peer/PeerAuthService.js +207 -0
- package/dist/server/peer/PeerAuthService.js.map +1 -0
- package/dist/server/peer/PeerReplicator.d.ts +303 -0
- package/dist/server/peer/PeerReplicator.d.ts.map +1 -0
- package/dist/server/peer/PeerReplicator.js +1072 -0
- package/dist/server/peer/PeerReplicator.js.map +1 -0
- package/dist/server/peer/clusterHttp.d.ts +113 -0
- package/dist/server/peer/clusterHttp.d.ts.map +1 -0
- package/dist/server/peer/clusterHttp.js +290 -0
- package/dist/server/peer/clusterHttp.js.map +1 -0
- package/dist/server/peer/types.d.ts +244 -0
- package/dist/server/peer/types.d.ts.map +1 -0
- package/dist/server/peer/types.js +189 -0
- package/dist/server/peer/types.js.map +1 -0
- package/dist/server/rateLimits.d.ts +119 -0
- package/dist/server/rateLimits.d.ts.map +1 -0
- package/dist/server/rateLimits.js +159 -0
- package/dist/server/rateLimits.js.map +1 -0
- package/dist/server/serverConfig.d.ts +37 -0
- package/dist/server/serverConfig.d.ts.map +1 -0
- package/dist/server/serverConfig.js +251 -0
- package/dist/server/serverConfig.js.map +1 -0
- package/dist/server/timestampProxy.d.ts +129 -0
- package/dist/server/timestampProxy.d.ts.map +1 -0
- package/dist/server/timestampProxy.js +361 -0
- package/dist/server/timestampProxy.js.map +1 -0
- package/dist/server/types.d.ts +267 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +56 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server/validation.d.ts +43 -0
- package/dist/server/validation.d.ts.map +1 -0
- package/dist/server/validation.js +104 -0
- package/dist/server/validation.js.map +1 -0
- package/package.json +9 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PeerAuthService.d.ts","sourceRoot":"","sources":["../../../src/server/peer/PeerAuthService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,MAAM,WAAW,gBAAgB;IAC/B,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,2EAA2E;IAC3E,aAAa,EAAE,MAAM,CAAC;IACtB,mFAAmF;IACnF,IAAI,EAAE,IAAI,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAeD,qBAAa,eAAe;IAUxB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,wEAAwE;IACxE,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IAXrC,OAAO,CAAC,UAAU,CAA2C;IAC7D,gFAAgF;IAChF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAU;IAEhD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAa;IACvC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAS;IAC/C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;gBAGxB,aAAa,EAAE,aAAa;IAC7C,wEAAwE;IACvD,kBAAkB,EAAE,MAAM,aAAa,EAAE,EAC1D,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,UAAU,CAAC;QACvB,qBAAqB,CAAC,EAAE,MAAM,CAAC;QAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B;IAQH,4EAA4E;IAC5E,sBAAsB,CAAC,aAAa,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IASnE;;;;OAIG;IACG,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBzD,YAAY,CAChB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,UAAU,GACpB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IA6BhE;;;;OAIG;IACG,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAsCtD,eAAe;YAyBf,aAAa;IAyB3B,OAAO,CAAC,wBAAwB;IAShC,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,qBAAqB;IAQ7B,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,kBAAkB;CAQ3B"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Peer (server-to-server) authentication for `/system/peer/*`.
|
|
4
|
+
*
|
|
5
|
+
* Same Ed25519 challenge-response as the tenant sync handshake, but the key
|
|
6
|
+
* lookup goes to `trusted-servers.json` instead of a tenant directory. The
|
|
7
|
+
* issued JWT is deliberately a **different token class** from the system-admin
|
|
8
|
+
* JWT: `/system/peer/*` accepts only peer tokens and `/system/cluster/*` only
|
|
9
|
+
* admin tokens, so a peer can never administer this node and an admin can never
|
|
10
|
+
* write as a peer.
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.PeerAuthService = void 0;
|
|
14
|
+
const AuthChallenge_1 = require("../../core/crypto/AuthChallenge");
|
|
15
|
+
/** Whitespace-insensitive PEM comparison (JSON transport reflows line endings). */
|
|
16
|
+
function normalizePem(pem) {
|
|
17
|
+
return pem.replace(/\s+/g, "");
|
|
18
|
+
}
|
|
19
|
+
class PeerAuthService {
|
|
20
|
+
constructor(cryptoAdapter,
|
|
21
|
+
/** Live view of `trusted-servers.json` — re-read on every handshake. */
|
|
22
|
+
listTrustedServers, options) {
|
|
23
|
+
this.cryptoAdapter = cryptoAdapter;
|
|
24
|
+
this.listTrustedServers = listTrustedServers;
|
|
25
|
+
this.challenges = new Map();
|
|
26
|
+
this.jwtSecret =
|
|
27
|
+
options?.jwtSecret ?? cryptoAdapter.getRandomValues(new Uint8Array(32));
|
|
28
|
+
this.challengeExpirationMs = options?.challengeExpirationMs ?? 5 * 60 * 1000;
|
|
29
|
+
this.tokenExpirationMs = options?.tokenExpirationMs ?? 60 * 60 * 1000;
|
|
30
|
+
}
|
|
31
|
+
/** Resolve a trusted server by its signing key (the canonical identity). */
|
|
32
|
+
findTrustedServerByKey(publicsignkey) {
|
|
33
|
+
const wanted = normalizePem(publicsignkey);
|
|
34
|
+
return (this.listTrustedServers().find((server) => normalizePem(server.signingPublicKey) === wanted) ?? null);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Issue a challenge for a peer identified by its signing key.
|
|
38
|
+
*
|
|
39
|
+
* @throws Error("Unknown peer") when the key is not in trusted-servers.json.
|
|
40
|
+
*/
|
|
41
|
+
async generateChallenge(publicsignkey) {
|
|
42
|
+
const server = this.findTrustedServerByKey(publicsignkey);
|
|
43
|
+
if (!server) {
|
|
44
|
+
throw new Error("Unknown peer");
|
|
45
|
+
}
|
|
46
|
+
const challenge = (0, AuthChallenge_1.issueAuthChallenge)();
|
|
47
|
+
this.challenges.set(challenge, {
|
|
48
|
+
challenge,
|
|
49
|
+
serverName: server.name,
|
|
50
|
+
publicsignkey: server.signingPublicKey,
|
|
51
|
+
expiresAt: Date.now() + this.challengeExpirationMs,
|
|
52
|
+
used: false,
|
|
53
|
+
});
|
|
54
|
+
this.cleanupExpiredChallenges();
|
|
55
|
+
this.evictChallengesOverCap();
|
|
56
|
+
return challenge;
|
|
57
|
+
}
|
|
58
|
+
async authenticate(challenge, signature) {
|
|
59
|
+
const stored = this.challenges.get(challenge);
|
|
60
|
+
if (!stored) {
|
|
61
|
+
return { success: false, error: "Challenge not found or expired" };
|
|
62
|
+
}
|
|
63
|
+
if (Date.now() > stored.expiresAt) {
|
|
64
|
+
this.challenges.delete(challenge);
|
|
65
|
+
return { success: false, error: "Challenge expired" };
|
|
66
|
+
}
|
|
67
|
+
if (stored.used) {
|
|
68
|
+
return { success: false, error: "Challenge already used" };
|
|
69
|
+
}
|
|
70
|
+
stored.used = true;
|
|
71
|
+
// Re-resolve against the live trust list: an operator may have removed the
|
|
72
|
+
// peer between challenge and response.
|
|
73
|
+
if (!this.findTrustedServerByKey(stored.publicsignkey)) {
|
|
74
|
+
return { success: false, error: "Peer is no longer trusted" };
|
|
75
|
+
}
|
|
76
|
+
const valid = await this.verifySignature(challenge, signature, stored.publicsignkey);
|
|
77
|
+
if (!valid) {
|
|
78
|
+
return { success: false, error: "Invalid signature" };
|
|
79
|
+
}
|
|
80
|
+
const token = await this.generateToken(stored.serverName, stored.publicsignkey);
|
|
81
|
+
return { success: true, token };
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Validate a peer JWT. Returns null unless the token carries `peer: true`
|
|
85
|
+
* *and* the signing key is still trusted — revoking trust must cut off
|
|
86
|
+
* outstanding tokens, not just future handshakes.
|
|
87
|
+
*/
|
|
88
|
+
async validateToken(token) {
|
|
89
|
+
const parts = token.split(".");
|
|
90
|
+
if (parts.length !== 3)
|
|
91
|
+
return null;
|
|
92
|
+
const [headerB64, payloadB64, signatureB64] = parts;
|
|
93
|
+
try {
|
|
94
|
+
// Pin the algorithm to HS256 to block algorithm-confusion attacks.
|
|
95
|
+
const header = JSON.parse(this.base64UrlDecode(headerB64));
|
|
96
|
+
if (header.alg !== "HS256")
|
|
97
|
+
return null;
|
|
98
|
+
const subtle = this.cryptoAdapter.getSubtle();
|
|
99
|
+
const signingKey = await subtle.importKey("raw", this.jwtSecret.buffer, { name: "HMAC", hash: "SHA-256" }, false, ["verify"]);
|
|
100
|
+
const dataToVerify = new TextEncoder().encode(`${headerB64}.${payloadB64}`);
|
|
101
|
+
const sig = this.base64UrlToUint8Array(signatureB64);
|
|
102
|
+
const isValid = await subtle.verify("HMAC", signingKey, sig.buffer.slice(sig.byteOffset, sig.byteOffset + sig.byteLength), dataToVerify.buffer);
|
|
103
|
+
if (!isValid)
|
|
104
|
+
return null;
|
|
105
|
+
const payload = JSON.parse(this.base64UrlDecode(payloadB64));
|
|
106
|
+
if (payload.peer !== true)
|
|
107
|
+
return null;
|
|
108
|
+
if (payload.exp < Math.floor(Date.now() / 1000))
|
|
109
|
+
return null;
|
|
110
|
+
if (!this.findTrustedServerByKey(payload.publicsignkey))
|
|
111
|
+
return null;
|
|
112
|
+
return payload;
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
async verifySignature(message, signature, publicKeyPem) {
|
|
119
|
+
const subtle = this.cryptoAdapter.getSubtle();
|
|
120
|
+
try {
|
|
121
|
+
const pemContents = publicKeyPem
|
|
122
|
+
.replace(/-----BEGIN PUBLIC KEY-----/g, "")
|
|
123
|
+
.replace(/-----END PUBLIC KEY-----/g, "")
|
|
124
|
+
.replace(/\s/g, "");
|
|
125
|
+
const keyData = this.base64ToUint8Array(pemContents);
|
|
126
|
+
const publicKey = await subtle.importKey("spki", keyData.buffer, { name: "Ed25519" }, false, ["verify"]);
|
|
127
|
+
return await (0, AuthChallenge_1.verifyAuthChallengeSignature)(subtle, publicKey, message, signature);
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
async generateToken(serverName, publicsignkey) {
|
|
134
|
+
const subtle = this.cryptoAdapter.getSubtle();
|
|
135
|
+
const now = Math.floor(Date.now() / 1000);
|
|
136
|
+
const payload = {
|
|
137
|
+
sub: serverName,
|
|
138
|
+
publicsignkey,
|
|
139
|
+
peer: true,
|
|
140
|
+
iat: now,
|
|
141
|
+
exp: now + Math.floor(this.tokenExpirationMs / 1000),
|
|
142
|
+
};
|
|
143
|
+
const headerB64 = this.base64UrlEncode(JSON.stringify({ alg: "HS256", typ: "JWT" }));
|
|
144
|
+
const payloadB64 = this.base64UrlEncode(JSON.stringify(payload));
|
|
145
|
+
const signingKey = await subtle.importKey("raw", this.jwtSecret.buffer, { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
|
|
146
|
+
const dataToSign = new TextEncoder().encode(`${headerB64}.${payloadB64}`);
|
|
147
|
+
const signature = await subtle.sign("HMAC", signingKey, dataToSign.buffer);
|
|
148
|
+
return `${headerB64}.${payloadB64}.${this.uint8ArrayToBase64Url(new Uint8Array(signature))}`;
|
|
149
|
+
}
|
|
150
|
+
cleanupExpiredChallenges() {
|
|
151
|
+
const now = Date.now();
|
|
152
|
+
for (const [key, challenge] of this.challenges) {
|
|
153
|
+
if (challenge.expiresAt < now) {
|
|
154
|
+
this.challenges.delete(key);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
evictChallengesOverCap() {
|
|
159
|
+
let overflow = this.challenges.size - PeerAuthService.MAX_CHALLENGES;
|
|
160
|
+
if (overflow <= 0)
|
|
161
|
+
return;
|
|
162
|
+
for (const key of this.challenges.keys()) {
|
|
163
|
+
if (overflow-- <= 0)
|
|
164
|
+
break;
|
|
165
|
+
this.challenges.delete(key);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
base64UrlEncode(str) {
|
|
169
|
+
return btoa(str).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
|
|
170
|
+
}
|
|
171
|
+
base64UrlDecode(str) {
|
|
172
|
+
let base64 = str.replace(/-/g, "+").replace(/_/g, "/");
|
|
173
|
+
while (base64.length % 4)
|
|
174
|
+
base64 += "=";
|
|
175
|
+
return atob(base64);
|
|
176
|
+
}
|
|
177
|
+
uint8ArrayToBase64Url(bytes) {
|
|
178
|
+
let binary = "";
|
|
179
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
180
|
+
binary += String.fromCharCode(bytes[i]);
|
|
181
|
+
}
|
|
182
|
+
return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
|
|
183
|
+
}
|
|
184
|
+
base64UrlToUint8Array(str) {
|
|
185
|
+
let base64 = str.replace(/-/g, "+").replace(/_/g, "/");
|
|
186
|
+
while (base64.length % 4)
|
|
187
|
+
base64 += "=";
|
|
188
|
+
const binary = atob(base64);
|
|
189
|
+
const bytes = new Uint8Array(binary.length);
|
|
190
|
+
for (let i = 0; i < binary.length; i++) {
|
|
191
|
+
bytes[i] = binary.charCodeAt(i);
|
|
192
|
+
}
|
|
193
|
+
return bytes;
|
|
194
|
+
}
|
|
195
|
+
base64ToUint8Array(base64) {
|
|
196
|
+
const binary = atob(base64);
|
|
197
|
+
const bytes = new Uint8Array(binary.length);
|
|
198
|
+
for (let i = 0; i < binary.length; i++) {
|
|
199
|
+
bytes[i] = binary.charCodeAt(i);
|
|
200
|
+
}
|
|
201
|
+
return bytes;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
exports.PeerAuthService = PeerAuthService;
|
|
205
|
+
/** Challenge creation is unauthenticated, so the map is bounded (DoS guard). */
|
|
206
|
+
PeerAuthService.MAX_CHALLENGES = 10000;
|
|
207
|
+
//# sourceMappingURL=PeerAuthService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PeerAuthService.js","sourceRoot":"","sources":["../../../src/server/peer/PeerAuthService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-to-server replication with one trusted peer.
|
|
3
|
+
*
|
|
4
|
+
* One replicator instance per entry in `trusted-servers.json` that carries a
|
|
5
|
+
* `url`. It owns everything about that link: the peer session, the set of
|
|
6
|
+
* tenants both sides hold, the mirror loop over every database, the live push
|
|
7
|
+
* out of {@link SyncEventBus}, and the SSE subscription that pulls the other
|
|
8
|
+
* direction.
|
|
9
|
+
*
|
|
10
|
+
* ## What it replicates
|
|
11
|
+
*
|
|
12
|
+
* Everything both servers already have in common, and nothing else. The tenant
|
|
13
|
+
* set is intersected via a Bloom summary (see {@link refreshIntersection}), so
|
|
14
|
+
* a server never learns which tenants it does *not* host on the other side. For
|
|
15
|
+
* each shared tenant it mirrors **all** databases — the union of the local and
|
|
16
|
+
* remote database lists — in both stores (`docs` and `attachments`).
|
|
17
|
+
*
|
|
18
|
+
* ## Convergence invariants
|
|
19
|
+
*
|
|
20
|
+
* 1. **Directory first.** Databases are ordered by
|
|
21
|
+
* {@link orderDatabasesForReplication}: `directory`, then `userdirectory`,
|
|
22
|
+
* then the rest. An application entry signed by a key the peer does not
|
|
23
|
+
* trust yet is rejected per entry, so the grants have to land first.
|
|
24
|
+
* 2. **Cursor holds on rejection.** Unlike a client, a peer must not skip past
|
|
25
|
+
* a rejected entry — that is permanent divergence between two servers that
|
|
26
|
+
* are supposed to be identical. The peer path passes
|
|
27
|
+
* `rejectionPolicy: "hold"`, which clamps the cursor so the next run
|
|
28
|
+
* re-offers the entry once the missing trust has replicated.
|
|
29
|
+
* 3. **Receipts are preserved, not re-stamped.** Enforced on the receiving side
|
|
30
|
+
* in `ServerNetworkContentAddressedStore`; this side just transports.
|
|
31
|
+
*/
|
|
32
|
+
import type { IrohStreamIO } from "../../core/appendonlystores/network/IrohStreamIO";
|
|
33
|
+
import { StoreKind, type ContentAddressedStore } from "../../core/types";
|
|
34
|
+
import type { CryptoAdapter } from "../../core/crypto/CryptoAdapter";
|
|
35
|
+
import { Logger } from "../../core/logging";
|
|
36
|
+
import type { TrustedServer } from "../types";
|
|
37
|
+
import type { SyncEventBus, SyncChangeEvent } from "../SyncEventBus";
|
|
38
|
+
import { type ClusterHealth, type ClusterHealthReason, type ClusterPeerStatus, type ClusterTenantStatus, type ClusterTopologyPeer, type PeerRole } from "./types";
|
|
39
|
+
/**
|
|
40
|
+
* An established Iroh connection to a peer (Node: `IrohPeerLink`). Injected so
|
|
41
|
+
* the replicator itself does not depend on Iroh; hosts without Iroh leave it
|
|
42
|
+
* out and `iroh:` peer urls fail with a clear error.
|
|
43
|
+
*/
|
|
44
|
+
export interface PeerIrohLink {
|
|
45
|
+
rpc(method: string, args: unknown[]): Promise<unknown>;
|
|
46
|
+
asStreamIO(): IrohStreamIO;
|
|
47
|
+
subscribeEvents(token: string, onEvent: (event: SyncChangeEvent) => void, signal: AbortSignal): Promise<void>;
|
|
48
|
+
close(): Promise<void>;
|
|
49
|
+
}
|
|
50
|
+
export interface PeerTransferLimits {
|
|
51
|
+
/** Batches transferred in parallel per store pair. */
|
|
52
|
+
maxConcurrentBatches?: number;
|
|
53
|
+
/** Entries per batch for document stores. */
|
|
54
|
+
docsBatchSize?: number;
|
|
55
|
+
/** Entries per batch for attachment stores (chunks of up to 256 KB each). */
|
|
56
|
+
attachmentsBatchSize?: number;
|
|
57
|
+
}
|
|
58
|
+
/** What a replicator needs from the surrounding server to do its job. */
|
|
59
|
+
export interface PeerReplicatorHost {
|
|
60
|
+
cryptoAdapter: CryptoAdapter;
|
|
61
|
+
/** This server's name, as the peer knows it in its own trusted-servers list. */
|
|
62
|
+
localServerName: string;
|
|
63
|
+
/** This server's Ed25519 public key (PEM) — how the peer looks us up. */
|
|
64
|
+
localSigningPublicKey: string;
|
|
65
|
+
/** This node's own mesh role, which decides whether spoke-to-spoke is suppressed. */
|
|
66
|
+
localRole: PeerRole;
|
|
67
|
+
/** Ed25519 signing key, for the peer challenge. */
|
|
68
|
+
getSigningKey(): Promise<CryptoKey | undefined>;
|
|
69
|
+
/** RSA private key, to unwrap entries the peer sends us. */
|
|
70
|
+
getEncryptionKey(): Promise<CryptoKey | undefined>;
|
|
71
|
+
/** Tenant ids hosted locally. */
|
|
72
|
+
listTenants(): string[];
|
|
73
|
+
/** Database ids held locally for a tenant. */
|
|
74
|
+
listDatabases(tenantId: string): string[] | Promise<string[]>;
|
|
75
|
+
/** Local store for a (tenant, db, kind) triple, created on demand. */
|
|
76
|
+
getLocalStore(tenantId: string, dbId: string, storeKind: StoreKind): Promise<ContentAddressedStore>;
|
|
77
|
+
eventBus: SyncEventBus;
|
|
78
|
+
/** Bound Iroh endpoint for `iroh:` peer urls. Missing / null → reconnect. */
|
|
79
|
+
getIrohStreamIO?: () => IrohStreamIO | null;
|
|
80
|
+
/** Dial a peer over Iroh; required for `iroh:` peer urls. */
|
|
81
|
+
openIrohLink?: (io: IrohStreamIO, ticket: string) => PeerIrohLink;
|
|
82
|
+
/**
|
|
83
|
+
* Keep a Server-Sent-Events subscription to the peer open so its changes
|
|
84
|
+
* are pulled right away (default). A host that cannot hold a connection
|
|
85
|
+
* open cheaply turns this off and pulls on a schedule instead.
|
|
86
|
+
*/
|
|
87
|
+
liveEventStream?: boolean;
|
|
88
|
+
/**
|
|
89
|
+
* Bounds on what one transfer holds in memory, for hosts with a small heap
|
|
90
|
+
* (Cloudflare: 128 MB per isolate). Default: the sync defaults (up to 250
|
|
91
|
+
* entries per batch, 3 batches in parallel).
|
|
92
|
+
*/
|
|
93
|
+
transferLimits?: PeerTransferLimits;
|
|
94
|
+
/**
|
|
95
|
+
* Documents purged from a database on this server (the purge registry).
|
|
96
|
+
* Entries of these documents are refused when pulled from the peer, the
|
|
97
|
+
* same way the server refuses them on a push (docs/accesscontrol.md §13).
|
|
98
|
+
*/
|
|
99
|
+
getPurgedDocIds?(tenantId: string, dbId: string): ReadonlySet<string>;
|
|
100
|
+
/**
|
|
101
|
+
* Called after a pull brought new `directory` entries, before the tenant's
|
|
102
|
+
* other databases are mirrored: executes purge requests that arrived by
|
|
103
|
+
* replication, which no client push would otherwise trigger here.
|
|
104
|
+
*/
|
|
105
|
+
onDirectoryPulled?(tenantId: string): Promise<void>;
|
|
106
|
+
logger?: Logger;
|
|
107
|
+
}
|
|
108
|
+
export interface PeerSyncScope {
|
|
109
|
+
tenantId?: string;
|
|
110
|
+
dbId?: string;
|
|
111
|
+
/**
|
|
112
|
+
* Stop starting new store pairs after this time (epoch ms), for hosts that
|
|
113
|
+
* limit how long one invocation may run. The next run resumes with the
|
|
114
|
+
* tenant this one did not finish.
|
|
115
|
+
*/
|
|
116
|
+
deadline?: number;
|
|
117
|
+
}
|
|
118
|
+
export interface PeerSyncRunResult {
|
|
119
|
+
peer: string;
|
|
120
|
+
tenants: number;
|
|
121
|
+
databases: number;
|
|
122
|
+
pushed: number;
|
|
123
|
+
pulled: number;
|
|
124
|
+
rejected: number;
|
|
125
|
+
/** Pairs whose cursor is clamped waiting for trust to replicate (invariant 2). */
|
|
126
|
+
held: number;
|
|
127
|
+
errors: string[];
|
|
128
|
+
/** The deadline ended the run before every store pair was mirrored. */
|
|
129
|
+
deferred?: boolean;
|
|
130
|
+
}
|
|
131
|
+
export declare class PeerReplicator {
|
|
132
|
+
private peer;
|
|
133
|
+
private readonly host;
|
|
134
|
+
private readonly logger;
|
|
135
|
+
private direction;
|
|
136
|
+
private role;
|
|
137
|
+
private attachments;
|
|
138
|
+
private running;
|
|
139
|
+
private paused;
|
|
140
|
+
private sessionState;
|
|
141
|
+
private eventsConnected;
|
|
142
|
+
private token;
|
|
143
|
+
private tokenIssuedAt;
|
|
144
|
+
private tokenPromise;
|
|
145
|
+
private intersection;
|
|
146
|
+
/** Tenant a run that hit its deadline did not finish; the next run starts there. */
|
|
147
|
+
private resumeTenantId;
|
|
148
|
+
private intersectionAt;
|
|
149
|
+
private tenants;
|
|
150
|
+
private transferredEntries;
|
|
151
|
+
private transferredBytes;
|
|
152
|
+
private syncInFlight;
|
|
153
|
+
private pendingScopes;
|
|
154
|
+
private pushTimer;
|
|
155
|
+
private idleTimer;
|
|
156
|
+
private reconnectTimer;
|
|
157
|
+
private reconnectAttempt;
|
|
158
|
+
private sseAbort;
|
|
159
|
+
private irohLink;
|
|
160
|
+
private unsubscribeBus;
|
|
161
|
+
private lastError;
|
|
162
|
+
private lastErrorClass;
|
|
163
|
+
private lastErrorAt;
|
|
164
|
+
private lastSyncAt;
|
|
165
|
+
/**
|
|
166
|
+
* Scan cursors, per (source, target) store pair.
|
|
167
|
+
*
|
|
168
|
+
* In-process only, deliberately: a restarted server pays one metadata scan
|
|
169
|
+
* per pair and then re-establishes the fast path from the store head. Cheap
|
|
170
|
+
* enough, and it avoids a second on-disk format to keep consistent with the
|
|
171
|
+
* stores it describes.
|
|
172
|
+
*/
|
|
173
|
+
private readonly cursors;
|
|
174
|
+
constructor(peer: TrustedServer, host: PeerReplicatorHost);
|
|
175
|
+
get name(): string;
|
|
176
|
+
get url(): string | undefined;
|
|
177
|
+
/** Replace the peer config in place (peer CRUD) without dropping cursors. */
|
|
178
|
+
updatePeer(peer: TrustedServer): void;
|
|
179
|
+
/** Roles and endpoint, for `GET /system/cluster/topology`. */
|
|
180
|
+
topologyEntry(): ClusterTopologyPeer;
|
|
181
|
+
start(): void;
|
|
182
|
+
stop(): Promise<void>;
|
|
183
|
+
pause(): void;
|
|
184
|
+
resume(): void;
|
|
185
|
+
private bootstrap;
|
|
186
|
+
private scheduleReconnect;
|
|
187
|
+
private ensureToken;
|
|
188
|
+
private authenticate;
|
|
189
|
+
private isIrohPeer;
|
|
190
|
+
private getIrohLink;
|
|
191
|
+
private peerFetch;
|
|
192
|
+
private irohPeerFetch;
|
|
193
|
+
/**
|
|
194
|
+
* Recompute the set of tenants both servers host.
|
|
195
|
+
*
|
|
196
|
+
* We send a Bloom summary of our tenant ids; the peer answers with the ids on
|
|
197
|
+
* *its* side that the filter might contain. Those are candidates only — a
|
|
198
|
+
* Bloom filter has false positives — so the result is intersected against the
|
|
199
|
+
* authoritative local list before anything is replicated. That second step is
|
|
200
|
+
* what makes the false-positive rate a performance question rather than a
|
|
201
|
+
* correctness one.
|
|
202
|
+
*/
|
|
203
|
+
refreshIntersection(): Promise<string[]>;
|
|
204
|
+
/**
|
|
205
|
+
* Run one full replication pass, optionally narrowed to a tenant or database.
|
|
206
|
+
*
|
|
207
|
+
* Concurrent calls collapse onto the in-flight run: the caller that arrives
|
|
208
|
+
* second gets the same promise rather than a second parallel mirror of the
|
|
209
|
+
* same stores.
|
|
210
|
+
*/
|
|
211
|
+
syncNow(scope?: PeerSyncScope): Promise<PeerSyncRunResult>;
|
|
212
|
+
/**
|
|
213
|
+
* Re-offer entries the peer rejected.
|
|
214
|
+
*
|
|
215
|
+
* Under the hold policy the cursor is already clamped, so a plain sync run is
|
|
216
|
+
* the retry — this exists as a named admin action so the UI has something to
|
|
217
|
+
* call that says what it does.
|
|
218
|
+
*/
|
|
219
|
+
retryRejected(scope?: PeerSyncScope): Promise<PeerSyncRunResult>;
|
|
220
|
+
private runSync;
|
|
221
|
+
/**
|
|
222
|
+
* The (database, store) pairs to mirror for one tenant, in order.
|
|
223
|
+
*
|
|
224
|
+
* `eager` interleaves — each database's documents are immediately followed by
|
|
225
|
+
* its attachments, so a database is complete before the next one starts.
|
|
226
|
+
* `lazy` runs every document store first and only then the attachment stores:
|
|
227
|
+
* a run that is interrupted (or a link that is slow) has then spent its
|
|
228
|
+
* bandwidth on the text, which is what makes documents readable, rather than
|
|
229
|
+
* on blobs that can be fetched later. `never` skips attachments entirely.
|
|
230
|
+
*
|
|
231
|
+
* Database order comes from {@link orderDatabasesForReplication} either way —
|
|
232
|
+
* invariant 1 outranks the attachment policy.
|
|
233
|
+
*/
|
|
234
|
+
private mirrorPlan;
|
|
235
|
+
/**
|
|
236
|
+
* Databases to mirror for a tenant: the union of both sides, in invariant
|
|
237
|
+
* order (invariant 1).
|
|
238
|
+
*
|
|
239
|
+
* Union rather than intersection, because a database that exists only on the
|
|
240
|
+
* peer is exactly the thing a fresh mirror needs to pull.
|
|
241
|
+
*/
|
|
242
|
+
private databasesFor;
|
|
243
|
+
private syncStorePair;
|
|
244
|
+
/**
|
|
245
|
+
* One leg of a store pair, with a batch-wide denial folded into `held`.
|
|
246
|
+
*
|
|
247
|
+
* See {@link syncStorePair}: a denial means "not now", so the cursor must
|
|
248
|
+
* stay put and the pair is retried on the next run. Any other failure is a
|
|
249
|
+
* real error and propagates to the tenant loop.
|
|
250
|
+
*/
|
|
251
|
+
private transfer;
|
|
252
|
+
private createRemoteStore;
|
|
253
|
+
private cursorStore;
|
|
254
|
+
private acceptsLocalChange;
|
|
255
|
+
/**
|
|
256
|
+
* Push a local change now and resolve when done, instead of coalescing it
|
|
257
|
+
* on a timer. For hosts that cannot rely on timers outliving the request
|
|
258
|
+
* that reported the change.
|
|
259
|
+
*/
|
|
260
|
+
replicateLocalChange(event: SyncChangeEvent): Promise<void>;
|
|
261
|
+
private onLocalChange;
|
|
262
|
+
/**
|
|
263
|
+
* Round-robin over the pending (tenant, db) scopes.
|
|
264
|
+
*
|
|
265
|
+
* Sequential on purpose: a hub with many spokes should not open a hundred
|
|
266
|
+
* parallel sessions to one peer, and one busy tenant must not starve the
|
|
267
|
+
* others — each pending scope gets its turn in the order it was queued.
|
|
268
|
+
*/
|
|
269
|
+
private flushScopes;
|
|
270
|
+
private startEventStream;
|
|
271
|
+
private consumeEventStream;
|
|
272
|
+
private consumeIrohEventStream;
|
|
273
|
+
private handleEventFrame;
|
|
274
|
+
private handleChangeEvent;
|
|
275
|
+
private recordError;
|
|
276
|
+
/**
|
|
277
|
+
* Status snapshot for `GET /system/cluster/status`.
|
|
278
|
+
*
|
|
279
|
+
* Read straight from in-memory replication state — no store scans — so the
|
|
280
|
+
* admin UI can poll it without competing with replication for I/O. Contains
|
|
281
|
+
* counts and classified reasons only: never a docId, never an author key.
|
|
282
|
+
*/
|
|
283
|
+
snapshot(): ClusterPeerStatus;
|
|
284
|
+
tenantSnapshot(tenantId: string): ClusterTenantStatus | null;
|
|
285
|
+
private tenantStatus;
|
|
286
|
+
/** Reasons that come from the link itself rather than from any one tenant. */
|
|
287
|
+
private peerLevelReasons;
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Collapse reasons into one health verdict, shared by the per-tenant, per-peer
|
|
291
|
+
* and per-node rollups so all three agree on the thresholds.
|
|
292
|
+
*
|
|
293
|
+
* `stalled` outranks `degraded` deliberately. A clamped cursor is the visible
|
|
294
|
+
* precursor of divergence: the link looks healthy, entries keep flowing, and
|
|
295
|
+
* yet one database is quietly stuck behind an entry the peer will not accept
|
|
296
|
+
* until the directory catches up. That is the state an operator most needs to
|
|
297
|
+
* see, so a transient error elsewhere must not mask it.
|
|
298
|
+
*/
|
|
299
|
+
export declare function rollUpHealth(tenants: ClusterTenantStatus[], extraReasons?: ClusterHealthReason[]): {
|
|
300
|
+
health: ClusterHealth;
|
|
301
|
+
reasons: ClusterHealthReason[];
|
|
302
|
+
};
|
|
303
|
+
//# sourceMappingURL=PeerReplicator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PeerReplicator.d.ts","sourceRoot":"","sources":["../../../src/server/peer/PeerReplicator.ts"],"names":[],"mappings":"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"}
|