@powersync/service-core 0.0.0-dev-20250618131818 → 0.0.0-dev-20250714115156
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 +36 -4
- package/dist/auth/CachedKeyCollector.js +26 -2
- package/dist/auth/CachedKeyCollector.js.map +1 -1
- package/dist/auth/KeySpec.d.ts +1 -0
- package/dist/auth/KeySpec.js +12 -0
- package/dist/auth/KeySpec.js.map +1 -1
- package/dist/auth/KeyStore.js +2 -2
- package/dist/auth/KeyStore.js.map +1 -1
- package/dist/auth/RemoteJWKSCollector.js +6 -2
- package/dist/auth/RemoteJWKSCollector.js.map +1 -1
- package/dist/emitters/AbstractEmitterEngine.d.ts +13 -0
- package/dist/emitters/AbstractEmitterEngine.js +57 -0
- package/dist/emitters/AbstractEmitterEngine.js.map +1 -0
- package/dist/emitters/EmitterEngine.d.ts +12 -0
- package/dist/emitters/EmitterEngine.js +35 -0
- package/dist/emitters/EmitterEngine.js.map +1 -0
- package/dist/emitters/emitter-interfaces.d.ts +37 -0
- package/dist/emitters/emitter-interfaces.js +10 -0
- package/dist/emitters/emitter-interfaces.js.map +1 -0
- package/dist/emitters/event-error.d.ts +5 -0
- package/dist/emitters/event-error.js +8 -0
- package/dist/emitters/event-error.js.map +1 -0
- package/dist/emitters/events/connect-event.d.ts +10 -0
- package/dist/emitters/events/connect-event.js +32 -0
- package/dist/emitters/events/connect-event.js.map +1 -0
- package/dist/emitters/events/disconnect-event.d.ts +10 -0
- package/dist/emitters/events/disconnect-event.js +27 -0
- package/dist/emitters/events/disconnect-event.js.map +1 -0
- package/dist/emitters/events/index.d.ts +1 -0
- package/dist/emitters/events/index.js +4 -0
- package/dist/emitters/events/index.js.map +1 -0
- package/dist/replication/AbstractReplicator.d.ts +8 -2
- package/dist/replication/AbstractReplicator.js +25 -9
- package/dist/replication/AbstractReplicator.js.map +1 -1
- package/dist/routes/auth.d.ts +1 -21
- package/dist/routes/auth.js +1 -97
- package/dist/routes/auth.js.map +1 -1
- package/dist/routes/configure-rsocket.js +4 -2
- package/dist/routes/configure-rsocket.js.map +1 -1
- package/dist/routes/endpoints/sync-stream.js +23 -1
- package/dist/routes/endpoints/sync-stream.js.map +1 -1
- package/dist/routes/router.d.ts +1 -2
- package/dist/routes/router.js.map +1 -1
- package/dist/system/ServiceContext.d.ts +3 -0
- package/dist/system/ServiceContext.js +8 -1
- package/dist/system/ServiceContext.js.map +1 -1
- package/dist/util/config/compound-config-collector.js +0 -13
- package/dist/util/config/compound-config-collector.js.map +1 -1
- package/dist/util/config/types.d.ts +0 -12
- package/dist/util/util-index.d.ts +1 -0
- package/dist/util/util-index.js +1 -0
- package/dist/util/util-index.js.map +1 -1
- package/dist/util/version.d.ts +1 -0
- package/dist/util/version.js +3 -0
- package/dist/util/version.js.map +1 -0
- package/package.json +4 -4
- package/src/auth/CachedKeyCollector.ts +25 -3
- package/src/auth/KeySpec.ts +14 -0
- package/src/auth/KeyStore.ts +2 -2
- package/src/auth/RemoteJWKSCollector.ts +6 -2
- package/src/emitters/AbstractEmitterEngine.ts +64 -0
- package/src/emitters/EmitterEngine.ts +41 -0
- package/src/emitters/emitter-interfaces.ts +47 -0
- package/src/emitters/event-error.ts +10 -0
- package/src/emitters/events/connect-event.ts +34 -0
- package/src/emitters/events/disconnect-event.ts +36 -0
- package/src/emitters/events/index.ts +4 -0
- package/src/replication/AbstractReplicator.ts +30 -10
- package/src/routes/auth.ts +1 -124
- package/src/routes/configure-rsocket.ts +3 -2
- package/src/routes/endpoints/sync-stream.ts +25 -2
- package/src/routes/router.ts +0 -1
- package/src/system/ServiceContext.ts +11 -1
- package/src/util/config/compound-config-collector.ts +0 -16
- package/src/util/config/types.ts +0 -11
- package/src/util/util-index.ts +1 -0
- package/src/util/version.ts +3 -0
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,38 @@
|
|
|
1
1
|
# @powersync/service-core
|
|
2
2
|
|
|
3
|
-
## 0.0.0-dev-
|
|
3
|
+
## 0.0.0-dev-20250714115156
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 71cf892: Add 'powersync' or 'powersync-storage' as the app name for database connections.
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- ba1ceef: Remove unused dev config.
|
|
12
|
+
- f1431b6: Improve diagnostics in logs for JWKS timeouts.
|
|
13
|
+
- Updated dependencies [ba1ceef]
|
|
14
|
+
- @powersync/service-types@0.0.0-dev-20250714115156
|
|
15
|
+
|
|
16
|
+
## 1.13.3
|
|
17
|
+
|
|
18
|
+
### Patch Changes
|
|
19
|
+
|
|
20
|
+
- 3e7d629: Fix MongoDB initial replication with mixed \_id types.
|
|
21
|
+
- e8cb8db: Fix websocket auth errors not correctly propagating the details, previously resulting in generic "[PSYNC_S2106] Authentication required" messages.
|
|
22
|
+
|
|
23
|
+
## 1.13.2
|
|
24
|
+
|
|
25
|
+
### Patch Changes
|
|
26
|
+
|
|
27
|
+
- c002948: Fix sync rule clearing process to not block sync rule processing.
|
|
28
|
+
|
|
29
|
+
## 1.13.1
|
|
30
|
+
|
|
31
|
+
### Patch Changes
|
|
32
|
+
|
|
33
|
+
- 1b326fb: [MongoDB Storage] Fix checksum calculations in buckets with more than 4 million operations
|
|
34
|
+
|
|
35
|
+
## 1.13.0
|
|
4
36
|
|
|
5
37
|
### Minor Changes
|
|
6
38
|
|
|
@@ -16,9 +48,9 @@
|
|
|
16
48
|
- Updated dependencies [0ccd470]
|
|
17
49
|
- Updated dependencies [951b010]
|
|
18
50
|
- Updated dependencies [f9e8673]
|
|
19
|
-
- @powersync/service-types@0.
|
|
20
|
-
- @powersync/lib-services-framework@0.
|
|
21
|
-
- @powersync/service-rsocket-router@0.
|
|
51
|
+
- @powersync/service-types@0.12.0
|
|
52
|
+
- @powersync/lib-services-framework@0.7.0
|
|
53
|
+
- @powersync/service-rsocket-router@0.1.1
|
|
22
54
|
|
|
23
55
|
## 1.12.1
|
|
24
56
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import timers from 'timers/promises';
|
|
2
2
|
import { LeakyBucket } from './LeakyBucket.js';
|
|
3
|
+
import { AuthorizationError, ErrorCode, logger } from '@powersync/lib-services-framework';
|
|
3
4
|
import { mapAuthConfigError } from './utils.js';
|
|
4
5
|
/**
|
|
5
6
|
* Manages caching and refreshing for a key collector.
|
|
@@ -58,8 +59,23 @@ export class CachedKeyCollector {
|
|
|
58
59
|
// e.g. in the case of waiting for error retries.
|
|
59
60
|
// In the case of very slow requests, we don't wait for it to complete, but the
|
|
60
61
|
// request can still complete in the background.
|
|
61
|
-
const
|
|
62
|
-
|
|
62
|
+
const WAIT_TIMEOUT_SECONDS = 3;
|
|
63
|
+
const timeout = timers.setTimeout(WAIT_TIMEOUT_SECONDS * 1000).then(() => {
|
|
64
|
+
throw new AuthorizationError(ErrorCode.PSYNC_S2204, `JWKS request failed`, {
|
|
65
|
+
cause: { message: `Key request timed out in ${WAIT_TIMEOUT_SECONDS}s`, name: 'AbortError' }
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
try {
|
|
69
|
+
await Promise.race([this.refreshPromise, timeout]);
|
|
70
|
+
}
|
|
71
|
+
catch (e) {
|
|
72
|
+
if (e instanceof AuthorizationError) {
|
|
73
|
+
return { keys: this.currentKeys, errors: [...this.currentErrors, e] };
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
throw e;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
63
79
|
}
|
|
64
80
|
return { keys: this.currentKeys, errors: this.currentErrors };
|
|
65
81
|
}
|
|
@@ -86,8 +102,16 @@ export class CachedKeyCollector {
|
|
|
86
102
|
this.currentErrors = errors;
|
|
87
103
|
this.keyTimestamp = Date.now();
|
|
88
104
|
this.error = false;
|
|
105
|
+
// Due to caching and background refresh behavior, errors are not always propagated to the request handler,
|
|
106
|
+
// so we log them here.
|
|
107
|
+
for (let error of errors) {
|
|
108
|
+
logger.error(`Soft key refresh error`, error);
|
|
109
|
+
}
|
|
89
110
|
}
|
|
90
111
|
catch (e) {
|
|
112
|
+
// Due to caching and background refresh behavior, errors are not always propagated to the request handler,
|
|
113
|
+
// so we log them here.
|
|
114
|
+
logger.error(`Hard key refresh error`, e);
|
|
91
115
|
this.error = true;
|
|
92
116
|
// No result - keep previous keys
|
|
93
117
|
this.currentErrors = [mapAuthConfigError(e)];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CachedKeyCollector.js","sourceRoot":"","sources":["../../src/auth/CachedKeyCollector.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,iBAAiB,CAAC;AAErC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"CachedKeyCollector.js","sourceRoot":"","sources":["../../src/auth/CachedKeyCollector.ts"],"names":[],"mappings":"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"}
|
package/dist/auth/KeySpec.d.ts
CHANGED
|
@@ -23,6 +23,7 @@ export declare class KeySpec {
|
|
|
23
23
|
static importKey(key: jose.JWK, options?: KeyOptions): Promise<KeySpec>;
|
|
24
24
|
constructor(source: jose.JWK, key: jose.KeyLike, options?: KeyOptions);
|
|
25
25
|
get kid(): string | undefined;
|
|
26
|
+
get description(): string;
|
|
26
27
|
matchesAlgorithm(jwtAlg: string): boolean;
|
|
27
28
|
isValidSignature(token: string): Promise<boolean>;
|
|
28
29
|
}
|
package/dist/auth/KeySpec.js
CHANGED
|
@@ -20,6 +20,18 @@ export class KeySpec {
|
|
|
20
20
|
get kid() {
|
|
21
21
|
return this.source.kid;
|
|
22
22
|
}
|
|
23
|
+
get description() {
|
|
24
|
+
let details = [];
|
|
25
|
+
details.push(`kid: ${this.kid ?? '*'}`);
|
|
26
|
+
details.push(`kty: ${this.source.kty}`);
|
|
27
|
+
if (this.source.alg != null) {
|
|
28
|
+
details.push(`alg: ${this.source.alg}`);
|
|
29
|
+
}
|
|
30
|
+
if (this.options.requiresAudience != null) {
|
|
31
|
+
details.push(`aud: ${this.options.requiresAudience.join(', ')}`);
|
|
32
|
+
}
|
|
33
|
+
return `<${details.filter((x) => x != null).join(', ')}>`;
|
|
34
|
+
}
|
|
23
35
|
matchesAlgorithm(jwtAlg) {
|
|
24
36
|
if (this.source.alg) {
|
|
25
37
|
return jwtAlg === this.source.alg;
|
package/dist/auth/KeySpec.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KeySpec.js","sourceRoot":"","sources":["../../src/auth/KeySpec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACzD,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC1D,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACzD,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAO,CAAC,CAAC;AACxC,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,GAAG,aAAa,EAAE,GAAG,cAAc,EAAE,GAAG,aAAa,EAAE,GAAG,cAAc,CAAC,CAAC;AAgB/G,MAAM,OAAO,OAAO;IAClB,GAAG,CAAe;IAClB,MAAM,CAAW;IACjB,OAAO,CAAa;IAEpB,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,GAAa,EAAE,OAAoB;QACxD,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAiB,CAAC;QAC3D,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,YAAY,MAAgB,EAAE,GAAiB,EAAE,OAAoB;QACnE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;IACzB,CAAC;IAED,gBAAgB,CAAC,MAAc;QAC7B,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YACpB,OAAO,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;QACpC,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC;YACrC,OAAO,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC;YACrC,OAAO,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC;YACrC,OAAO,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;YACpC,OAAO,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,KAAa;QAClC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,CAAC,IAAI,KAAK,uCAAuC,EAAE,CAAC;gBACvD,OAAO,KAAK,CAAC;YACf,CAAC;iBAAM,CAAC;gBACN,iCAAiC;gBACjC,MAAM,CAAC,CAAC;YACV,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"KeySpec.js","sourceRoot":"","sources":["../../src/auth/KeySpec.ts"],"names":[],"mappings":"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"}
|
package/dist/auth/KeyStore.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { AuthorizationError, ErrorCode, logger } from '@powersync/lib-services-framework';
|
|
2
2
|
import * as jose from 'jose';
|
|
3
3
|
import secs from '../util/secs.js';
|
|
4
4
|
import { SUPPORTED_ALGORITHMS } from './KeySpec.js';
|
|
@@ -138,7 +138,7 @@ export class KeyStore {
|
|
|
138
138
|
logger.error(`Failed to refresh keys`, e);
|
|
139
139
|
});
|
|
140
140
|
throw new AuthorizationError(ErrorCode.PSYNC_S2101, 'Could not find an appropriate key in the keystore. The key is missing or no key matched the token KID', {
|
|
141
|
-
configurationDetails: `Known
|
|
141
|
+
configurationDetails: `Known keys: ${keys.map((key) => key.description).join(', ')}`
|
|
142
142
|
// tokenDetails automatically populated later
|
|
143
143
|
});
|
|
144
144
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KeyStore.js","sourceRoot":"","sources":["../../src/auth/KeyStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"KeyStore.js","sourceRoot":"","sources":["../../src/auth/KeyStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,9 +27,10 @@ export class RemoteJWKSCollector {
|
|
|
27
27
|
}
|
|
28
28
|
async getJwksData() {
|
|
29
29
|
const abortController = new AbortController();
|
|
30
|
+
const REQUEST_TIMEOUT_SECONDS = 30;
|
|
30
31
|
const timeout = setTimeout(() => {
|
|
31
32
|
abortController.abort();
|
|
32
|
-
},
|
|
33
|
+
}, REQUEST_TIMEOUT_SECONDS * 1000);
|
|
33
34
|
try {
|
|
34
35
|
const res = await fetch(this.url, {
|
|
35
36
|
method: 'GET',
|
|
@@ -47,11 +48,14 @@ export class RemoteJWKSCollector {
|
|
|
47
48
|
return (await res.json());
|
|
48
49
|
}
|
|
49
50
|
catch (e) {
|
|
51
|
+
if (e instanceof Error && e.name === 'AbortError') {
|
|
52
|
+
e = { message: `Request timed out in ${REQUEST_TIMEOUT_SECONDS}s`, name: 'AbortError' };
|
|
53
|
+
}
|
|
50
54
|
throw new AuthorizationError(ErrorCode.PSYNC_S2204, `JWKS request failed`, {
|
|
51
55
|
configurationDetails: `JWKS URL: ${this.url}`,
|
|
52
56
|
// This covers most cases of FetchError
|
|
53
57
|
// `cause: e` could lose the error message
|
|
54
|
-
cause: { message: e.message, code: e.code }
|
|
58
|
+
cause: { message: e.message, code: e.code, name: e.name }
|
|
55
59
|
});
|
|
56
60
|
}
|
|
57
61
|
finally {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RemoteJWKSCollector.js","sourceRoot":"","sources":["../../src/auth/RemoteJWKSCollector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,MAAM,YAAY,CAAC;AAE/B,OAAO,EACL,kBAAkB,EAClB,SAAS,EAET,0BAA0B,EAC1B,qBAAqB,EACrB,YAAY,EACb,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAMvC;;GAEG;AACH,MAAM,OAAO,mBAAmB;IAMlB;IALJ,GAAG,CAAM;IACT,KAAK,CAAa;IAE1B,YACE,GAAW,EACD,OAAoC;QAApC,YAAO,GAAP,OAAO,CAA6B;QAE9C,IAAI,CAAC;YACH,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,MAAM,IAAI,YAAY,CAAC,SAAS,CAAC,WAAW,EAAE,qBAAqB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAClH,CAAC;QAED,sDAAsD;QACtD,kEAAkE;QAClE,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,EAAE,CAAC;YAClE,MAAM,IAAI,YAAY,CACpB,SAAS,CAAC,WAAW,EACrB,gDAAgD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CACtE,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;IACnC,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAC9C,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,eAAe,CAAC,KAAK,EAAE,CAAC;QAC1B,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"RemoteJWKSCollector.js","sourceRoot":"","sources":["../../src/auth/RemoteJWKSCollector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { EmitterEvent, EmitterEventData, EventNames } from './emitter-interfaces.js';
|
|
2
|
+
import * as storage from '../storage/storage-index.js';
|
|
3
|
+
export declare abstract class AbstractEmitterEngine {
|
|
4
|
+
private emitter;
|
|
5
|
+
storageEngine: storage.StorageEngine;
|
|
6
|
+
eventsMap: Map<EventNames, EmitterEvent>;
|
|
7
|
+
protected constructor(storage: storage.StorageEngine);
|
|
8
|
+
get events(): EventNames[];
|
|
9
|
+
protected bindEvents(events: EmitterEvent[]): void;
|
|
10
|
+
protected emit(eventName: EventNames, data: EmitterEventData): void;
|
|
11
|
+
protected removeListeners(eventName?: EventNames): void;
|
|
12
|
+
protected stop(): void;
|
|
13
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { isEventError } from './emitter-interfaces.js';
|
|
2
|
+
import EventEmitter from 'node:events';
|
|
3
|
+
import { logger } from '@powersync/lib-services-framework';
|
|
4
|
+
export class AbstractEmitterEngine {
|
|
5
|
+
emitter;
|
|
6
|
+
storageEngine;
|
|
7
|
+
eventsMap = new Map();
|
|
8
|
+
constructor(storage) {
|
|
9
|
+
this.emitter = new EventEmitter({ captureRejections: true });
|
|
10
|
+
this.storageEngine = storage;
|
|
11
|
+
this.emitter.on('error', (error) => {
|
|
12
|
+
if (isEventError(error) && this.eventsMap.has(error.eventName)) {
|
|
13
|
+
const event = this.eventsMap.get(error.eventName);
|
|
14
|
+
const errorHandler = event.errorhandler ??
|
|
15
|
+
((error) => {
|
|
16
|
+
logger.error(error.message);
|
|
17
|
+
});
|
|
18
|
+
errorHandler(error);
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
get events() {
|
|
23
|
+
return this.emitter.eventNames();
|
|
24
|
+
}
|
|
25
|
+
bindEvents(events) {
|
|
26
|
+
const eventNames = this.emitter.eventNames();
|
|
27
|
+
for (const event of events) {
|
|
28
|
+
if (!eventNames.includes(event.name)) {
|
|
29
|
+
this.eventsMap.set(event.name, event);
|
|
30
|
+
this.emitter.on(event.name, event.handler(this.storageEngine).bind(event));
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
logger.warn(`Event ${event.name} is already registered. Skipping.`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
emit(eventName, data) {
|
|
38
|
+
if (!this.emitter.eventNames().includes(eventName)) {
|
|
39
|
+
throw new Error(`Event ${eventName} is not registered.`);
|
|
40
|
+
}
|
|
41
|
+
this.emitter.emit(eventName, data);
|
|
42
|
+
}
|
|
43
|
+
removeListeners(eventName) {
|
|
44
|
+
if (eventName) {
|
|
45
|
+
this.emitter.removeAllListeners(eventName);
|
|
46
|
+
logger.info(`Removed all listeners for event: ${eventName}`);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
this.stop();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
stop() {
|
|
53
|
+
this.emitter.removeAllListeners();
|
|
54
|
+
logger.info('Emitter engine shut down and all listeners removed.');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=AbstractEmitterEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AbstractEmitterEngine.js","sourceRoot":"","sources":["../../src/emitters/AbstractEmitterEngine.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8C,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEnG,OAAO,YAAY,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAG3D,MAAM,OAAgB,qBAAqB;IACjC,OAAO,CAAe;IAC9B,aAAa,CAAwB;IACrC,SAAS,GAAkC,IAAI,GAAG,EAAE,CAAC;IAErD,YAAsB,OAA8B;QAClD,IAAI,CAAC,OAAO,GAAG,IAAI,YAAY,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAyB,EAAE,EAAE;YACrD,IAAI,YAAY,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAE,CAAC;gBACnD,MAAM,YAAY,GAChB,KAAK,CAAC,YAAY;oBAClB,CAAC,CAAC,KAAK,EAAE,EAAE;wBACT,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAC9B,CAAC,CAAC,CAAC;gBACL,YAAY,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAkB,CAAC;IACnD,CAAC;IAES,UAAU,CAAC,MAAsB;QACzC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC7C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBACtC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAC7E,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,IAAI,mCAAmC,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;IACH,CAAC;IAES,IAAI,CAAC,SAAqB,EAAE,IAAsB;QAC1D,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,SAAS,SAAS,qBAAqB,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;IAES,eAAe,CAAC,SAAsB;QAC9C,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;YAC3C,MAAM,CAAC,IAAI,CAAC,oCAAoC,SAAS,EAAE,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAES,IAAI;QACZ,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IACrE,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { BaseEmitterEngine, EmitterEvent, EmitterEventData, EventNames } from './emitter-interfaces.js';
|
|
2
|
+
import * as storage from '../storage/storage-index.js';
|
|
3
|
+
import { AbstractEmitterEngine } from './AbstractEmitterEngine.js';
|
|
4
|
+
export declare class EmitterEngine extends AbstractEmitterEngine implements BaseEmitterEngine {
|
|
5
|
+
private active;
|
|
6
|
+
constructor(events: EmitterEvent[], storageRef: storage.StorageEngine);
|
|
7
|
+
event(eventName: EventNames): EmitterEvent;
|
|
8
|
+
removeListeners(eventName?: EventNames): void;
|
|
9
|
+
eventNames(): EventNames[];
|
|
10
|
+
emitEvent(eventName: EventNames, data: EmitterEventData): void;
|
|
11
|
+
shutDown(): Promise<void>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { AbstractEmitterEngine } from './AbstractEmitterEngine.js';
|
|
2
|
+
import { logger } from '@powersync/lib-services-framework';
|
|
3
|
+
export class EmitterEngine extends AbstractEmitterEngine {
|
|
4
|
+
active;
|
|
5
|
+
constructor(events, storageRef) {
|
|
6
|
+
super(storageRef);
|
|
7
|
+
this.active = process.env.MICRO_SERVICE_NAME === 'powersync';
|
|
8
|
+
logger.info(`EmitterEngine initialized with active status: ${this.active}`);
|
|
9
|
+
this.bindEvents(events);
|
|
10
|
+
}
|
|
11
|
+
event(eventName) {
|
|
12
|
+
const event = this.eventsMap.get(eventName);
|
|
13
|
+
if (!event) {
|
|
14
|
+
throw new Error(`Event ${eventName} is not registered.`);
|
|
15
|
+
}
|
|
16
|
+
return event;
|
|
17
|
+
}
|
|
18
|
+
removeListeners(eventName) {
|
|
19
|
+
if (eventName) {
|
|
20
|
+
this.removeListeners(eventName);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
eventNames() {
|
|
24
|
+
return this.events;
|
|
25
|
+
}
|
|
26
|
+
emitEvent(eventName, data) {
|
|
27
|
+
if (this.active) {
|
|
28
|
+
return this.emit(eventName, data);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async shutDown() {
|
|
32
|
+
this.stop();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=EmitterEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmitterEngine.js","sourceRoot":"","sources":["../../src/emitters/EmitterEngine.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAE3D,MAAM,OAAO,aAAc,SAAQ,qBAAqB;IAC9C,MAAM,CAAU;IACxB,YAAY,MAAsB,EAAE,UAAiC;QACnE,KAAK,CAAC,UAAU,CAAC,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,WAAW,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC,iDAAiD,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5E,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,SAAqB;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,SAAS,SAAS,qBAAqB,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,eAAe,CAAC,SAAsB;QACpC,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IACD,UAAU;QACR,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,SAAS,CAAC,SAAqB,EAAE,IAAsB;QACrD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { JwtPayload } from '../auth/JwtPayload.js';
|
|
2
|
+
import * as storage from '../storage/storage-index.js';
|
|
3
|
+
import { EventError } from './event-error.js';
|
|
4
|
+
export declare enum EventNames {
|
|
5
|
+
SDK_CONNECT_EVENT = "sdk-connect-event",
|
|
6
|
+
SDK_DISCONNECT_EVENT = "sdk-disconnect-event"
|
|
7
|
+
}
|
|
8
|
+
export type SdkEvent = {
|
|
9
|
+
client_id?: string;
|
|
10
|
+
user_id: string;
|
|
11
|
+
user_agent: string;
|
|
12
|
+
jwt_token?: JwtPayload;
|
|
13
|
+
};
|
|
14
|
+
export type EventConnectData = {
|
|
15
|
+
type: EventNames.SDK_CONNECT_EVENT;
|
|
16
|
+
connect_at: number;
|
|
17
|
+
} & SdkEvent;
|
|
18
|
+
export type EventDisconnectData = {
|
|
19
|
+
type: EventNames.SDK_DISCONNECT_EVENT;
|
|
20
|
+
disconnect_at: number;
|
|
21
|
+
} & SdkEvent;
|
|
22
|
+
export type EmitterEventData = EventConnectData | EventDisconnectData;
|
|
23
|
+
export type EventHandler = (data: EmitterEventData) => Promise<void>;
|
|
24
|
+
export type StorageHandler = (storageEngine: storage.StorageEngine) => EventHandler;
|
|
25
|
+
export interface EmitterEvent {
|
|
26
|
+
name: EventNames;
|
|
27
|
+
handler: StorageHandler;
|
|
28
|
+
errorhandler?: (error: Error | EventError) => void;
|
|
29
|
+
}
|
|
30
|
+
export interface BaseEmitterEngine {
|
|
31
|
+
eventNames(): EventNames[];
|
|
32
|
+
emitEvent(eventName: EventNames, data: EmitterEventData): void;
|
|
33
|
+
removeListeners(eventName?: EventNames): void;
|
|
34
|
+
event(eventName: EventNames): EmitterEvent;
|
|
35
|
+
shutDown(): Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
export declare function isEventError(error: Error | EventError): error is EventError;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export var EventNames;
|
|
2
|
+
(function (EventNames) {
|
|
3
|
+
// SdK events
|
|
4
|
+
EventNames["SDK_CONNECT_EVENT"] = "sdk-connect-event";
|
|
5
|
+
EventNames["SDK_DISCONNECT_EVENT"] = "sdk-disconnect-event";
|
|
6
|
+
})(EventNames || (EventNames = {}));
|
|
7
|
+
export function isEventError(error) {
|
|
8
|
+
return error.eventName !== undefined;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=emitter-interfaces.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter-interfaces.js","sourceRoot":"","sources":["../../src/emitters/emitter-interfaces.ts"],"names":[],"mappings":"AAIA,MAAM,CAAN,IAAY,UAIX;AAJD,WAAY,UAAU;IACpB,aAAa;IACb,qDAAuC,CAAA;IACvC,2DAA6C,CAAA;AAC/C,CAAC,EAJW,UAAU,KAAV,UAAU,QAIrB;AAoCD,MAAM,UAAU,YAAY,CAAC,KAAyB;IACpD,OAAQ,KAAoB,CAAC,SAAS,KAAK,SAAS,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-error.js","sourceRoot":"","sources":["../../src/emitters/event-error.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,UAAW,SAAQ,KAAK;IAE1B;IADT,YACS,SAAqB,EAC5B,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,cAAS,GAAT,SAAS,CAAY;IAI9B,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { EmitterEvent, EventHandler, EventNames } from '../emitter-interfaces.js';
|
|
2
|
+
import * as storage from '../../storage/storage-index.js';
|
|
3
|
+
import { EventError } from '../event-error.js';
|
|
4
|
+
export declare class ConnectEvent implements EmitterEvent {
|
|
5
|
+
private type;
|
|
6
|
+
get name(): EventNames;
|
|
7
|
+
errorhandler(error: Error | EventError): void;
|
|
8
|
+
handler(storageEngine: storage.StorageEngine): EventHandler;
|
|
9
|
+
}
|
|
10
|
+
export declare const connectEvent: ConnectEvent;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { EventNames } from '../emitter-interfaces.js';
|
|
2
|
+
import { EventError } from '../event-error.js';
|
|
3
|
+
import { logger } from '@powersync/lib-services-framework';
|
|
4
|
+
export class ConnectEvent {
|
|
5
|
+
type = EventNames.SDK_CONNECT_EVENT;
|
|
6
|
+
get name() {
|
|
7
|
+
return this.type;
|
|
8
|
+
}
|
|
9
|
+
errorhandler(error) {
|
|
10
|
+
if (error instanceof EventError) {
|
|
11
|
+
logger.error(`EventError in ${error.eventName}:`, error.message);
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
logger.error(error.message);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
handler(storageEngine) {
|
|
18
|
+
// TODO: USE STORAGE ENGINE
|
|
19
|
+
const storage = storageEngine.activeStorage.storage;
|
|
20
|
+
return async (data) => {
|
|
21
|
+
try {
|
|
22
|
+
const disconnectData = data;
|
|
23
|
+
console.log(`Connect event triggered for user: ${disconnectData.user_id} at ${new Date(disconnectData.connect_at).toISOString()}`);
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
throw new EventError(this.type, error.message);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export const connectEvent = new ConnectEvent();
|
|
32
|
+
//# sourceMappingURL=connect-event.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect-event.js","sourceRoot":"","sources":["../../../src/emitters/events/connect-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAE3D,MAAM,OAAO,YAAY;IACf,IAAI,GAAG,UAAU,CAAC,iBAAiB,CAAC;IAC5C,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IACD,YAAY,CAAC,KAAyB;QACpC,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,iBAAiB,KAAK,CAAC,SAAS,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IACD,OAAO,CAAC,aAAoC;QAC1C,2BAA2B;QAC3B,MAAM,OAAO,GAAG,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC;QACpD,OAAO,KAAK,EAAE,IAAsB,EAAE,EAAE;YACtC,IAAI,CAAC;gBACH,MAAM,cAAc,GAAG,IAAwB,CAAC;gBAChD,OAAO,CAAC,GAAG,CACT,qCAAqC,cAAc,CAAC,OAAO,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,EAAE,CACtH,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACjD,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;CACF;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { EmitterEvent, EventHandler, EventNames } from '../emitter-interfaces.js';
|
|
2
|
+
import * as storage from '../../storage/storage-index.js';
|
|
3
|
+
import { EventError } from '../event-error.js';
|
|
4
|
+
export declare class DisconnectEvent implements EmitterEvent {
|
|
5
|
+
private type;
|
|
6
|
+
get name(): EventNames;
|
|
7
|
+
errorhandler(error: Error | EventError): void;
|
|
8
|
+
handler(storageEngine: storage.StorageEngine): EventHandler;
|
|
9
|
+
}
|
|
10
|
+
export declare const disconnectEvent: DisconnectEvent;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { EventNames } from '../emitter-interfaces.js';
|
|
2
|
+
import { EventError } from '../event-error.js';
|
|
3
|
+
import { logger } from '@powersync/lib-services-framework';
|
|
4
|
+
export class DisconnectEvent {
|
|
5
|
+
type = EventNames.SDK_DISCONNECT_EVENT;
|
|
6
|
+
get name() {
|
|
7
|
+
return this.type;
|
|
8
|
+
}
|
|
9
|
+
errorhandler(error) {
|
|
10
|
+
if (error instanceof EventError) {
|
|
11
|
+
logger.error(`EventError in ${error.eventName}:`, error.message);
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
logger.error(error.message);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
handler(storageEngine) {
|
|
18
|
+
// TODO: USE STORAGE ENGINE
|
|
19
|
+
const storage = storageEngine.activeStorage.storage;
|
|
20
|
+
return async (data) => {
|
|
21
|
+
const disconnectData = data;
|
|
22
|
+
console.log(`Disconnect event triggered for user: ${disconnectData.user_id} at ${new Date(disconnectData.disconnect_at).toISOString()}`);
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export const disconnectEvent = new DisconnectEvent();
|
|
27
|
+
//# sourceMappingURL=disconnect-event.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disconnect-event.js","sourceRoot":"","sources":["../../../src/emitters/events/disconnect-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,UAAU,EACX,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAE3D,MAAM,OAAO,eAAe;IAClB,IAAI,GAAG,UAAU,CAAC,oBAAoB,CAAC;IAC/C,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IACD,YAAY,CAAC,KAAyB;QACpC,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,iBAAiB,KAAK,CAAC,SAAS,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IACD,OAAO,CAAC,aAAoC;QAC1C,2BAA2B;QAC3B,MAAM,OAAO,GAAG,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC;QACpD,OAAO,KAAK,EAAE,IAAsB,EAAE,EAAE;YACtC,MAAM,cAAc,GAAG,IAA2B,CAAC;YACnD,OAAO,CAAC,GAAG,CACT,wCAAwC,cAAc,CAAC,OAAO,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,EAAE,CAC5H,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC;CACF;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const events: (import("./disconnect-event.js").DisconnectEvent | import("./connect-event.js").ConnectEvent)[];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/emitters/events/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import winston from 'winston';
|
|
2
|
+
import { MetricsEngine } from '../metrics/MetricsEngine.js';
|
|
2
3
|
import * as storage from '../storage/storage-index.js';
|
|
3
4
|
import { StorageEngine } from '../storage/storage-index.js';
|
|
4
5
|
import { SyncRulesProvider } from '../util/config/sync-rules/sync-rules-provider.js';
|
|
5
6
|
import { AbstractReplicationJob } from './AbstractReplicationJob.js';
|
|
6
7
|
import { ErrorRateLimiter } from './ErrorRateLimiter.js';
|
|
7
8
|
import { ConnectionTestResult } from './ReplicationModule.js';
|
|
8
|
-
import { MetricsEngine } from '../metrics/MetricsEngine.js';
|
|
9
9
|
export interface CreateJobOptions {
|
|
10
10
|
lock: storage.ReplicationLock;
|
|
11
11
|
storage: storage.SyncRulesBucketStorage;
|
|
@@ -31,9 +31,15 @@ export declare abstract class AbstractReplicator<T extends AbstractReplicationJo
|
|
|
31
31
|
/**
|
|
32
32
|
* Map of replication jobs by sync rule id. Usually there is only one running job, but there could be two when
|
|
33
33
|
* transitioning to a new set of sync rules.
|
|
34
|
-
* @private
|
|
35
34
|
*/
|
|
36
35
|
private replicationJobs;
|
|
36
|
+
/**
|
|
37
|
+
* Map of sync rule ids to promises that are clearing the sync rule configuration.
|
|
38
|
+
*
|
|
39
|
+
* We primarily do this to keep track of what we're currently clearing, but don't currently
|
|
40
|
+
* use the Promise value.
|
|
41
|
+
*/
|
|
42
|
+
private clearingJobs;
|
|
37
43
|
/**
|
|
38
44
|
* Used for replication lag computation.
|
|
39
45
|
*/
|