@mongrov/analytics 0.2.0 → 0.4.0
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.md +64 -5
- package/dist/core/errors.js +1 -1
- package/dist/core/errors.js.map +1 -1
- package/dist/core/factory.d.ts.map +1 -1
- package/dist/core/factory.js +38 -3
- package/dist/core/factory.js.map +1 -1
- package/dist/core/migrations.d.ts.map +1 -1
- package/dist/core/migrations.js +21 -1
- package/dist/core/migrations.js.map +1 -1
- package/dist/rules/__fakes__/fakeEngine.d.ts +3 -1
- package/dist/rules/__fakes__/fakeEngine.d.ts.map +1 -1
- package/dist/rules/__fakes__/fakeEngine.js +3 -1
- package/dist/rules/__fakes__/fakeEngine.js.map +1 -1
- package/dist/rules/defaults/loader.d.ts.map +1 -1
- package/dist/rules/defaults/loader.js +4 -2
- package/dist/rules/defaults/loader.js.map +1 -1
- package/dist/rules/emitter.d.ts +2 -0
- package/dist/rules/emitter.d.ts.map +1 -1
- package/dist/rules/emitter.js +3 -0
- package/dist/rules/emitter.js.map +1 -1
- package/dist/rules/evaluator.d.ts.map +1 -1
- package/dist/rules/evaluator.js +4 -0
- package/dist/rules/evaluator.js.map +1 -1
- package/dist/rules/factory.d.ts.map +1 -1
- package/dist/rules/factory.js +29 -4
- package/dist/rules/factory.js.map +1 -1
- package/dist/rules/registry.d.ts +8 -0
- package/dist/rules/registry.d.ts.map +1 -1
- package/dist/rules/registry.js +22 -0
- package/dist/rules/registry.js.map +1 -1
- package/dist/rules/types.d.ts +9 -0
- package/dist/rules/types.d.ts.map +1 -1
- package/dist/sync/factory.d.ts +8 -0
- package/dist/sync/factory.d.ts.map +1 -1
- package/dist/sync/factory.js +121 -3
- package/dist/sync/factory.js.map +1 -1
- package/dist/sync/index.d.ts +2 -1
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +2 -0
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/mapper/firmware.d.ts +14 -3
- package/dist/sync/mapper/firmware.d.ts.map +1 -1
- package/dist/sync/mapper/firmware.js +22 -1
- package/dist/sync/mapper/firmware.js.map +1 -1
- package/dist/sync/mapper/ring-config.d.ts +27 -13
- package/dist/sync/mapper/ring-config.d.ts.map +1 -1
- package/dist/sync/mapper/ring-config.js +29 -16
- package/dist/sync/mapper/ring-config.js.map +1 -1
- package/dist/sync/mapper/types.d.ts +35 -3
- package/dist/sync/mapper/types.d.ts.map +1 -1
- package/dist/sync/pending_closes.d.ts +30 -0
- package/dist/sync/pending_closes.d.ts.map +1 -0
- package/dist/sync/pending_closes.js +83 -0
- package/dist/sync/pending_closes.js.map +1 -0
- package/dist/sync/pusher.d.ts +21 -0
- package/dist/sync/pusher.d.ts.map +1 -1
- package/dist/sync/pusher.js +55 -1
- package/dist/sync/pusher.js.map +1 -1
- package/dist/sync/scheduler.d.ts +7 -0
- package/dist/sync/scheduler.d.ts.map +1 -1
- package/dist/sync/scheduler.js +1 -0
- package/dist/sync/scheduler.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pending SCD-2 closes queue (T-08 continuation).
|
|
3
|
+
*
|
|
4
|
+
* `mapRingConfig` emits `RingConfigClose[]` whenever a firmware ring-config
|
|
5
|
+
* snapshot supersedes a currently-open `device_config` row. Local UPDATE
|
|
6
|
+
* fires in-line inside `pushFirmware`; the remote UPDATE (against the
|
|
7
|
+
* Iceberg zone via DuckDB) runs on the next scheduler cycle so it inherits
|
|
8
|
+
* the same retry/backoff semantics as the INSERT pusher.
|
|
9
|
+
*
|
|
10
|
+
* Between those two moments the sink parks the close directives here. The
|
|
11
|
+
* enqueue happens *before* local UPDATE so a crash in between leaves a
|
|
12
|
+
* replay-safe record — the remote UPDATE is idempotent thanks to the
|
|
13
|
+
* `valid_to IS NULL` guard in `R2Pusher.pushCloses`.
|
|
14
|
+
*
|
|
15
|
+
* Key convention:
|
|
16
|
+
* `analytics:pending_closes:{brand}:{tenantId}` → JSON array of the
|
|
17
|
+
* serialized close shape.
|
|
18
|
+
*
|
|
19
|
+
* Serialization: `Date → ISO string`, restored to `Date` on drain.
|
|
20
|
+
*/
|
|
21
|
+
import type { AttachContext, KVStore } from '../core/types';
|
|
22
|
+
import type { RingConfigClose } from './mapper/ring-config';
|
|
23
|
+
export declare class PendingClosesStore {
|
|
24
|
+
#private;
|
|
25
|
+
constructor(kv: KVStore);
|
|
26
|
+
enqueue(ctx: Pick<AttachContext, 'brand' | 'tenantId'>, closes: readonly RingConfigClose[]): Promise<void>;
|
|
27
|
+
drain(ctx: Pick<AttachContext, 'brand' | 'tenantId'>): Promise<RingConfigClose[]>;
|
|
28
|
+
requeue(ctx: Pick<AttachContext, 'brand' | 'tenantId'>, closes: readonly RingConfigClose[]): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=pending_closes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pending_closes.d.ts","sourceRoot":"","sources":["../../src/sync/pending_closes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAE3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AA8B3D,qBAAa,kBAAkB;;gBAGjB,EAAE,EAAE,OAAO;IAIjB,OAAO,CACX,GAAG,EAAE,IAAI,CAAC,aAAa,EAAE,OAAO,GAAG,UAAU,CAAC,EAC9C,MAAM,EAAE,SAAS,eAAe,EAAE,GACjC,OAAO,CAAC,IAAI,CAAC;IAQV,KAAK,CACT,GAAG,EAAE,IAAI,CAAC,aAAa,EAAE,OAAO,GAAG,UAAU,CAAC,GAC7C,OAAO,CAAC,eAAe,EAAE,CAAC;IAQvB,OAAO,CACX,GAAG,EAAE,IAAI,CAAC,aAAa,EAAE,OAAO,GAAG,UAAU,CAAC,EAC9C,MAAM,EAAE,SAAS,eAAe,EAAE,GACjC,OAAO,CAAC,IAAI,CAAC;CAQjB"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pending SCD-2 closes queue (T-08 continuation).
|
|
3
|
+
*
|
|
4
|
+
* `mapRingConfig` emits `RingConfigClose[]` whenever a firmware ring-config
|
|
5
|
+
* snapshot supersedes a currently-open `device_config` row. Local UPDATE
|
|
6
|
+
* fires in-line inside `pushFirmware`; the remote UPDATE (against the
|
|
7
|
+
* Iceberg zone via DuckDB) runs on the next scheduler cycle so it inherits
|
|
8
|
+
* the same retry/backoff semantics as the INSERT pusher.
|
|
9
|
+
*
|
|
10
|
+
* Between those two moments the sink parks the close directives here. The
|
|
11
|
+
* enqueue happens *before* local UPDATE so a crash in between leaves a
|
|
12
|
+
* replay-safe record — the remote UPDATE is idempotent thanks to the
|
|
13
|
+
* `valid_to IS NULL` guard in `R2Pusher.pushCloses`.
|
|
14
|
+
*
|
|
15
|
+
* Key convention:
|
|
16
|
+
* `analytics:pending_closes:{brand}:{tenantId}` → JSON array of the
|
|
17
|
+
* serialized close shape.
|
|
18
|
+
*
|
|
19
|
+
* Serialization: `Date → ISO string`, restored to `Date` on drain.
|
|
20
|
+
*/
|
|
21
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
22
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
23
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
24
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
25
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
26
|
+
};
|
|
27
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
28
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
29
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
30
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
31
|
+
};
|
|
32
|
+
var _PendingClosesStore_kv;
|
|
33
|
+
const KEY_PREFIX = 'analytics:pending_closes';
|
|
34
|
+
function key(ctx) {
|
|
35
|
+
return `${KEY_PREFIX}:${ctx.brand}:${ctx.tenantId}`;
|
|
36
|
+
}
|
|
37
|
+
function serialize(close) {
|
|
38
|
+
return {
|
|
39
|
+
device_id: close.device_id,
|
|
40
|
+
data_type: close.data_type,
|
|
41
|
+
valid_to: close.valid_to.toISOString(),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function deserialize(row) {
|
|
45
|
+
return {
|
|
46
|
+
device_id: row.device_id,
|
|
47
|
+
data_type: row.data_type,
|
|
48
|
+
valid_to: new Date(row.valid_to),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export class PendingClosesStore {
|
|
52
|
+
constructor(kv) {
|
|
53
|
+
_PendingClosesStore_kv.set(this, void 0);
|
|
54
|
+
__classPrivateFieldSet(this, _PendingClosesStore_kv, kv, "f");
|
|
55
|
+
}
|
|
56
|
+
async enqueue(ctx, closes) {
|
|
57
|
+
if (closes.length === 0)
|
|
58
|
+
return;
|
|
59
|
+
const k = key(ctx);
|
|
60
|
+
const existing = (await __classPrivateFieldGet(this, _PendingClosesStore_kv, "f").get(k)) ?? [];
|
|
61
|
+
const next = [...existing, ...closes.map(serialize)];
|
|
62
|
+
await __classPrivateFieldGet(this, _PendingClosesStore_kv, "f").set(k, next);
|
|
63
|
+
}
|
|
64
|
+
async drain(ctx) {
|
|
65
|
+
const k = key(ctx);
|
|
66
|
+
const rows = (await __classPrivateFieldGet(this, _PendingClosesStore_kv, "f").get(k)) ?? [];
|
|
67
|
+
if (rows.length === 0)
|
|
68
|
+
return [];
|
|
69
|
+
await __classPrivateFieldGet(this, _PendingClosesStore_kv, "f").delete(k);
|
|
70
|
+
return rows.map(deserialize);
|
|
71
|
+
}
|
|
72
|
+
async requeue(ctx, closes) {
|
|
73
|
+
if (closes.length === 0)
|
|
74
|
+
return;
|
|
75
|
+
const k = key(ctx);
|
|
76
|
+
const existing = (await __classPrivateFieldGet(this, _PendingClosesStore_kv, "f").get(k)) ?? [];
|
|
77
|
+
// Prepend the requeued closes so the next drain retries them first.
|
|
78
|
+
const next = [...closes.map(serialize), ...existing];
|
|
79
|
+
await __classPrivateFieldGet(this, _PendingClosesStore_kv, "f").set(k, next);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
_PendingClosesStore_kv = new WeakMap();
|
|
83
|
+
//# sourceMappingURL=pending_closes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pending_closes.js","sourceRoot":"","sources":["../../src/sync/pending_closes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;;;;;;;;;;;;AAMH,MAAM,UAAU,GAAG,0BAA0B,CAAA;AAQ7C,SAAS,GAAG,CAAC,GAA8C;IACzD,OAAO,GAAG,UAAU,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAA;AACrD,CAAC;AAED,SAAS,SAAS,CAAC,KAAsB;IACvC,OAAO;QACL,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE;KACvC,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,GAAoB;IACvC,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,QAAQ,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;KACjC,CAAA;AACH,CAAC;AAED,MAAM,OAAO,kBAAkB;IAG7B,YAAY,EAAW;QAFd,yCAAY;QAGnB,uBAAA,IAAI,0BAAO,EAAE,MAAA,CAAA;IACf,CAAC;IAED,KAAK,CAAC,OAAO,CACX,GAA8C,EAC9C,MAAkC;QAElC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QAC/B,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;QAClB,MAAM,QAAQ,GAAG,CAAC,MAAM,uBAAA,IAAI,8BAAI,CAAC,GAAG,CAAoB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QACjE,MAAM,IAAI,GAAG,CAAC,GAAG,QAAQ,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAA;QACpD,MAAM,uBAAA,IAAI,8BAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;IAC7B,CAAC;IAED,KAAK,CAAC,KAAK,CACT,GAA8C;QAE9C,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;QAClB,MAAM,IAAI,GAAG,CAAC,MAAM,uBAAA,IAAI,8BAAI,CAAC,GAAG,CAAoB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QAC7D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAA;QAChC,MAAM,uBAAA,IAAI,8BAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QACxB,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IAC9B,CAAC;IAED,KAAK,CAAC,OAAO,CACX,GAA8C,EAC9C,MAAkC;QAElC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QAC/B,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;QAClB,MAAM,QAAQ,GAAG,CAAC,MAAM,uBAAA,IAAI,8BAAI,CAAC,GAAG,CAAoB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QACjE,oEAAoE;QACpE,MAAM,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAA;QACpD,MAAM,uBAAA,IAAI,8BAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;IAC7B,CAAC;CACF"}
|
package/dist/sync/pusher.d.ts
CHANGED
|
@@ -19,6 +19,7 @@ import type { HybridDuckDB } from '../core/engine';
|
|
|
19
19
|
import type { AttachContext } from '../core/types';
|
|
20
20
|
import { SyncError } from './errors';
|
|
21
21
|
import type { PushEmitter } from './events';
|
|
22
|
+
import type { RingConfigClose } from './mapper/ring-config';
|
|
22
23
|
import type { WatermarkStore } from './watermark';
|
|
23
24
|
export interface PushResult {
|
|
24
25
|
table: string;
|
|
@@ -54,6 +55,26 @@ export declare class R2Pusher {
|
|
|
54
55
|
#private;
|
|
55
56
|
constructor(config: R2PusherConfig);
|
|
56
57
|
push(table: string, ctx: AttachContext): Promise<PushResult>;
|
|
58
|
+
/**
|
|
59
|
+
* SCD-2 close directives → remote UPDATE (T-08 continuation).
|
|
60
|
+
*
|
|
61
|
+
* Each close becomes:
|
|
62
|
+
* UPDATE <remote>.device_config
|
|
63
|
+
* SET valid_to = $valid_to
|
|
64
|
+
* WHERE device_id = $device_id
|
|
65
|
+
* AND data_type = $data_type
|
|
66
|
+
* AND family_id = $family_id
|
|
67
|
+
* AND valid_to IS NULL
|
|
68
|
+
*
|
|
69
|
+
* The `valid_to IS NULL` guard makes replaying the same close a no-op,
|
|
70
|
+
* which is what lets the `PendingClosesStore` + scheduler retry cycle
|
|
71
|
+
* survive crashes between local UPDATE and remote UPDATE.
|
|
72
|
+
*
|
|
73
|
+
* 401 handling mirrors `#pushOrCatch`: one `refreshToken()` + retry, then
|
|
74
|
+
* surface `token_expired`. Other errors surface `push_failed` and leave
|
|
75
|
+
* the caller responsible for requeueing.
|
|
76
|
+
*/
|
|
77
|
+
pushCloses(closes: readonly RingConfigClose[], ctx: AttachContext): Promise<PushResult>;
|
|
57
78
|
pushAll(tables: readonly string[], ctx: AttachContext): Promise<PushResult[]>;
|
|
58
79
|
}
|
|
59
80
|
//# sourceMappingURL=pusher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pusher.d.ts","sourceRoot":"","sources":["../../src/sync/pusher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAElD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACpC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,EAAE,EAAE,OAAO,CAAA;IACX,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,YAAY,CAAA;IACpB,SAAS,EAAE,cAAc,CAAA;IACzB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAClC;;;OAGG;IACH,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAA;IACjC;;;;;OAKG;IACH,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IAC1D,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IAC3D;;;OAGG;IACH,IAAI,CAAC,EAAE,WAAW,CAAA;CACnB;AAYD,qBAAa,QAAQ;;gBASP,MAAM,EAAE,cAAc;IAU5B,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"pusher.d.ts","sourceRoot":"","sources":["../../src/sync/pusher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAElD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACpC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,EAAE,EAAE,OAAO,CAAA;IACX,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,YAAY,CAAA;IACpB,SAAS,EAAE,cAAc,CAAA;IACzB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAClC;;;OAGG;IACH,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAA;IACjC;;;;;OAKG;IACH,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IAC1D,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IAC3D;;;OAGG;IACH,IAAI,CAAC,EAAE,WAAW,CAAA;CACnB;AAYD,qBAAa,QAAQ;;gBASP,MAAM,EAAE,cAAc;IAU5B,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC;IAwBlE;;;;;;;;;;;;;;;;;;OAkBG;IACG,UAAU,CACd,MAAM,EAAE,SAAS,eAAe,EAAE,EAClC,GAAG,EAAE,aAAa,GACjB,OAAO,CAAC,UAAU,CAAC;IAiDhB,OAAO,CACX,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,GAAG,EAAE,aAAa,GACjB,OAAO,CAAC,UAAU,EAAE,CAAC;CAmEzB"}
|
package/dist/sync/pusher.js
CHANGED
|
@@ -26,7 +26,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
26
26
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
27
27
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
28
28
|
};
|
|
29
|
-
var _R2Pusher_instances, _R2Pusher_engine, _R2Pusher_watermark, _R2Pusher_refreshToken, _R2Pusher_is401, _R2Pusher_localTable, _R2Pusher_remoteTable, _R2Pusher_emit, _R2Pusher_pushOrCatch, _R2Pusher_pushOnce, _R2Pusher_toFailure;
|
|
29
|
+
var _R2Pusher_instances, _R2Pusher_engine, _R2Pusher_watermark, _R2Pusher_refreshToken, _R2Pusher_is401, _R2Pusher_localTable, _R2Pusher_remoteTable, _R2Pusher_emit, _R2Pusher_pushOrCatch, _R2Pusher_pushClosesOrCatch, _R2Pusher_pushClosesOnce, _R2Pusher_pushOnce, _R2Pusher_toFailure;
|
|
30
30
|
import { timeColumnFor } from '../core/table_metadata';
|
|
31
31
|
import { SyncError } from './errors';
|
|
32
32
|
const DEFAULT_IS_401 = (err) => {
|
|
@@ -60,6 +60,30 @@ export class R2Pusher {
|
|
|
60
60
|
__classPrivateFieldGet(this, _R2Pusher_emit, "f")?.call(this, result);
|
|
61
61
|
return result;
|
|
62
62
|
}
|
|
63
|
+
/**
|
|
64
|
+
* SCD-2 close directives → remote UPDATE (T-08 continuation).
|
|
65
|
+
*
|
|
66
|
+
* Each close becomes:
|
|
67
|
+
* UPDATE <remote>.device_config
|
|
68
|
+
* SET valid_to = $valid_to
|
|
69
|
+
* WHERE device_id = $device_id
|
|
70
|
+
* AND data_type = $data_type
|
|
71
|
+
* AND family_id = $family_id
|
|
72
|
+
* AND valid_to IS NULL
|
|
73
|
+
*
|
|
74
|
+
* The `valid_to IS NULL` guard makes replaying the same close a no-op,
|
|
75
|
+
* which is what lets the `PendingClosesStore` + scheduler retry cycle
|
|
76
|
+
* survive crashes between local UPDATE and remote UPDATE.
|
|
77
|
+
*
|
|
78
|
+
* 401 handling mirrors `#pushOrCatch`: one `refreshToken()` + retry, then
|
|
79
|
+
* surface `token_expired`. Other errors surface `push_failed` and leave
|
|
80
|
+
* the caller responsible for requeueing.
|
|
81
|
+
*/
|
|
82
|
+
async pushCloses(closes, ctx) {
|
|
83
|
+
const result = await __classPrivateFieldGet(this, _R2Pusher_instances, "m", _R2Pusher_pushClosesOrCatch).call(this, closes, ctx);
|
|
84
|
+
__classPrivateFieldGet(this, _R2Pusher_emit, "f")?.call(this, result);
|
|
85
|
+
return result;
|
|
86
|
+
}
|
|
63
87
|
async pushAll(tables, ctx) {
|
|
64
88
|
const settled = await Promise.allSettled(tables.map(t => this.push(t, ctx)));
|
|
65
89
|
return settled.map((r, i) => {
|
|
@@ -88,6 +112,36 @@ _R2Pusher_engine = new WeakMap(), _R2Pusher_watermark = new WeakMap(), _R2Pusher
|
|
|
88
112
|
}
|
|
89
113
|
return __classPrivateFieldGet(this, _R2Pusher_instances, "m", _R2Pusher_toFailure).call(this, table, err, 'push_failed');
|
|
90
114
|
}
|
|
115
|
+
}, _R2Pusher_pushClosesOrCatch = async function _R2Pusher_pushClosesOrCatch(closes, ctx) {
|
|
116
|
+
try {
|
|
117
|
+
return await __classPrivateFieldGet(this, _R2Pusher_instances, "m", _R2Pusher_pushClosesOnce).call(this, closes, ctx);
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
if (__classPrivateFieldGet(this, _R2Pusher_is401, "f").call(this, err) && __classPrivateFieldGet(this, _R2Pusher_refreshToken, "f")) {
|
|
121
|
+
try {
|
|
122
|
+
await __classPrivateFieldGet(this, _R2Pusher_refreshToken, "f").call(this);
|
|
123
|
+
return await __classPrivateFieldGet(this, _R2Pusher_instances, "m", _R2Pusher_pushClosesOnce).call(this, closes, ctx);
|
|
124
|
+
}
|
|
125
|
+
catch (retryErr) {
|
|
126
|
+
return __classPrivateFieldGet(this, _R2Pusher_instances, "m", _R2Pusher_toFailure).call(this, 'device_config', retryErr, 'token_expired');
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return __classPrivateFieldGet(this, _R2Pusher_instances, "m", _R2Pusher_toFailure).call(this, 'device_config', err, 'push_failed');
|
|
130
|
+
}
|
|
131
|
+
}, _R2Pusher_pushClosesOnce = async function _R2Pusher_pushClosesOnce(closes, ctx) {
|
|
132
|
+
if (closes.length === 0) {
|
|
133
|
+
return { table: 'device_config', rowsPushed: 0, ok: true };
|
|
134
|
+
}
|
|
135
|
+
const remote = __classPrivateFieldGet(this, _R2Pusher_remoteTable, "f").call(this, ctx, 'device_config');
|
|
136
|
+
for (const close of closes) {
|
|
137
|
+
await __classPrivateFieldGet(this, _R2Pusher_engine, "f").execute(`UPDATE ${remote} SET valid_to = $valid_to WHERE device_id = $device_id AND data_type = $data_type AND family_id = $family_id AND valid_to IS NULL`, {
|
|
138
|
+
valid_to: close.valid_to.toISOString(),
|
|
139
|
+
device_id: close.device_id,
|
|
140
|
+
data_type: close.data_type,
|
|
141
|
+
family_id: ctx.tenantId,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
return { table: 'device_config', rowsPushed: closes.length, ok: true };
|
|
91
145
|
}, _R2Pusher_pushOnce = async function _R2Pusher_pushOnce(table, ctx) {
|
|
92
146
|
const tsCol = timeColumnFor(table);
|
|
93
147
|
const watermark = await __classPrivateFieldGet(this, _R2Pusher_watermark, "f").get(ctx.brand, ctx.tenantId, table, 'push');
|
package/dist/sync/pusher.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pusher.js","sourceRoot":"","sources":["../../src/sync/pusher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;;;;;;;;;;;;;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAEtD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"pusher.js","sourceRoot":"","sources":["../../src/sync/pusher.ts"],"names":[],"mappings":"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"}
|
package/dist/sync/scheduler.d.ts
CHANGED
|
@@ -33,6 +33,13 @@ export interface SyncCoordinator {
|
|
|
33
33
|
pushAll: (tables: string[], ctx: AttachContext) => Promise<Array<{
|
|
34
34
|
ok: boolean;
|
|
35
35
|
}>>;
|
|
36
|
+
/**
|
|
37
|
+
* SCD-2 close directives (`device_config.valid_to = now()`) pending
|
|
38
|
+
* against the remote Iceberg zone. Drained + pushed between `pushAll`
|
|
39
|
+
* and `fetchIncremental` so the fetch step sees consistent closes.
|
|
40
|
+
* Optional — only wired when `tables` includes `'device_config'`.
|
|
41
|
+
*/
|
|
42
|
+
pushClosesForDeviceConfig?: (ctx: AttachContext) => Promise<void>;
|
|
36
43
|
fetchIncremental: (ctx: AttachContext) => Promise<Array<{
|
|
37
44
|
ok: boolean;
|
|
38
45
|
}>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/sync/scheduler.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/sync/scheduler.ts"],"names":[],"mappings":"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"}
|
package/dist/sync/scheduler.js
CHANGED
|
@@ -96,6 +96,7 @@ _SyncScheduler_config = new WeakMap(), _SyncScheduler_state = new WeakMap(), _Sy
|
|
|
96
96
|
try {
|
|
97
97
|
await __classPrivateFieldGet(this, _SyncScheduler_config, "f").coordinator.flushAll();
|
|
98
98
|
await __classPrivateFieldGet(this, _SyncScheduler_config, "f").coordinator.pushAll(__classPrivateFieldGet(this, _SyncScheduler_config, "f").tables, __classPrivateFieldGet(this, _SyncScheduler_config, "f").ctx);
|
|
99
|
+
await __classPrivateFieldGet(this, _SyncScheduler_config, "f").coordinator.pushClosesForDeviceConfig?.(__classPrivateFieldGet(this, _SyncScheduler_config, "f").ctx);
|
|
99
100
|
await __classPrivateFieldGet(this, _SyncScheduler_config, "f").coordinator.fetchIncremental(__classPrivateFieldGet(this, _SyncScheduler_config, "f").ctx);
|
|
100
101
|
await __classPrivateFieldGet(this, _SyncScheduler_config, "f").coordinator.onCycleComplete?.();
|
|
101
102
|
__classPrivateFieldGet(this, _SyncScheduler_config, "f").logger.debug('scheduler.cycle.ok');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/sync/scheduler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;;;;;;;;;;;;;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/sync/scheduler.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mongrov/analytics",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"sideEffects": false,
|
|
5
5
|
"description": "DuckDB + R2 Iceberg local analytics for @mongrov apps",
|
|
6
6
|
"license": "MIT",
|
|
@@ -104,8 +104,8 @@
|
|
|
104
104
|
"typescript": "^5.9.3",
|
|
105
105
|
"vitest": "^2.1.9",
|
|
106
106
|
"zod": "^3.23.8",
|
|
107
|
-
"@mongrov/
|
|
108
|
-
"@mongrov/
|
|
107
|
+
"@mongrov/db": "0.3.0",
|
|
108
|
+
"@mongrov/types": "0.4.0"
|
|
109
109
|
},
|
|
110
110
|
"scripts": {
|
|
111
111
|
"build": "tsc -p tsconfig.build.json",
|