@catalyst-cloud/sdk 0.2.0 → 0.3.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/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/live-sync-client.d.ts +18 -0
- package/dist/live-sync-client.d.ts.map +1 -1
- package/dist/live-sync-client.js +43 -2
- package/dist/live-sync-client.js.map +1 -1
- package/dist/node.d.ts +1 -0
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +4 -0
- package/dist/node.js.map +1 -1
- package/dist/otel.d.ts +166 -0
- package/dist/otel.d.ts.map +1 -0
- package/dist/otel.js +249 -0
- package/dist/otel.js.map +1 -0
- package/dist/replica/catalyst-replica.d.ts +55 -0
- package/dist/replica/catalyst-replica.d.ts.map +1 -1
- package/dist/replica/catalyst-replica.js +203 -45
- package/dist/replica/catalyst-replica.js.map +1 -1
- package/dist/replica/writer-lock.d.ts +7 -0
- package/dist/replica/writer-lock.d.ts.map +1 -1
- package/dist/replica/writer-lock.js +23 -13
- package/dist/replica/writer-lock.js.map +1 -1
- package/package.json +10 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export { LiveSyncClient, buildConnectUrl, parseFrame, toWsOrigin, type AuthStrategy, type LiveSyncClientOptions, type LiveSyncStatus, type LogLevel, type WebSocketLike, type WebSocketFactory, } from "./live-sync-client.js";
|
|
2
2
|
export { ENTITY_NAMES, CHANGE_OPS, type AccountId, type EntityName, type ChangeOp, type ChangeFrame, type ResyncFrame, type SyncFrame, type ServerFrame, } from "./types.js";
|
|
3
|
+
export { DEFAULT_SCOPE_NAME, CATALYST_ATTR, REPLICA_METRIC, REPLICA_SPAN, REPLICA_STATUS_CODE, type TelemetryConfig, } from "./otel.js";
|
|
3
4
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,cAAc,EACd,eAAe,EACf,UAAU,EACV,UAAU,EACV,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,gBAAgB,GACtB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,YAAY,EACZ,UAAU,EACV,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,WAAW,GACjB,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,cAAc,EACd,eAAe,EACf,UAAU,EACV,UAAU,EACV,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,gBAAgB,GACtB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,YAAY,EACZ,UAAU,EACV,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,WAAW,GACjB,MAAM,YAAY,CAAC;AAKpB,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,mBAAmB,EACnB,KAAK,eAAe,GACrB,MAAM,WAAW,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -7,4 +7,8 @@
|
|
|
7
7
|
// The class is storage-agnostic and auth-injected: see {@link LiveSyncClient}.
|
|
8
8
|
export { LiveSyncClient, buildConnectUrl, parseFrame, toWsOrigin, } from "./live-sync-client.js";
|
|
9
9
|
export { ENTITY_NAMES, CHANGE_OPS, } from "./types.js";
|
|
10
|
+
// The opt-in OpenTelemetry contract (CTC-138). Just the `telemetry` option type + the instrumentation
|
|
11
|
+
// scope / metric / span / attribute NAMES (plain consts + a structural type, NO `@opentelemetry/api`
|
|
12
|
+
// type leak), so a consumer can type the option and reference the exact stream names for dashboards.
|
|
13
|
+
export { DEFAULT_SCOPE_NAME, CATALYST_ATTR, REPLICA_METRIC, REPLICA_SPAN, REPLICA_STATUS_CODE, } from "./otel.js";
|
|
10
14
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,EAAE;AACF,sGAAsG;AACtG,mGAAmG;AACnG,uBAAuB;AACvB,EAAE;AACF,+EAA+E;AAE/E,OAAO,EACL,cAAc,EACd,eAAe,EACf,UAAU,EACV,UAAU,GAOX,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,YAAY,EACZ,UAAU,GAQX,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,EAAE;AACF,sGAAsG;AACtG,mGAAmG;AACnG,uBAAuB;AACvB,EAAE;AACF,+EAA+E;AAE/E,OAAO,EACL,cAAc,EACd,eAAe,EACf,UAAU,EACV,UAAU,GAOX,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,YAAY,EACZ,UAAU,GAQX,MAAM,YAAY,CAAC;AAEpB,sGAAsG;AACtG,qGAAqG;AACrG,qGAAqG;AACrG,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,mBAAmB,GAEpB,MAAM,WAAW,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ChangeFrame, ServerFrame } from "./types.js";
|
|
2
|
+
import { type Telemetry, type TelemetryConfig } from "./otel.js";
|
|
2
3
|
/**
|
|
3
4
|
* The minimal WHATWG-WebSocket surface LiveSyncClient drives. Declared structurally (not via a DOM /
|
|
4
5
|
* Node lib type) so (a) the package needs no `@types/ws` / DOM lib and (b) tests inject a fake. The
|
|
@@ -84,6 +85,16 @@ export interface LiveSyncClientOptions {
|
|
|
84
85
|
wsFactory?: WebSocketFactory;
|
|
85
86
|
/** Optional structured logger; defaults to console. */
|
|
86
87
|
log?: (level: LogLevel, msg: string, extra?: unknown) => void;
|
|
88
|
+
/**
|
|
89
|
+
* Opt-in OpenTelemetry (CTC-138). `false`/absent = OFF (zero overhead, no `@opentelemetry/api`
|
|
90
|
+
* import attempted). `true` = ON with the default instrumentation scope; an object overrides the
|
|
91
|
+
* tracer/meter name. This transport emits the `catalyst.replica.reconnect` (per connect attempt) and
|
|
92
|
+
* `catalyst.replica.resync` spans; the replica layer adds the seed/apply spans + the metrics. When a
|
|
93
|
+
* {@link CatalystReplica} owns this client it injects its already-resolved {@link Telemetry} so both
|
|
94
|
+
* layers share ONE tracer/meter (and the seed span nests under the resync span). Spans route through
|
|
95
|
+
* the consumer's global TracerProvider when one is registered.
|
|
96
|
+
*/
|
|
97
|
+
telemetry?: TelemetryConfig | Telemetry;
|
|
87
98
|
}
|
|
88
99
|
/** http(s)://host → ws(s)://host, leaving the rest of the origin + path intact (https→wss, http→ws). */
|
|
89
100
|
export declare function toWsOrigin(baseUrl: string): string;
|
|
@@ -114,12 +125,17 @@ export declare class LiveSyncClient {
|
|
|
114
125
|
private readonly maxBackoffMs;
|
|
115
126
|
private readonly wsFactory;
|
|
116
127
|
private readonly log;
|
|
128
|
+
private readonly telemetryConfig;
|
|
117
129
|
private ws;
|
|
118
130
|
private stopped;
|
|
119
131
|
private resyncing;
|
|
120
132
|
private backoff;
|
|
121
133
|
private reconnectTimer;
|
|
122
134
|
private resolveDone;
|
|
135
|
+
/** Resolved once in start(); the no-op until then so any early call is safe. */
|
|
136
|
+
private telemetry;
|
|
137
|
+
/** The in-flight connect-attempt span (ended OK on open, ERROR on construct-fail / close-before-open). */
|
|
138
|
+
private connectSpan;
|
|
123
139
|
constructor(opts: LiveSyncClientOptions);
|
|
124
140
|
/**
|
|
125
141
|
* Start the client: seed first if the consumer has no cursor, then open the live socket and keep it
|
|
@@ -134,6 +150,8 @@ export declare class LiveSyncClient {
|
|
|
134
150
|
connectUrl(): string;
|
|
135
151
|
private setStatus;
|
|
136
152
|
private openSocket;
|
|
153
|
+
/** End the in-flight connect span exactly once (idempotent — nulls the handle). */
|
|
154
|
+
private endConnectSpan;
|
|
137
155
|
/** Detach handlers BEFORE closing so a programmatic close can't re-enter scheduleReconnect. */
|
|
138
156
|
private closeSocket;
|
|
139
157
|
private scheduleReconnect;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"live-sync-client.d.ts","sourceRoot":"","sources":["../src/live-sync-client.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,WAAW,EAAe,WAAW,EAAa,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"live-sync-client.d.ts","sourceRoot":"","sources":["../src/live-sync-client.ts"],"names":[],"mappings":"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"}
|
package/dist/live-sync-client.js
CHANGED
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
//
|
|
24
24
|
// There is intentionally NO setInterval keepalive: the WHATWG WebSocket ping/pong is handled by the
|
|
25
25
|
// platform, and a re-implemented heartbeat would keep the connection needlessly active.
|
|
26
|
+
import { NOOP_TELEMETRY, createTelemetry, CATALYST_ATTR, REPLICA_SPAN, DEFAULT_SCOPE_NAME, } from "./otel.js";
|
|
26
27
|
/** Resolve the runtime global WebSocket, or fail with an actionable message. */
|
|
27
28
|
function defaultWsFactory(url) {
|
|
28
29
|
const Ctor = globalThis.WebSocket;
|
|
@@ -69,12 +70,17 @@ export class LiveSyncClient {
|
|
|
69
70
|
maxBackoffMs;
|
|
70
71
|
wsFactory;
|
|
71
72
|
log;
|
|
73
|
+
telemetryConfig;
|
|
72
74
|
ws = null;
|
|
73
75
|
stopped = false;
|
|
74
76
|
resyncing = false;
|
|
75
77
|
backoff;
|
|
76
78
|
reconnectTimer = null;
|
|
77
79
|
resolveDone = null;
|
|
80
|
+
/** Resolved once in start(); the no-op until then so any early call is safe. */
|
|
81
|
+
telemetry = NOOP_TELEMETRY;
|
|
82
|
+
/** The in-flight connect-attempt span (ended OK on open, ERROR on construct-fail / close-before-open). */
|
|
83
|
+
connectSpan = null;
|
|
78
84
|
constructor(opts) {
|
|
79
85
|
this.baseUrl = stripTrailingSlashes(opts.baseUrl);
|
|
80
86
|
this.accountId = opts.accountId;
|
|
@@ -91,6 +97,7 @@ export class LiveSyncClient {
|
|
|
91
97
|
this.log =
|
|
92
98
|
opts.log ??
|
|
93
99
|
((lvl, msg, extra) => console[lvl === "error" ? "error" : "log"](`[catalyst-sdk:live] ${msg}`, extra ?? ""));
|
|
100
|
+
this.telemetryConfig = opts.telemetry;
|
|
94
101
|
this.backoff = this.backoffMs;
|
|
95
102
|
}
|
|
96
103
|
/**
|
|
@@ -101,6 +108,17 @@ export class LiveSyncClient {
|
|
|
101
108
|
*/
|
|
102
109
|
async start() {
|
|
103
110
|
this.stopped = false;
|
|
111
|
+
// Resolve the OTel seam ONCE up front (before the first reseed, so the seed span exists on the
|
|
112
|
+
// cold-start path too). Keep the OFF path FULLY SYNCHRONOUS — no `await`, so a caller that opens
|
|
113
|
+
// the socket and inspects it in the same tick still sees it; only pay the async resolution (guarded
|
|
114
|
+
// dynamic import, or a CatalystReplica passing its already-resolved instance) when telemetry is on.
|
|
115
|
+
this.telemetry =
|
|
116
|
+
this.telemetryConfig === undefined || this.telemetryConfig === false
|
|
117
|
+
? NOOP_TELEMETRY
|
|
118
|
+
: await createTelemetry(this.telemetryConfig, {
|
|
119
|
+
tracerName: DEFAULT_SCOPE_NAME,
|
|
120
|
+
meterName: DEFAULT_SCOPE_NAME,
|
|
121
|
+
});
|
|
104
122
|
const saved = this.getCursor();
|
|
105
123
|
if (saved == null) {
|
|
106
124
|
this.setStatus("resyncing");
|
|
@@ -145,6 +163,11 @@ export class LiveSyncClient {
|
|
|
145
163
|
if (this.stopped)
|
|
146
164
|
return;
|
|
147
165
|
this.setStatus("connecting");
|
|
166
|
+
// One span per connect attempt: started here, ended OK in onopen, ERROR on construct-fail / a close
|
|
167
|
+
// before open. Manual (not active) because the lifecycle spans onopen…onclose callbacks.
|
|
168
|
+
this.connectSpan = this.telemetry.startSpan(REPLICA_SPAN.reconnect, {
|
|
169
|
+
[CATALYST_ATTR.tenant]: this.accountId,
|
|
170
|
+
});
|
|
148
171
|
const wsUrl = this.connectUrl();
|
|
149
172
|
let ws;
|
|
150
173
|
try {
|
|
@@ -153,6 +176,7 @@ export class LiveSyncClient {
|
|
|
153
176
|
catch (err) {
|
|
154
177
|
this.log("error", "ws construction failed; scheduling reconnect", err);
|
|
155
178
|
this.setStatus("error");
|
|
179
|
+
this.endConnectSpan(err);
|
|
156
180
|
this.scheduleReconnect();
|
|
157
181
|
return;
|
|
158
182
|
}
|
|
@@ -160,6 +184,7 @@ export class LiveSyncClient {
|
|
|
160
184
|
ws.onopen = () => {
|
|
161
185
|
this.backoff = this.backoffMs; // a successful open resets the backoff ramp
|
|
162
186
|
this.setStatus("live");
|
|
187
|
+
this.endConnectSpan();
|
|
163
188
|
this.sendSync();
|
|
164
189
|
};
|
|
165
190
|
ws.onmessage = (ev) => {
|
|
@@ -170,6 +195,8 @@ export class LiveSyncClient {
|
|
|
170
195
|
this.ws = null;
|
|
171
196
|
if (!this.stopped && !this.resyncing)
|
|
172
197
|
this.setStatus("reconnecting");
|
|
198
|
+
// No-op if onopen already ended it (a normal disconnect of a healthy socket isn't a connect error).
|
|
199
|
+
this.endConnectSpan(new Error("socket closed before open"));
|
|
173
200
|
this.scheduleReconnect();
|
|
174
201
|
};
|
|
175
202
|
ws.onerror = (err) => {
|
|
@@ -185,8 +212,18 @@ export class LiveSyncClient {
|
|
|
185
212
|
}
|
|
186
213
|
};
|
|
187
214
|
}
|
|
215
|
+
/** End the in-flight connect span exactly once (idempotent — nulls the handle). */
|
|
216
|
+
endConnectSpan(error) {
|
|
217
|
+
const span = this.connectSpan;
|
|
218
|
+
if (!span)
|
|
219
|
+
return;
|
|
220
|
+
this.connectSpan = null;
|
|
221
|
+
span.end(error);
|
|
222
|
+
}
|
|
188
223
|
/** Detach handlers BEFORE closing so a programmatic close can't re-enter scheduleReconnect. */
|
|
189
224
|
closeSocket() {
|
|
225
|
+
// A deliberate teardown of an in-flight attempt (stop/resync): end the connect span neutrally.
|
|
226
|
+
this.endConnectSpan();
|
|
190
227
|
const ws = this.ws;
|
|
191
228
|
this.ws = null;
|
|
192
229
|
if (!ws)
|
|
@@ -257,8 +294,12 @@ export class LiveSyncClient {
|
|
|
257
294
|
this.setStatus("resyncing");
|
|
258
295
|
this.closeSocket();
|
|
259
296
|
try {
|
|
260
|
-
|
|
261
|
-
this
|
|
297
|
+
// The reseed runs inside an ACTIVE span so the replica's seed span (the injected reseed IS
|
|
298
|
+
// seedFromSnapshot) auto-parents under this resync span.
|
|
299
|
+
await this.telemetry.withActiveSpan(REPLICA_SPAN.resync, { [CATALYST_ATTR.tenant]: this.accountId }, async () => {
|
|
300
|
+
const cursor = await this.reseed();
|
|
301
|
+
this.log("info", `resynced, cursor=${cursor}`);
|
|
302
|
+
});
|
|
262
303
|
}
|
|
263
304
|
catch (err) {
|
|
264
305
|
this.log("error", "resync reseed failed; will retry on reconnect", err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"live-sync-client.js","sourceRoot":"","sources":["../src/live-sync-client.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,EAAE;AACF,+FAA+F;AAC/F,kGAAkG;AAClG,mGAAmG;AACnG,sGAAsG;AACtG,qGAAqG;AACrG,sCAAsC;AACtC,EAAE;AACF,oGAAoG;AACpG,mFAAmF;AACnF,EAAE;AACF,oGAAoG;AACpG,sGAAsG;AACtG,uGAAuG;AACvG,sGAAsG;AACtG,wFAAwF;AACxF,gGAAgG;AAChG,wEAAwE;AACxE,8FAA8F;AAC9F,kGAAkG;AAClG,8CAA8C;AAC9C,EAAE;AACF,oGAAoG;AACpG,wFAAwF;
|
|
1
|
+
{"version":3,"file":"live-sync-client.js","sourceRoot":"","sources":["../src/live-sync-client.ts"],"names":[],"mappings":"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"}
|
package/dist/node.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ export { bunSqliteEngine, bunSqliteReadonlyEngine, nodeSqliteEngine, nodeSqliteR
|
|
|
3
3
|
export { claimWriterLock, type WriterGuardOptions, type WriterLockHandle, } from "./replica/writer-lock.js";
|
|
4
4
|
export { LiveSyncClient, type AuthStrategy, type LiveSyncStatus, type LogLevel, type WebSocketLike, type WebSocketFactory, } from "./live-sync-client.js";
|
|
5
5
|
export { ENTITY_NAMES, CHANGE_OPS, type AccountId, type EntityName, type ChangeOp, type ChangeFrame, } from "./types.js";
|
|
6
|
+
export { DEFAULT_SCOPE_NAME, CATALYST_ATTR, REPLICA_METRIC, REPLICA_SPAN, REPLICA_STATUS_CODE, type TelemetryConfig, } from "./otel.js";
|
|
6
7
|
export type { SqlExecutor, SqlValue, IssueView, IssueDetailView, PullView, ProjectView, ProjectDetailView, InitiativeView, InitiativeDetailView, } from "@catalyst-cloud/read-model";
|
|
7
8
|
export { mirrorSchema, type MirrorEntityName } from "@catalyst-cloud/schema";
|
|
8
9
|
//# sourceMappingURL=node.d.ts.map
|
package/dist/node.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAWA,OAAO,EACL,eAAe,EACf,KAAK,sBAAsB,EAC3B,KAAK,8BAA8B,GACpC,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,gBAAgB,EAChB,wBAAwB,EACxB,mBAAmB,EACnB,2BAA2B,EAC3B,gBAAgB,EAChB,wBAAwB,EACxB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,mBAAmB,GACzB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,eAAe,EACf,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,GACtB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,cAAc,EACd,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,gBAAgB,GACtB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,YAAY,EACZ,UAAU,EACV,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,WAAW,GACjB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAWA,OAAO,EACL,eAAe,EACf,KAAK,sBAAsB,EAC3B,KAAK,8BAA8B,GACpC,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,gBAAgB,EAChB,wBAAwB,EACxB,mBAAmB,EACnB,2BAA2B,EAC3B,gBAAgB,EAChB,wBAAwB,EACxB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,mBAAmB,GACzB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,eAAe,EACf,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,GACtB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,cAAc,EACd,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,gBAAgB,GACtB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,YAAY,EACZ,UAAU,EACV,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,WAAW,GACjB,MAAM,YAAY,CAAC;AAKpB,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,mBAAmB,EACnB,KAAK,eAAe,GACrB,MAAM,WAAW,CAAC;AAGnB,YAAY,EACV,WAAW,EACX,QAAQ,EACR,SAAS,EACT,eAAe,EACf,QAAQ,EACR,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,oBAAoB,GACrB,MAAM,4BAA4B,CAAC;AAMpC,OAAO,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC"}
|
package/dist/node.js
CHANGED
|
@@ -14,6 +14,10 @@ export { claimWriterLock, } from "./replica/writer-lock.js";
|
|
|
14
14
|
// Re-export the transport surface so a consumer can stay on one import.
|
|
15
15
|
export { LiveSyncClient, } from "./live-sync-client.js";
|
|
16
16
|
export { ENTITY_NAMES, CHANGE_OPS, } from "./types.js";
|
|
17
|
+
// The opt-in OpenTelemetry contract (CTC-138) — see CatalystReplicaOptions.telemetry. Exports the
|
|
18
|
+
// `telemetry` option type + the instrumentation scope / metric / span / attribute NAMES so a consumer
|
|
19
|
+
// can type the option and build dashboards/alerts against the exact stream names.
|
|
20
|
+
export { DEFAULT_SCOPE_NAME, CATALYST_ATTR, REPLICA_METRIC, REPLICA_SPAN, REPLICA_STATUS_CODE, } from "./otel.js";
|
|
17
21
|
// Re-export the Drizzle table schema so the `.handle` ad-hoc escape hatch is a one-liner — the
|
|
18
22
|
// read-model `build*View` results stay the primary read surface; this is for custom typed queries:
|
|
19
23
|
// import { drizzle } from "drizzle-orm/bun-sqlite";
|
package/dist/node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,EAAE;AACF,gGAAgG;AAChG,uGAAuG;AACvG,qGAAqG;AACrG,sGAAsG;AACtG,sFAAsF;AACtF,EAAE;AACF,iGAAiG;AACjG,sEAAsE;AAEtE,OAAO,EACL,eAAe,GAGhB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,gBAAgB,EAChB,wBAAwB,EACxB,mBAAmB,EACnB,2BAA2B,EAC3B,gBAAgB,EAChB,wBAAwB,GAKzB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,eAAe,GAGhB,MAAM,0BAA0B,CAAC;AAElC,wEAAwE;AACxE,OAAO,EACL,cAAc,GAMf,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,YAAY,EACZ,UAAU,GAKX,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,EAAE;AACF,gGAAgG;AAChG,uGAAuG;AACvG,qGAAqG;AACrG,sGAAsG;AACtG,sFAAsF;AACtF,EAAE;AACF,iGAAiG;AACjG,sEAAsE;AAEtE,OAAO,EACL,eAAe,GAGhB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,gBAAgB,EAChB,wBAAwB,EACxB,mBAAmB,EACnB,2BAA2B,EAC3B,gBAAgB,EAChB,wBAAwB,GAKzB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,eAAe,GAGhB,MAAM,0BAA0B,CAAC;AAElC,wEAAwE;AACxE,OAAO,EACL,cAAc,GAMf,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,YAAY,EACZ,UAAU,GAKX,MAAM,YAAY,CAAC;AAEpB,kGAAkG;AAClG,sGAAsG;AACtG,kFAAkF;AAClF,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,mBAAmB,GAEpB,MAAM,WAAW,CAAC;AAenB,+FAA+F;AAC/F,mGAAmG;AACnG,sDAAsD;AACtD,8EAA8E;AAC9E,OAAO,EAAE,YAAY,EAAyB,MAAM,wBAAwB,CAAC"}
|
package/dist/otel.d.ts
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import type { LiveSyncStatus } from "./live-sync-client.js";
|
|
2
|
+
/** Opt-in switch for the OTel seam. `false`/absent = OFF (NO dynamic import, truly zero overhead);
|
|
3
|
+
* `true` = ON with default instrumentation-scope names; an object overrides the tracer/meter name. */
|
|
4
|
+
export type TelemetryConfig = boolean | {
|
|
5
|
+
tracerName?: string;
|
|
6
|
+
meterName?: string;
|
|
7
|
+
};
|
|
8
|
+
/** A metric/span attribute value (OTel rejects `undefined`; {@link cleanAttrs} strips it). */
|
|
9
|
+
export type AttrValue = string | number | boolean;
|
|
10
|
+
/** Attribute bag accepted at call sites — `undefined` values are dropped before reaching OTel. */
|
|
11
|
+
export type Attributes = Record<string, AttrValue | undefined>;
|
|
12
|
+
/** The shared `catalyst.*` semconv attribute keys emitted across spans + metrics. */
|
|
13
|
+
export declare const CATALYST_ATTR: {
|
|
14
|
+
/** The tenant id (= mirror/account name). */
|
|
15
|
+
readonly tenant: "catalyst.tenant";
|
|
16
|
+
/** The upstream system a row originates from: `"linear"` | `"github"`. */
|
|
17
|
+
readonly source: "catalyst.source";
|
|
18
|
+
/** The durable change-feed cursor (last applied seq). */
|
|
19
|
+
readonly cursor: "catalyst.replica.cursor";
|
|
20
|
+
/** head_seq − cursor (mirror lag in seqs), when head_seq is known. */
|
|
21
|
+
readonly lagSeq: "catalyst.replica.lag_seq";
|
|
22
|
+
/** The connection lifecycle status string. */
|
|
23
|
+
readonly status: "catalyst.replica.status";
|
|
24
|
+
/** Rows applied during a seed. */
|
|
25
|
+
readonly rowCount: "catalyst.replica.row_count";
|
|
26
|
+
/** Rows in one seed apply-batch. */
|
|
27
|
+
readonly batchRows: "catalyst.replica.batch_rows";
|
|
28
|
+
};
|
|
29
|
+
/** Metric instrument names (OTel metric stream names). */
|
|
30
|
+
export declare const REPLICA_METRIC: {
|
|
31
|
+
readonly cursor: "catalyst.replica.cursor";
|
|
32
|
+
readonly lagSeq: "catalyst.replica.lag_seq";
|
|
33
|
+
readonly freshnessMs: "catalyst.replica.freshness_ms";
|
|
34
|
+
readonly status: "catalyst.replica.status";
|
|
35
|
+
readonly applied: "catalyst.replica.applied";
|
|
36
|
+
readonly applyBatchRows: "catalyst.replica.apply_batch_rows";
|
|
37
|
+
};
|
|
38
|
+
/** Span names. */
|
|
39
|
+
export declare const REPLICA_SPAN: {
|
|
40
|
+
readonly seed: "catalyst.replica.seed";
|
|
41
|
+
readonly applyBatch: "catalyst.replica.apply_batch";
|
|
42
|
+
readonly resync: "catalyst.replica.resync";
|
|
43
|
+
readonly reconnect: "catalyst.replica.reconnect";
|
|
44
|
+
};
|
|
45
|
+
/** `LiveSyncStatus` → a numeric gauge code (the `catalyst.replica.status` gauge value). */
|
|
46
|
+
export declare const REPLICA_STATUS_CODE: Record<LiveSyncStatus, number>;
|
|
47
|
+
/** The default instrumentation-scope name for both the tracer and the meter. */
|
|
48
|
+
export declare const DEFAULT_SCOPE_NAME = "@catalyst-cloud/sdk";
|
|
49
|
+
/** Map a change-feed `entity` (table name) to its upstream source system, for `catalyst.source`. */
|
|
50
|
+
export declare function entitySource(entity: string): "github" | "linear";
|
|
51
|
+
/** A span handle passed into the `withActiveSpan*` callback for setting attributes mid-span. */
|
|
52
|
+
export interface SpanHandle {
|
|
53
|
+
setAttribute(key: string, value: AttrValue): void;
|
|
54
|
+
}
|
|
55
|
+
/** A manually-ended span (for callback-driven lifecycles like a WS connect attempt). */
|
|
56
|
+
export interface ManualSpan extends SpanHandle {
|
|
57
|
+
/** End the span. Pass an error to mark it ERROR + record the exception; otherwise it ends OK. */
|
|
58
|
+
end(error?: unknown): void;
|
|
59
|
+
}
|
|
60
|
+
/** Read side of an observable-gauge callback: observe a value with optional attributes. */
|
|
61
|
+
export interface ObservableResult {
|
|
62
|
+
observe(value: number, attributes?: Attributes): void;
|
|
63
|
+
}
|
|
64
|
+
export type ObservableCallback = (result: ObservableResult) => void;
|
|
65
|
+
/** A handle to unregister an observable-gauge callback (called on replica close). */
|
|
66
|
+
export interface GaugeRegistration {
|
|
67
|
+
remove(): void;
|
|
68
|
+
}
|
|
69
|
+
export interface Counter {
|
|
70
|
+
add(value: number, attributes?: Attributes): void;
|
|
71
|
+
}
|
|
72
|
+
export interface Histogram {
|
|
73
|
+
record(value: number, attributes?: Attributes): void;
|
|
74
|
+
}
|
|
75
|
+
export interface MetricOptions {
|
|
76
|
+
description?: string;
|
|
77
|
+
unit?: string;
|
|
78
|
+
}
|
|
79
|
+
/** The opt-in telemetry facade. The no-op instance ({@link NOOP_TELEMETRY}) implements the SAME shape
|
|
80
|
+
* so call sites are branch-free. */
|
|
81
|
+
export interface Telemetry {
|
|
82
|
+
/** True only when routed through a real (installed) `@opentelemetry/api`. */
|
|
83
|
+
readonly enabled: boolean;
|
|
84
|
+
/** Run an async `fn` inside an active span; ends OK on resolve, records the exception + ERROR on
|
|
85
|
+
* reject (then rethrows). Active so child spans (e.g. a seed under a resync) auto-parent. */
|
|
86
|
+
withActiveSpan<T>(name: string, attributes: Attributes, fn: (span: SpanHandle) => Promise<T>): Promise<T>;
|
|
87
|
+
/** The synchronous variant (e.g. a seed apply-batch). */
|
|
88
|
+
withActiveSpanSync<T>(name: string, attributes: Attributes, fn: (span: SpanHandle) => T): T;
|
|
89
|
+
/** Start a manually-ended span (e.g. a WS connect attempt ended across onopen/onclose). */
|
|
90
|
+
startSpan(name: string, attributes?: Attributes): ManualSpan;
|
|
91
|
+
/** Register an async gauge whose callback reads live instance state; returns an unregister handle. */
|
|
92
|
+
observableGauge(name: string, options: MetricOptions, callback: ObservableCallback): GaugeRegistration;
|
|
93
|
+
counter(name: string, options?: MetricOptions): Counter;
|
|
94
|
+
histogram(name: string, options?: MetricOptions): Histogram;
|
|
95
|
+
}
|
|
96
|
+
/** A telemetry that does nothing but still threads the callback's return value through `withActiveSpan*`. */
|
|
97
|
+
export declare const NOOP_TELEMETRY: Telemetry;
|
|
98
|
+
interface SpanSurface {
|
|
99
|
+
setAttribute(key: string, value: AttrValue): unknown;
|
|
100
|
+
recordException(exception: unknown): void;
|
|
101
|
+
setStatus(status: {
|
|
102
|
+
code: number;
|
|
103
|
+
message?: string;
|
|
104
|
+
}): unknown;
|
|
105
|
+
end(): void;
|
|
106
|
+
}
|
|
107
|
+
interface TracerSurface {
|
|
108
|
+
startSpan(name: string, options?: {
|
|
109
|
+
attributes?: Record<string, AttrValue>;
|
|
110
|
+
}): SpanSurface;
|
|
111
|
+
startActiveSpan<T>(name: string, options: {
|
|
112
|
+
attributes?: Record<string, AttrValue>;
|
|
113
|
+
}, fn: (span: SpanSurface) => T): T;
|
|
114
|
+
}
|
|
115
|
+
interface ObservableResultSurface {
|
|
116
|
+
observe(value: number, attributes?: Record<string, AttrValue>): void;
|
|
117
|
+
}
|
|
118
|
+
interface ObservableGaugeSurface {
|
|
119
|
+
addCallback(cb: (result: ObservableResultSurface) => void): void;
|
|
120
|
+
removeCallback(cb: (result: ObservableResultSurface) => void): void;
|
|
121
|
+
}
|
|
122
|
+
interface CounterSurface {
|
|
123
|
+
add(value: number, attributes?: Record<string, AttrValue>): void;
|
|
124
|
+
}
|
|
125
|
+
interface HistogramSurface {
|
|
126
|
+
record(value: number, attributes?: Record<string, AttrValue>): void;
|
|
127
|
+
}
|
|
128
|
+
interface MeterSurface {
|
|
129
|
+
createObservableGauge(name: string, options?: MetricOptions): ObservableGaugeSurface;
|
|
130
|
+
createCounter(name: string, options?: MetricOptions): CounterSurface;
|
|
131
|
+
createHistogram(name: string, options?: MetricOptions): HistogramSurface;
|
|
132
|
+
}
|
|
133
|
+
/** Just the bits of the `@opentelemetry/api` module namespace we read. */
|
|
134
|
+
export interface OtelApiSurface {
|
|
135
|
+
trace: {
|
|
136
|
+
getTracer(name: string, version?: string): TracerSurface;
|
|
137
|
+
};
|
|
138
|
+
metrics: {
|
|
139
|
+
getMeter(name: string, version?: string): MeterSurface;
|
|
140
|
+
};
|
|
141
|
+
SpanStatusCode: {
|
|
142
|
+
OK: number;
|
|
143
|
+
ERROR: number;
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Build a REAL telemetry facade over a resolved `@opentelemetry/api` surface (or the NO-OP when
|
|
148
|
+
* `api` is null — the "package absent" branch). Exported (but NOT re-exported from the package
|
|
149
|
+
* entrypoints) so it can be unit-tested directly with `null` for the absent case.
|
|
150
|
+
*/
|
|
151
|
+
export declare function buildTelemetry(api: OtelApiSurface | null, names: {
|
|
152
|
+
tracerName: string;
|
|
153
|
+
meterName: string;
|
|
154
|
+
}): Telemetry;
|
|
155
|
+
/**
|
|
156
|
+
* Resolve the opt-in `telemetry` option into a {@link Telemetry}. Defaults to {@link NOOP_TELEMETRY}
|
|
157
|
+
* (no dynamic import attempted) when undefined/false so the off path is truly zero-overhead. When ON,
|
|
158
|
+
* guard-imports `@opentelemetry/api`; if absent, warns once and falls back to no-op (never throws). An
|
|
159
|
+
* already-resolved `Telemetry` is returned as-is so a replica + its transport share ONE instance.
|
|
160
|
+
*/
|
|
161
|
+
export declare function createTelemetry(config: TelemetryConfig | Telemetry | undefined, defaults: {
|
|
162
|
+
tracerName: string;
|
|
163
|
+
meterName: string;
|
|
164
|
+
}): Promise<Telemetry>;
|
|
165
|
+
export {};
|
|
166
|
+
//# sourceMappingURL=otel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otel.d.ts","sourceRoot":"","sources":["../src/otel.ts"],"names":[],"mappings":"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"}
|