@powersync/service-core 1.20.3 → 1.20.5
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/CHANGELOG.md +30 -0
- package/dist/api/RouteAPI.d.ts +14 -0
- package/dist/api/api-index.d.ts +1 -1
- package/dist/api/api-index.js +1 -1
- package/dist/api/api-index.js.map +1 -1
- package/dist/api/api-metrics.js.map +1 -1
- package/dist/api/diagnostics.js +16 -14
- package/dist/api/diagnostics.js.map +1 -1
- package/dist/auth/CachedKeyCollector.js +1 -1
- package/dist/auth/CachedKeyCollector.js.map +1 -1
- package/dist/auth/CompoundKeyCollector.js.map +1 -1
- package/dist/auth/KeyStore.js.map +1 -1
- package/dist/auth/RemoteJWKSCollector.js.map +1 -1
- package/dist/auth/StaticKeyCollector.d.ts +1 -1
- package/dist/auth/StaticKeyCollector.js.map +1 -1
- package/dist/auth/StaticSupabaseKeyCollector.d.ts +1 -1
- package/dist/auth/StaticSupabaseKeyCollector.js.map +1 -1
- package/dist/entry/commands/teardown-action.js +1 -1
- package/dist/entry/commands/teardown-action.js.map +1 -1
- package/dist/entry/entry-index.d.ts +1 -1
- package/dist/entry/entry-index.js +1 -1
- package/dist/entry/entry-index.js.map +1 -1
- package/dist/events/EventsEngine.js +1 -1
- package/dist/events/EventsEngine.js.map +1 -1
- package/dist/metrics/MetricsEngine.d.ts +1 -1
- package/dist/metrics/RollingBucketMax.d.ts +28 -0
- package/dist/metrics/RollingBucketMax.js +80 -0
- package/dist/metrics/RollingBucketMax.js.map +1 -0
- package/dist/metrics/metrics-index.d.ts +3 -2
- package/dist/metrics/metrics-index.js +3 -2
- package/dist/metrics/metrics-index.js.map +1 -1
- package/dist/metrics/open-telemetry/util.js +1 -1
- package/dist/metrics/open-telemetry/util.js.map +1 -1
- package/dist/metrics/register-metrics.js +2 -2
- package/dist/metrics/register-metrics.js.map +1 -1
- package/dist/modules/AbstractModule.d.ts +1 -1
- package/dist/modules/AbstractModule.js.map +1 -1
- package/dist/modules/modules-index.d.ts +1 -1
- package/dist/modules/modules-index.js +1 -1
- package/dist/modules/modules-index.js.map +1 -1
- package/dist/replication/AbstractReplicationJob.d.ts +2 -2
- package/dist/replication/AbstractReplicator.d.ts +1 -1
- package/dist/replication/AbstractReplicator.js +10 -7
- package/dist/replication/AbstractReplicator.js.map +1 -1
- package/dist/replication/ReplicationLagTracker.d.ts +50 -0
- package/dist/replication/ReplicationLagTracker.js +78 -0
- package/dist/replication/ReplicationLagTracker.js.map +1 -0
- package/dist/replication/replication-index.d.ts +3 -2
- package/dist/replication/replication-index.js +3 -2
- package/dist/replication/replication-index.js.map +1 -1
- package/dist/replication/replication-metrics.js.map +1 -1
- package/dist/routes/configure-fastify.d.ts +59 -32
- package/dist/routes/endpoints/admin.d.ts +108 -54
- package/dist/routes/endpoints/sync-rules.js +3 -3
- package/dist/routes/endpoints/sync-rules.js.map +1 -1
- package/dist/routes/endpoints/sync-stream.d.ts +10 -10
- package/dist/routes/hooks.js +1 -1
- package/dist/routes/hooks.js.map +1 -1
- package/dist/routes/route-register.js.map +1 -1
- package/dist/storage/BucketStorageBatch.d.ts +1 -1
- package/dist/storage/BucketStorageFactory.d.ts +5 -3
- package/dist/storage/BucketStorageFactory.js +10 -8
- package/dist/storage/BucketStorageFactory.js.map +1 -1
- package/dist/storage/ChecksumCache.js.map +1 -1
- package/dist/storage/PersistedSyncRulesContent.js +14 -2
- package/dist/storage/PersistedSyncRulesContent.js.map +1 -1
- package/dist/storage/ReplicationEventPayload.d.ts +1 -1
- package/dist/storage/SourceTable.d.ts +1 -1
- package/dist/storage/SourceTable.js.map +1 -1
- package/dist/storage/storage-index.d.ts +8 -8
- package/dist/storage/storage-index.js +8 -8
- package/dist/storage/storage-index.js.map +1 -1
- package/dist/storage/storage-metrics.js.map +1 -1
- package/dist/streams/streams-index.d.ts +2 -2
- package/dist/streams/streams-index.js +2 -2
- package/dist/streams/streams-index.js.map +1 -1
- package/dist/sync/BucketChecksumState.js +4 -19
- package/dist/sync/BucketChecksumState.js.map +1 -1
- package/dist/sync/RequestTracker.js +1 -1
- package/dist/sync/RequestTracker.js.map +1 -1
- package/dist/sync/sync-index.d.ts +2 -2
- package/dist/sync/sync-index.js +2 -2
- package/dist/sync/sync-index.js.map +1 -1
- package/dist/sync/sync.js.map +1 -1
- package/dist/sync/util.js.map +1 -1
- package/dist/system/ServiceContext.d.ts +1 -1
- package/dist/system/ServiceContext.js +1 -1
- package/dist/system/ServiceContext.js.map +1 -1
- package/dist/util/config/collectors/impl/base64-config-collector.d.ts +1 -1
- package/dist/util/config/collectors/impl/base64-config-collector.js.map +1 -1
- package/dist/util/config/collectors/impl/filesystem-config-collector.d.ts +1 -1
- package/dist/util/config/collectors/impl/filesystem-config-collector.js +1 -1
- package/dist/util/config/collectors/impl/filesystem-config-collector.js.map +1 -1
- package/dist/util/config/sync-rules/sync-rules-provider.js.map +1 -1
- package/dist/util/config.js +1 -1
- package/dist/util/config.js.map +1 -1
- package/dist/util/errors.d.ts +3 -0
- package/dist/util/errors.js +15 -0
- package/dist/util/errors.js.map +1 -0
- package/dist/util/protocol-types.d.ts +2 -2
- package/dist/util/util-index.d.ts +1 -1
- package/dist/util/util-index.js +1 -1
- package/dist/util/util-index.js.map +1 -1
- package/dist/util/utils.d.ts +1 -1
- package/package.json +6 -6
- package/src/api/RouteAPI.ts +17 -0
- package/src/api/api-index.ts +1 -1
- package/src/api/api-metrics.ts +1 -1
- package/src/api/diagnostics.ts +18 -19
- package/src/auth/CachedKeyCollector.ts +2 -3
- package/src/auth/CompoundKeyCollector.ts +2 -3
- package/src/auth/KeyStore.ts +1 -1
- package/src/auth/RemoteJWKSCollector.ts +0 -1
- package/src/auth/StaticKeyCollector.ts +1 -1
- package/src/auth/StaticSupabaseKeyCollector.ts +1 -1
- package/src/entry/commands/teardown-action.ts +1 -1
- package/src/entry/entry-index.ts +1 -1
- package/src/events/EventsEngine.ts +1 -1
- package/src/metrics/MetricsEngine.ts +1 -1
- package/src/metrics/RollingBucketMax.ts +109 -0
- package/src/metrics/metrics-index.ts +3 -2
- package/src/metrics/open-telemetry/util.ts +1 -1
- package/src/metrics/register-metrics.ts +3 -3
- package/src/modules/AbstractModule.ts +1 -1
- package/src/modules/modules-index.ts +1 -1
- package/src/replication/AbstractReplicationJob.ts +2 -2
- package/src/replication/AbstractReplicator.ts +9 -7
- package/src/replication/ReplicationLagTracker.ts +86 -0
- package/src/replication/replication-index.ts +3 -2
- package/src/replication/replication-metrics.ts +1 -1
- package/src/routes/endpoints/sync-rules.ts +3 -5
- package/src/routes/hooks.ts +2 -2
- package/src/routes/route-register.ts +2 -10
- package/src/storage/BucketStorageBatch.ts +1 -1
- package/src/storage/BucketStorageFactory.ts +18 -14
- package/src/storage/ChecksumCache.ts +1 -1
- package/src/storage/PersistedSyncRulesContent.ts +18 -2
- package/src/storage/ReplicationEventPayload.ts +1 -1
- package/src/storage/SourceTable.ts +1 -1
- package/src/storage/storage-index.ts +8 -8
- package/src/storage/storage-metrics.ts +2 -2
- package/src/streams/streams-index.ts +2 -2
- package/src/sync/BucketChecksumState.ts +5 -21
- package/src/sync/RequestTracker.ts +1 -1
- package/src/sync/sync-index.ts +2 -2
- package/src/sync/sync.ts +1 -7
- package/src/sync/util.ts +1 -1
- package/src/system/ServiceContext.ts +1 -1
- package/src/util/config/collectors/impl/base64-config-collector.ts +1 -1
- package/src/util/config/collectors/impl/filesystem-config-collector.ts +2 -2
- package/src/util/config/sync-rules/sync-rules-provider.ts +1 -1
- package/src/util/config.ts +1 -1
- package/src/util/errors.ts +21 -0
- package/src/util/util-index.ts +1 -1
- package/src/util/utils.ts +1 -1
- package/test/src/ReplicationLagTracker.test.ts +53 -0
- package/test/src/RollingBucketMax.test.ts +106 -0
- package/test/src/auth.test.ts +7 -7
- package/test/src/module-loader.test.ts +1 -1
- package/test/src/routes/mocks.ts +1 -1
- package/test/src/routes/stream.test.ts +1 -2
- package/test/src/sync/BucketChecksumState.test.ts +2 -2
- package/test/src/util/protocol_types.test.ts +1 -1
- package/tsconfig.tsbuildinfo +1 -1
- package/vitest.config.ts +1 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { LifeCycledSystem, ServiceIdentifier } from '@powersync/lib-services-framework';
|
|
2
|
+
import { EventsEngine } from '../events/EventsEngine.js';
|
|
2
3
|
import * as metrics from '../metrics/MetricsEngine.js';
|
|
3
4
|
import { PowerSyncMigrationManager } from '../migrations/PowerSyncMigrationManager.js';
|
|
4
5
|
import * as replication from '../replication/replication-index.js';
|
|
@@ -6,7 +7,6 @@ import * as routes from '../routes/routes-index.js';
|
|
|
6
7
|
import * as storage from '../storage/storage-index.js';
|
|
7
8
|
import { SyncContext } from '../sync/SyncContext.js';
|
|
8
9
|
import * as utils from '../util/util-index.js';
|
|
9
|
-
import { EventsEngine } from '../events/EventsEngine.js';
|
|
10
10
|
export interface ServiceContext {
|
|
11
11
|
configuration: utils.ResolvedPowerSyncConfig;
|
|
12
12
|
lifeCycleEngine: LifeCycledSystem;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { container, LifeCycledSystem, MigrationManager } from '@powersync/lib-services-framework';
|
|
2
|
+
import { EventsEngine } from '../events/EventsEngine.js';
|
|
2
3
|
import { framework } from '../index.js';
|
|
3
4
|
import * as metrics from '../metrics/MetricsEngine.js';
|
|
4
5
|
import * as replication from '../replication/replication-index.js';
|
|
@@ -6,7 +7,6 @@ import * as routes from '../routes/routes-index.js';
|
|
|
6
7
|
import * as storage from '../storage/storage-index.js';
|
|
7
8
|
import { SyncContext } from '../sync/SyncContext.js';
|
|
8
9
|
import * as utils from '../util/util-index.js';
|
|
9
|
-
import { EventsEngine } from '../events/EventsEngine.js';
|
|
10
10
|
export var ServiceContextMode;
|
|
11
11
|
(function (ServiceContextMode) {
|
|
12
12
|
ServiceContextMode["API"] = "api";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServiceContext.js","sourceRoot":"","sources":["../../src/system/ServiceContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAqB,MAAM,mCAAmC,CAAC;AAErH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,OAAO,MAAM,6BAA6B,CAAC;AAEvD,OAAO,KAAK,WAAW,MAAM,qCAAqC,CAAC;AACnE,OAAO,KAAK,MAAM,MAAM,2BAA2B,CAAC;AACpD,OAAO,KAAK,OAAO,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,KAAK,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"ServiceContext.js","sourceRoot":"","sources":["../../src/system/ServiceContext.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ConfigCollector } from '../config-collector.js';
|
|
2
1
|
import { RunnerConfig } from '../../types.js';
|
|
2
|
+
import { ConfigCollector } from '../config-collector.js';
|
|
3
3
|
export declare class Base64ConfigCollector extends ConfigCollector {
|
|
4
4
|
get name(): string;
|
|
5
5
|
collectSerialized(runnerConfig: RunnerConfig): Promise<any>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base64-config-collector.js","sourceRoot":"","sources":["../../../../../src/util/config/collectors/impl/base64-config-collector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"base64-config-collector.js","sourceRoot":"","sources":["../../../../../src/util/config/collectors/impl/base64-config-collector.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,OAAO,qBAAsB,SAAQ,eAAe;IACxD,IAAI,IAAI;QACN,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,YAA0B;QAChD,MAAM,EAAE,aAAa,EAAE,GAAG,YAAY,CAAC;QACvC,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,sCAAsC;QACtC,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5E,CAAC;CACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ConfigCollector } from '../config-collector.js';
|
|
2
1
|
import { RunnerConfig } from '../../types.js';
|
|
2
|
+
import { ConfigCollector } from '../config-collector.js';
|
|
3
3
|
export declare class FileSystemConfigCollector extends ConfigCollector {
|
|
4
4
|
get name(): string;
|
|
5
5
|
collectSerialized(runnerConfig: RunnerConfig): Promise<any>;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as fs from 'fs/promises';
|
|
2
2
|
import * as path from 'path';
|
|
3
|
-
import { ConfigCollector, ConfigFileFormat } from '../config-collector.js';
|
|
4
3
|
import { logger } from '@powersync/lib-services-framework';
|
|
4
|
+
import { ConfigCollector, ConfigFileFormat } from '../config-collector.js';
|
|
5
5
|
export class FileSystemConfigCollector extends ConfigCollector {
|
|
6
6
|
get name() {
|
|
7
7
|
return 'FileSystem';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filesystem-config-collector.js","sourceRoot":"","sources":["../../../../../src/util/config/collectors/impl/filesystem-config-collector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"filesystem-config-collector.js","sourceRoot":"","sources":["../../../../../src/util/config/collectors/impl/filesystem-config-collector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAE3D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE3E,MAAM,OAAO,yBAA0B,SAAQ,eAAe;IAC5D,IAAI,IAAI;QACN,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,YAA0B;QAChD,MAAM,EAAE,WAAW,EAAE,GAAG,YAAY,CAAC;QACrC,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;QAE9D,uBAAuB;QACvB,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,oBAAoB,YAAY,8CAA8C,CAAC,CAAC;QAClG,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,iDAAiD,YAAY,EAAE,CAAC,CAAC;QAC7E,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAEzD,IAAI,WAAyC,CAAC;QAC9C,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACnC,KAAK,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAC/B,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC;gBACpC,MAAM;YACR,KAAK,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAChC,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC;gBACpC,MAAM;QACV,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACjD,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-rules-provider.js","sourceRoot":"","sources":["../../../../src/util/config/sync-rules/sync-rules-provider.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sync-rules-provider.js","sourceRoot":"","sources":["../../../../src/util/config/sync-rules/sync-rules-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAS7B,MAAM,OAAO,kCAAkC;IACzB;IAApB,YAAoB,MAAuB;QAAvB,WAAM,GAAN,MAAM,CAAiB;IAAG,CAAC;IAE/C,KAAK,CAAC,GAAG;QACP,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QAC7B,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5B,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;IACnC,CAAC;CACF"}
|
package/dist/util/config.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as fs from 'fs/promises';
|
|
2
2
|
import winston from 'winston';
|
|
3
|
-
import { container,
|
|
3
|
+
import { container, DEFAULT_LOG_FORMAT, DEFAULT_LOG_LEVEL, LogFormat, logger } from '@powersync/lib-services-framework';
|
|
4
4
|
import { CompoundConfigCollector } from './util-index.js';
|
|
5
5
|
export function configureLogger(config) {
|
|
6
6
|
const level = process.env.PS_LOG_LEVEL ?? config?.level ?? DEFAULT_LOG_LEVEL;
|
package/dist/util/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/util/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/util/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAGxH,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,MAAM,UAAU,eAAe,CAAC,MAAiC;IAC/D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,MAAM,EAAE,KAAK,IAAI,iBAAiB,CAAC;IAC7E,MAAM,MAAM,GACT,OAAO,CAAC,GAAG,CAAC,aAAoD,IAAI,MAAM,EAAE,MAAM,IAAI,kBAAkB,CAAC;IAC5G,MAAM,aAAa,GAAG,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC;IAEvF,2JAA2J;IAC3J,8EAA8E;IAC9E,MAAM,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IACtH,MAAM,CAAC,IAAI,CAAC,iCAAiC,KAAK,iBAAiB,MAAM,GAAG,CAAC,CAAC;IAE9E,MAAM,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;AACrG,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,YAA0B;IACzD,MAAM,SAAS,GAAG,SAAS,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;IAC3D,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAA+B;IACjE,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACrC,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;QACvB,OAAO,UAAU,CAAC,OAAO,CAAC;IAC5B,CAAC;SAAM,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;QAC3B,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export function syncConfigYamlErrorToReplicationError({ type, message, location }, ts) {
|
|
2
|
+
const error = {
|
|
3
|
+
level: type,
|
|
4
|
+
message,
|
|
5
|
+
ts
|
|
6
|
+
};
|
|
7
|
+
if (location != null) {
|
|
8
|
+
error.location = {
|
|
9
|
+
start_offset: location.start,
|
|
10
|
+
end_offset: location.end
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
return error;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/util/errors.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,qCAAqC,CACnD,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAa,EACtC,EAAW;IAEX,MAAM,KAAK,GAAqB;QAC9B,KAAK,EAAE,IAAI;QACX,OAAO;QACP,EAAE;KACH,CAAC;IACF,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;QACrB,KAAK,CAAC,QAAQ,GAAG;YACf,YAAY,EAAE,QAAQ,CAAC,KAAK;YAC5B,UAAU,EAAE,QAAQ,CAAC,GAAG;SACzB,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -102,15 +102,15 @@ export declare const StreamingSyncRequest: t.ObjectCodec<{
|
|
|
102
102
|
*/
|
|
103
103
|
streams: t.OptionalCodec<t.Codec<{
|
|
104
104
|
subscriptions: {
|
|
105
|
-
parameters: Record<string, any> | null;
|
|
106
105
|
stream: string;
|
|
106
|
+
parameters: Record<string, any> | null;
|
|
107
107
|
override_priority: number | null;
|
|
108
108
|
}[];
|
|
109
109
|
include_defaults?: boolean | undefined;
|
|
110
110
|
}, {
|
|
111
111
|
subscriptions: {
|
|
112
|
-
parameters: Record<string, any> | null;
|
|
113
112
|
stream: string;
|
|
113
|
+
parameters: Record<string, any> | null;
|
|
114
114
|
override_priority: number | null;
|
|
115
115
|
}[];
|
|
116
116
|
include_defaults?: boolean | undefined;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export * from './alerting.js';
|
|
2
|
+
export * from './checkpointing.js';
|
|
2
3
|
export * from './env.js';
|
|
3
4
|
export * from './lsn.js';
|
|
4
5
|
export * from './memory-tracking.js';
|
|
@@ -6,7 +7,6 @@ export * from './Mutex.js';
|
|
|
6
7
|
export * from './protocol-types.js';
|
|
7
8
|
export * from './secs.js';
|
|
8
9
|
export * from './utils.js';
|
|
9
|
-
export * from './checkpointing.js';
|
|
10
10
|
export * from './version.js';
|
|
11
11
|
export * from './config.js';
|
|
12
12
|
export * from './config/compound-config-collector.js';
|
package/dist/util/util-index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export * from './alerting.js';
|
|
2
|
+
export * from './checkpointing.js';
|
|
2
3
|
export * from './env.js';
|
|
3
4
|
export * from './lsn.js';
|
|
4
5
|
export * from './memory-tracking.js';
|
|
@@ -6,7 +7,6 @@ export * from './Mutex.js';
|
|
|
6
7
|
export * from './protocol-types.js';
|
|
7
8
|
export * from './secs.js';
|
|
8
9
|
export * from './utils.js';
|
|
9
|
-
export * from './checkpointing.js';
|
|
10
10
|
export * from './version.js';
|
|
11
11
|
export * from './config.js';
|
|
12
12
|
export * from './config/compound-config-collector.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util-index.js","sourceRoot":"","sources":["../../src/util/util-index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,
|
|
1
|
+
{"version":3,"file":"util-index.js","sourceRoot":"","sources":["../../src/util/util-index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAE7B,cAAc,aAAa,CAAC;AAC5B,cAAc,uCAAuC,CAAC;AACtD,cAAc,mBAAmB,CAAC;AAElC,cAAc,yCAAyC,CAAC;AACxD,cAAc,qDAAqD,CAAC;AACpE,cAAc,uDAAuD,CAAC;AACtE,cAAc,yDAAyD,CAAC;AAExE,cAAc,yDAAyD,CAAC;AACxE,cAAc,6DAA6D,CAAC;AAC5E,cAAc,yDAAyD,CAAC;AACxE,cAAc,uCAAuC,CAAC;AACtD,cAAc,4CAA4C,CAAC"}
|
package/dist/util/utils.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as sync_rules from '@powersync/service-sync-rules';
|
|
2
2
|
import * as bson from 'bson';
|
|
3
|
-
import { BucketChecksum,
|
|
3
|
+
import { BucketChecksum, OplogEntry, ProtocolOpId } from './protocol-types.js';
|
|
4
4
|
import * as storage from '../storage/storage-index.js';
|
|
5
5
|
export type ChecksumMap = Map<string, BucketChecksum>;
|
|
6
6
|
/**
|
package/package.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
8
|
-
"version": "1.20.
|
|
8
|
+
"version": "1.20.5",
|
|
9
9
|
"main": "dist/index.js",
|
|
10
10
|
"license": "FSL-1.1-ALv2",
|
|
11
11
|
"type": "module",
|
|
@@ -33,17 +33,17 @@
|
|
|
33
33
|
"uuid": "^11.1.0",
|
|
34
34
|
"winston": "^3.13.0",
|
|
35
35
|
"yaml": "^2.3.2",
|
|
36
|
-
"@powersync/lib-services-framework": "0.9.
|
|
36
|
+
"@powersync/lib-services-framework": "0.9.3",
|
|
37
|
+
"@powersync/service-rsocket-router": "0.2.19",
|
|
37
38
|
"@powersync/service-jsonbig": "0.17.12",
|
|
38
|
-
"@powersync/service-
|
|
39
|
-
"@powersync/service-
|
|
40
|
-
"@powersync/service-types": "0.15.0"
|
|
39
|
+
"@powersync/service-sync-rules": "0.35.0",
|
|
40
|
+
"@powersync/service-types": "0.15.1"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"@types/async": "^3.2.24",
|
|
44
44
|
"@types/negotiator": "^0.6.4",
|
|
45
45
|
"@types/lodash": "^4.17.5",
|
|
46
|
-
"fastify": "^5.
|
|
46
|
+
"fastify": "^5.8.2",
|
|
47
47
|
"fastify-plugin": "^5.0.1"
|
|
48
48
|
},
|
|
49
49
|
"scripts": {
|
package/src/api/RouteAPI.ts
CHANGED
|
@@ -14,6 +14,16 @@ export interface ReplicationLagOptions {
|
|
|
14
14
|
bucketStorage: SyncRulesBucketStorage;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
+
export interface SlotWalBudgetInfo {
|
|
18
|
+
wal_status: string;
|
|
19
|
+
safe_wal_size?: number;
|
|
20
|
+
max_slot_wal_keep_size?: number;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface SlotWalBudgetOptions {
|
|
24
|
+
slotName: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
17
27
|
/**
|
|
18
28
|
* Describes all the methods currently required to service the sync API endpoints.
|
|
19
29
|
*/
|
|
@@ -49,6 +59,13 @@ export interface RouteAPI {
|
|
|
49
59
|
*/
|
|
50
60
|
getReplicationLagBytes(options: ReplicationLagOptions): Promise<number | undefined>;
|
|
51
61
|
|
|
62
|
+
/**
|
|
63
|
+
* @returns WAL budget information for the replication slot, or undefined
|
|
64
|
+
* if the slot doesn't exist or the source doesn't support this.
|
|
65
|
+
* Only implemented by the Postgres adapter.
|
|
66
|
+
*/
|
|
67
|
+
getSlotWalBudget?(options: SlotWalBudgetOptions): Promise<SlotWalBudgetInfo | undefined>;
|
|
68
|
+
|
|
52
69
|
/**
|
|
53
70
|
* Get the current LSN or equivalent replication HEAD position identifier.
|
|
54
71
|
*
|
package/src/api/api-index.ts
CHANGED
package/src/api/api-metrics.ts
CHANGED
package/src/api/diagnostics.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { logger } from '@powersync/lib-services-framework';
|
|
2
|
-
import { DEFAULT_TAG, SourceTableInterface,
|
|
2
|
+
import { DEFAULT_TAG, SourceTableInterface, SyncConfigWithErrors } from '@powersync/service-sync-rules';
|
|
3
3
|
import { ReplicationError, SyncRulesStatus, TableInfo } from '@powersync/service-types';
|
|
4
4
|
|
|
5
5
|
import * as storage from '../storage/storage-index.js';
|
|
6
|
-
import {
|
|
6
|
+
import { syncConfigYamlErrorToReplicationError } from '../util/errors.js';
|
|
7
|
+
import { RouteAPI, SlotWalBudgetInfo } from './RouteAPI.js';
|
|
7
8
|
|
|
8
9
|
export interface DiagnosticsOptions {
|
|
9
10
|
/**
|
|
@@ -62,6 +63,7 @@ export async function getSyncRulesStatus(
|
|
|
62
63
|
const systemStorage = live_status ? bucketStorage.getInstance(sync_rules) : undefined;
|
|
63
64
|
const status = await systemStorage?.getStatus();
|
|
64
65
|
let replication_lag_bytes: number | undefined = undefined;
|
|
66
|
+
let slot_wal_budget: SlotWalBudgetInfo | undefined = undefined;
|
|
65
67
|
|
|
66
68
|
let tables_flat: TableInfo[] = [];
|
|
67
69
|
|
|
@@ -87,6 +89,16 @@ export async function getSyncRulesStatus(
|
|
|
87
89
|
// Ignore
|
|
88
90
|
logger.warn(`Unable to get replication lag`, e);
|
|
89
91
|
}
|
|
92
|
+
|
|
93
|
+
if (apiHandler.getSlotWalBudget) {
|
|
94
|
+
try {
|
|
95
|
+
slot_wal_budget = await apiHandler.getSlotWalBudget({
|
|
96
|
+
slotName: sync_rules.slot_name
|
|
97
|
+
});
|
|
98
|
+
} catch (e) {
|
|
99
|
+
logger.warn(`Unable to get WAL budget`, e);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
90
102
|
}
|
|
91
103
|
} else {
|
|
92
104
|
const source_table_patterns = rules.getSourceTables();
|
|
@@ -131,23 +143,7 @@ export async function getSyncRulesStatus(
|
|
|
131
143
|
ts: sync_rules.last_fatal_error_ts?.toISOString()
|
|
132
144
|
});
|
|
133
145
|
}
|
|
134
|
-
errors.push(
|
|
135
|
-
...syncRuleErrors.map(({ type, message, location }) => {
|
|
136
|
-
const error: ReplicationError = {
|
|
137
|
-
level: type,
|
|
138
|
-
message,
|
|
139
|
-
ts: now
|
|
140
|
-
};
|
|
141
|
-
if (location != null) {
|
|
142
|
-
error.location = {
|
|
143
|
-
start_offset: location.start,
|
|
144
|
-
end_offset: location.end
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
return error;
|
|
149
|
-
})
|
|
150
|
-
);
|
|
146
|
+
errors.push(...syncRuleErrors.map((error) => syncConfigYamlErrorToReplicationError(error, now)));
|
|
151
147
|
|
|
152
148
|
if (live_status && status?.active) {
|
|
153
149
|
// Check replication lag for active sync rules.
|
|
@@ -197,6 +193,9 @@ export async function getSyncRulesStatus(
|
|
|
197
193
|
last_checkpoint_ts: sync_rules.last_checkpoint_ts?.toISOString(),
|
|
198
194
|
last_keepalive_ts: sync_rules.last_keepalive_ts?.toISOString(),
|
|
199
195
|
replication_lag_bytes: replication_lag_bytes,
|
|
196
|
+
wal_status: slot_wal_budget?.wal_status,
|
|
197
|
+
safe_wal_size: slot_wal_budget?.safe_wal_size,
|
|
198
|
+
max_slot_wal_keep_size: slot_wal_budget?.max_slot_wal_keep_size,
|
|
200
199
|
tables: tables_flat
|
|
201
200
|
}
|
|
202
201
|
],
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { AuthorizationError, ErrorCode, logger } from '@powersync/lib-services-framework';
|
|
2
2
|
import timers from 'timers/promises';
|
|
3
|
+
import { KeyCollector, KeyResult } from './KeyCollector.js';
|
|
3
4
|
import { KeySpec } from './KeySpec.js';
|
|
4
5
|
import { LeakyBucket } from './LeakyBucket.js';
|
|
5
|
-
import { KeyCollector, KeyResult } from './KeyCollector.js';
|
|
6
|
-
import { AuthorizationError, ErrorCode, logger } from '@powersync/lib-services-framework';
|
|
7
6
|
import { mapAuthConfigError } from './utils.js';
|
|
8
7
|
|
|
9
8
|
/**
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import * as jose from 'jose';
|
|
2
|
-
import { KeySpec } from './KeySpec.js';
|
|
3
|
-
import { KeyCollector, KeyResult } from './KeyCollector.js';
|
|
4
1
|
import { AuthorizationError } from '@powersync/lib-services-framework';
|
|
2
|
+
import { KeyCollector, KeyResult } from './KeyCollector.js';
|
|
3
|
+
import { KeySpec } from './KeySpec.js';
|
|
5
4
|
|
|
6
5
|
export class CompoundKeyCollector implements KeyCollector {
|
|
7
6
|
private collectors: KeyCollector[];
|
package/src/auth/KeyStore.ts
CHANGED
|
@@ -4,7 +4,7 @@ import secs from '../util/secs.js';
|
|
|
4
4
|
import { JwtPayload } from './JwtPayload.js';
|
|
5
5
|
import { KeyCollector } from './KeyCollector.js';
|
|
6
6
|
import { KeyOptions, KeySpec, SUPPORTED_ALGORITHMS } from './KeySpec.js';
|
|
7
|
-
import { debugKeyNotFound, mapAuthError, SupabaseAuthDetails
|
|
7
|
+
import { debugKeyNotFound, mapAuthError, SupabaseAuthDetails } from './utils.js';
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* KeyStore to get keys and verify tokens.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as jose from 'jose';
|
|
2
|
-
import { KeySpec, KeyOptions } from './KeySpec.js';
|
|
3
2
|
import { KeyCollector, KeyResult } from './KeyCollector.js';
|
|
3
|
+
import { KeyOptions, KeySpec } from './KeySpec.js';
|
|
4
4
|
|
|
5
5
|
export const SUPABASE_KEY_OPTIONS: KeyOptions = {
|
|
6
6
|
requiresAudience: ['authenticated'],
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
|
|
3
|
+
import { ErrorCode, ServiceError } from '@powersync/lib-services-framework';
|
|
3
4
|
import { teardown } from '../../runner/teardown.js';
|
|
4
5
|
import { extractRunnerOptions, wrapConfigCommand } from './config-command.js';
|
|
5
|
-
import { ErrorCode, ServiceError } from '@powersync/lib-services-framework';
|
|
6
6
|
|
|
7
7
|
const COMMAND_NAME = 'teardown';
|
|
8
8
|
|
package/src/entry/entry-index.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export * from './cli-entry.js';
|
|
2
|
+
export * from './commands/compact-action.js';
|
|
2
3
|
export * from './commands/config-command.js';
|
|
3
4
|
export * from './commands/migrate-action.js';
|
|
4
5
|
export * from './commands/start-action.js';
|
|
5
6
|
export * from './commands/teardown-action.js';
|
|
6
|
-
export * from './commands/compact-action.js';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { logger, ServiceAssertionError } from '@powersync/lib-services-framework';
|
|
2
|
-
import { Counter,
|
|
2
|
+
import { Counter, MetricMetadata, MetricsFactory, ObservableGauge, UpDownCounter } from './metrics-interfaces.js';
|
|
3
3
|
|
|
4
4
|
export interface MetricsEngineOptions {
|
|
5
5
|
factory: MetricsFactory;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
export interface RollingBucketMaxOptions {
|
|
2
|
+
bucketSizeMs?: number;
|
|
3
|
+
windowSizeMs?: number;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
interface Bucket {
|
|
7
|
+
// Absolute bucket id derived from floor(timestamp / bucketSizeMs).
|
|
8
|
+
id: number;
|
|
9
|
+
// Maximum reported value seen within this bucket.
|
|
10
|
+
max: number | undefined;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Tracks a rolling max over a fixed number of time buckets.
|
|
15
|
+
*
|
|
16
|
+
* The window is bucket-aligned: with the default 30s window and 5s buckets,
|
|
17
|
+
* the rolling max covers the current 5s bucket plus the previous 5 buckets.
|
|
18
|
+
*/
|
|
19
|
+
export class RollingBucketMax {
|
|
20
|
+
private readonly bucketSizeMs: number;
|
|
21
|
+
private readonly bucketCount: number;
|
|
22
|
+
// Fixed-size ring buffer keyed by bucket id modulo bucketCount.
|
|
23
|
+
private readonly buckets: Bucket[];
|
|
24
|
+
|
|
25
|
+
constructor(options: RollingBucketMaxOptions = {}) {
|
|
26
|
+
this.bucketSizeMs = options.bucketSizeMs ?? 5_000;
|
|
27
|
+
const windowSizeMs = options.windowSizeMs ?? 30_000;
|
|
28
|
+
|
|
29
|
+
if (!Number.isInteger(this.bucketSizeMs) || this.bucketSizeMs <= 0) {
|
|
30
|
+
throw new Error('bucketSizeMs must be a positive integer.');
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (!Number.isInteger(windowSizeMs) || windowSizeMs <= 0) {
|
|
34
|
+
throw new Error('windowSizeMs must be a positive integer.');
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (windowSizeMs % this.bucketSizeMs !== 0) {
|
|
38
|
+
throw new Error('windowSizeMs must be an exact multiple of bucketSizeMs.');
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
this.bucketCount = windowSizeMs / this.bucketSizeMs;
|
|
42
|
+
this.buckets = Array.from({ length: this.bucketCount }, () => ({
|
|
43
|
+
id: Number.NaN,
|
|
44
|
+
max: undefined
|
|
45
|
+
}));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Reports a new observed value into the bucket for the provided timestamp.
|
|
50
|
+
*/
|
|
51
|
+
report(value: number | undefined, timestampMs = Date.now()): void {
|
|
52
|
+
if (value == null) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
this.assertFiniteNumber(value, 'value');
|
|
56
|
+
this.assertFiniteNumber(timestampMs, 'timestampMs');
|
|
57
|
+
|
|
58
|
+
const bucket = this.getBucket(this.getBucketId(timestampMs));
|
|
59
|
+
bucket.max = bucket.max === undefined ? value : Math.max(bucket.max, value);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Returns the maximum value across the current bucket and prior buckets still
|
|
64
|
+
* inside the rolling window, or undefined when the window has no samples.
|
|
65
|
+
*/
|
|
66
|
+
getRollingMax(timestampMs = Date.now()): number | undefined {
|
|
67
|
+
this.assertFiniteNumber(timestampMs, 'timestampMs');
|
|
68
|
+
|
|
69
|
+
const currentBucketId = this.getBucketId(timestampMs);
|
|
70
|
+
const minimumBucketId = currentBucketId - this.bucketCount + 1;
|
|
71
|
+
|
|
72
|
+
let rollingMax: number | undefined;
|
|
73
|
+
for (const bucket of this.buckets) {
|
|
74
|
+
if (bucket.max === undefined) {
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (bucket.id < minimumBucketId || bucket.id > currentBucketId) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
rollingMax = rollingMax === undefined ? bucket.max : Math.max(rollingMax, bucket.max);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return rollingMax;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
private getBucketId(timestampMs: number): number {
|
|
89
|
+
return Math.floor(timestampMs / this.bucketSizeMs);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
private getBucket(bucketId: number): Bucket {
|
|
93
|
+
const index = ((bucketId % this.bucketCount) + this.bucketCount) % this.bucketCount;
|
|
94
|
+
const bucket = this.buckets[index];
|
|
95
|
+
|
|
96
|
+
if (bucket.id !== bucketId) {
|
|
97
|
+
bucket.id = bucketId;
|
|
98
|
+
bucket.max = undefined;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return bucket;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
private assertFiniteNumber(value: number, name: string): void {
|
|
105
|
+
if (!Number.isFinite(value)) {
|
|
106
|
+
throw new Error(`${name} must be a finite number.`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
export * from './MetricsEngine.js';
|
|
2
1
|
export * from './metrics-interfaces.js';
|
|
3
|
-
export * from './
|
|
2
|
+
export * from './MetricsEngine.js';
|
|
4
3
|
export * from './open-telemetry/OpenTelemetryMetricsFactory.js';
|
|
5
4
|
export * from './open-telemetry/util.js';
|
|
5
|
+
export * from './register-metrics.js';
|
|
6
|
+
export * from './RollingBucketMax.js';
|
|
@@ -6,8 +6,8 @@ import { ServiceContext } from '../../system/ServiceContext.js';
|
|
|
6
6
|
import { MetricsFactory } from '../metrics-interfaces.js';
|
|
7
7
|
import { OpenTelemetryMetricsFactory } from './OpenTelemetryMetricsFactory.js';
|
|
8
8
|
|
|
9
|
-
import pkg from '../../../package.json' with { type: 'json' };
|
|
10
9
|
import { resourceFromAttributes } from '@opentelemetry/resources';
|
|
10
|
+
import pkg from '../../../package.json' with { type: 'json' };
|
|
11
11
|
|
|
12
12
|
export function createOpenTelemetryMetricsFactory(context: ServiceContext): MetricsFactory {
|
|
13
13
|
const { configuration, lifeCycleEngine, storageEngine } = context;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { ServiceContextContainer } from '../system/ServiceContext.js';
|
|
2
|
-
import { createOpenTelemetryMetricsFactory } from './open-telemetry/util.js';
|
|
3
|
-
import { MetricsEngine } from './MetricsEngine.js';
|
|
4
1
|
import { createCoreAPIMetrics, initializeCoreAPIMetrics } from '../api/api-metrics.js';
|
|
5
2
|
import { createCoreReplicationMetrics, initializeCoreReplicationMetrics } from '../replication/replication-metrics.js';
|
|
6
3
|
import { createCoreStorageMetrics, initializeCoreStorageMetrics } from '../storage/storage-metrics.js';
|
|
4
|
+
import { ServiceContextContainer } from '../system/ServiceContext.js';
|
|
5
|
+
import { MetricsEngine } from './MetricsEngine.js';
|
|
6
|
+
import { createOpenTelemetryMetricsFactory } from './open-telemetry/util.js';
|
|
7
7
|
|
|
8
8
|
export enum MetricModes {
|
|
9
9
|
API = 'api',
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { ServiceContextContainer } from '../system/ServiceContext.js';
|
|
2
1
|
import { logger } from '@powersync/lib-services-framework';
|
|
3
2
|
import winston from 'winston';
|
|
4
3
|
import { PersistedSyncRulesContent } from '../storage/storage-index.js';
|
|
4
|
+
import { ServiceContextContainer } from '../system/ServiceContext.js';
|
|
5
5
|
|
|
6
6
|
export interface TearDownOptions {
|
|
7
7
|
/**
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { container, logger } from '@powersync/lib-services-framework';
|
|
2
2
|
import winston from 'winston';
|
|
3
|
+
import { MetricsEngine } from '../metrics/MetricsEngine.js';
|
|
3
4
|
import * as storage from '../storage/storage-index.js';
|
|
4
5
|
import { ErrorRateLimiter } from './ErrorRateLimiter.js';
|
|
5
|
-
import { MetricsEngine } from '../metrics/MetricsEngine.js';
|
|
6
6
|
|
|
7
7
|
export interface AbstractReplicationJobOptions {
|
|
8
8
|
id: string;
|
|
@@ -82,5 +82,5 @@ export abstract class AbstractReplicationJob {
|
|
|
82
82
|
/**
|
|
83
83
|
* Get replication lag for this job in ms.
|
|
84
84
|
*/
|
|
85
|
-
abstract getReplicationLagMillis():
|
|
85
|
+
abstract getReplicationLagMillis(): number | undefined;
|
|
86
86
|
}
|