@zveltio/sdk 3.0.0-beta.68 → 3.0.0-beta.70
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/client/RealtimeClient.d.ts +19 -1
- package/dist/client/RealtimeClient.d.ts.map +1 -1
- package/dist/client/RealtimeClient.js +65 -12
- package/dist/client/ZveltioClient.d.ts.map +1 -1
- package/dist/client/ZveltioClient.js +7 -1
- package/dist/client.d.ts +24 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +11 -1
- package/dist/extension/index.d.ts +41 -11
- package/dist/extension/index.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/realtime.d.ts +9 -0
- package/dist/realtime.d.ts.map +1 -1
- package/dist/realtime.js +19 -1
- package/dist/schema-watcher.d.ts +9 -1
- package/dist/schema-watcher.d.ts.map +1 -1
- package/dist/schema-watcher.js +29 -9
- package/dist/tests/client.test.js +6 -0
- package/dist/tests/realtime.test.js +246 -1
- package/dist/validate/index.d.ts.map +1 -1
- package/dist/validate/index.js +9 -0
- package/package.json +1 -1
|
@@ -4,16 +4,34 @@ type StatusCallback = (status: 'connecting' | 'connected' | 'disconnected') => v
|
|
|
4
4
|
export declare class RealtimeClient {
|
|
5
5
|
private ws;
|
|
6
6
|
private baseUrl;
|
|
7
|
+
private headers;
|
|
7
8
|
private subscriptions;
|
|
8
9
|
private statusCallbacks;
|
|
10
|
+
private unauthorizedCallbacks;
|
|
9
11
|
private reconnectDelay;
|
|
10
12
|
private maxReconnectDelay;
|
|
13
|
+
private reconnectAttempts;
|
|
14
|
+
private maxReconnectAttempts;
|
|
15
|
+
private reconnectTimer;
|
|
11
16
|
private shouldReconnect;
|
|
12
|
-
|
|
17
|
+
/** Set by a 4001 close; only an explicit `connect()` clears it. */
|
|
18
|
+
private unauthorized;
|
|
19
|
+
/**
|
|
20
|
+
* @param options.headers Sent with the upgrade — e.g. `{ 'X-API-Key': key }`
|
|
21
|
+
* for a server-side client (Bun, Node). A browser cannot set headers on a
|
|
22
|
+
* WebSocket and authenticates by session cookie.
|
|
23
|
+
*/
|
|
24
|
+
constructor(baseUrl: string, options?: {
|
|
25
|
+
headers?: Record<string, string>;
|
|
26
|
+
});
|
|
27
|
+
/** Open the socket — also after a 4001, once the app has re-authenticated. */
|
|
13
28
|
connect(): void;
|
|
29
|
+
private open;
|
|
14
30
|
disconnect(): void;
|
|
15
31
|
subscribe(collection: string, event: string | '*', callback: EventCallback): () => void;
|
|
16
32
|
onStatusChange(callback: StatusCallback): () => void;
|
|
33
|
+
/** Called when the engine ends the socket because its credentials were revoked. */
|
|
34
|
+
onUnauthorized(callback: () => void): () => void;
|
|
17
35
|
private sendSubscribe;
|
|
18
36
|
private sendUnsubscribe;
|
|
19
37
|
private notifyStatus;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RealtimeClient.d.ts","sourceRoot":"","sources":["../../src/client/RealtimeClient.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"RealtimeClient.d.ts","sourceRoot":"","sources":["../../src/client/RealtimeClient.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,KAAK,aAAa,GAAG,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;AACxD,KAAK,cAAc,GAAG,CAAC,MAAM,EAAE,YAAY,GAAG,WAAW,GAAG,cAAc,KAAK,IAAI,CAAC;AAEpF,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,aAAa,CAAyC;IAC9D,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,qBAAqB,CAAyB;IACtD,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,oBAAoB,CAAM;IAClC,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,eAAe,CAAQ;IAC/B,mEAAmE;IACnE,OAAO,CAAC,YAAY,CAAS;IAE7B;;;;OAIG;gBACS,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAO;IAK/E,8EAA8E;IAC9E,OAAO,IAAI,IAAI;IAQf,OAAO,CAAC,IAAI;IAkEZ,UAAU,IAAI,IAAI;IAUlB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG,EAAE,QAAQ,EAAE,aAAa,GAAG,MAAM,IAAI;IA0BvF,cAAc,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,IAAI;IAKpD,mFAAmF;IACnF,cAAc,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAKhD,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,YAAY;CAGrB"}
|
|
@@ -1,29 +1,57 @@
|
|
|
1
|
+
import { WS_UNAUTHORIZED } from '../realtime.js';
|
|
1
2
|
export class RealtimeClient {
|
|
2
3
|
ws = null;
|
|
3
4
|
baseUrl;
|
|
5
|
+
headers;
|
|
4
6
|
subscriptions = new Map();
|
|
5
7
|
statusCallbacks = new Set();
|
|
8
|
+
unauthorizedCallbacks = new Set();
|
|
6
9
|
reconnectDelay = 1000;
|
|
7
10
|
maxReconnectDelay = 30000;
|
|
11
|
+
reconnectAttempts = 0;
|
|
12
|
+
maxReconnectAttempts = 10;
|
|
13
|
+
reconnectTimer = null;
|
|
8
14
|
shouldReconnect = true;
|
|
9
|
-
|
|
15
|
+
/** Set by a 4001 close; only an explicit `connect()` clears it. */
|
|
16
|
+
unauthorized = false;
|
|
17
|
+
/**
|
|
18
|
+
* @param options.headers Sent with the upgrade — e.g. `{ 'X-API-Key': key }`
|
|
19
|
+
* for a server-side client (Bun, Node). A browser cannot set headers on a
|
|
20
|
+
* WebSocket and authenticates by session cookie.
|
|
21
|
+
*/
|
|
22
|
+
constructor(baseUrl, options = {}) {
|
|
10
23
|
this.baseUrl = baseUrl;
|
|
24
|
+
this.headers = options.headers;
|
|
11
25
|
}
|
|
26
|
+
/** Open the socket — also after a 4001, once the app has re-authenticated. */
|
|
12
27
|
connect() {
|
|
13
|
-
|
|
28
|
+
this.unauthorized = false;
|
|
29
|
+
this.shouldReconnect = true;
|
|
30
|
+
this.reconnectAttempts = 0;
|
|
31
|
+
this.reconnectDelay = 1000;
|
|
32
|
+
this.open();
|
|
33
|
+
}
|
|
34
|
+
open() {
|
|
35
|
+
if (this.ws?.readyState === WebSocket.OPEN || this.ws?.readyState === WebSocket.CONNECTING) {
|
|
14
36
|
return;
|
|
37
|
+
}
|
|
15
38
|
const wsUrl = this.baseUrl.replace(/^http/, 'ws') + '/api/ws';
|
|
16
|
-
|
|
39
|
+
// The two-argument form with `{ headers }` is the Bun/undici extension.
|
|
40
|
+
const ws = this.headers
|
|
41
|
+
? new WebSocket(wsUrl, { headers: this.headers })
|
|
42
|
+
: new WebSocket(wsUrl);
|
|
43
|
+
this.ws = ws;
|
|
17
44
|
this.notifyStatus('connecting');
|
|
18
|
-
|
|
45
|
+
ws.onopen = () => {
|
|
19
46
|
this.reconnectDelay = 1000;
|
|
47
|
+
this.reconnectAttempts = 0;
|
|
20
48
|
this.notifyStatus('connected');
|
|
21
49
|
// Re-subscribe all active subscriptions
|
|
22
50
|
for (const channel of this.subscriptions.keys()) {
|
|
23
51
|
this.sendSubscribe(channel);
|
|
24
52
|
}
|
|
25
53
|
};
|
|
26
|
-
|
|
54
|
+
ws.onmessage = (event) => {
|
|
27
55
|
try {
|
|
28
56
|
const message = JSON.parse(event.data);
|
|
29
57
|
const key = `${message.collection}:${message.event}`;
|
|
@@ -39,19 +67,37 @@ export class RealtimeClient {
|
|
|
39
67
|
/* ignore invalid messages */
|
|
40
68
|
}
|
|
41
69
|
};
|
|
42
|
-
|
|
70
|
+
ws.onclose = (event) => {
|
|
71
|
+
// A socket `disconnect()` dropped still reports; one already replaced does not.
|
|
72
|
+
if (this.ws !== ws) {
|
|
73
|
+
if (this.ws === null)
|
|
74
|
+
this.notifyStatus('disconnected');
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
43
77
|
this.notifyStatus('disconnected');
|
|
44
|
-
if (
|
|
45
|
-
|
|
46
|
-
this.
|
|
78
|
+
if (event?.code === WS_UNAUTHORIZED) {
|
|
79
|
+
// Credentials revoked: every retry would be refused with 401.
|
|
80
|
+
this.unauthorized = true;
|
|
81
|
+
this.unauthorizedCallbacks.forEach((cb) => cb());
|
|
82
|
+
return;
|
|
47
83
|
}
|
|
84
|
+
// Bounded: a refused handshake (401) is not visible to a WebSocket in any
|
|
85
|
+
// runtime — it closes as 1002/1006 — so it must not be retried forever.
|
|
86
|
+
if (!this.shouldReconnect || this.reconnectAttempts >= this.maxReconnectAttempts)
|
|
87
|
+
return;
|
|
88
|
+
this.reconnectAttempts++;
|
|
89
|
+
this.reconnectTimer = setTimeout(() => this.open(), this.reconnectDelay);
|
|
90
|
+
this.reconnectDelay = Math.min(this.reconnectDelay * 2, this.maxReconnectDelay);
|
|
48
91
|
};
|
|
49
|
-
|
|
50
|
-
|
|
92
|
+
ws.onerror = () => {
|
|
93
|
+
ws.close();
|
|
51
94
|
};
|
|
52
95
|
}
|
|
53
96
|
disconnect() {
|
|
54
97
|
this.shouldReconnect = false;
|
|
98
|
+
if (this.reconnectTimer)
|
|
99
|
+
clearTimeout(this.reconnectTimer);
|
|
100
|
+
this.reconnectTimer = null;
|
|
55
101
|
this.ws?.close();
|
|
56
102
|
this.ws = null;
|
|
57
103
|
}
|
|
@@ -66,9 +112,11 @@ export class RealtimeClient {
|
|
|
66
112
|
if (this.ws?.readyState === WebSocket.OPEN) {
|
|
67
113
|
this.sendSubscribe(key);
|
|
68
114
|
}
|
|
69
|
-
else {
|
|
115
|
+
else if (!this.unauthorized) {
|
|
70
116
|
this.connect();
|
|
71
117
|
}
|
|
118
|
+
// After a 4001 the subscription is only recorded: the next explicit
|
|
119
|
+
// `connect()` sends it. Dialling again would only be refused.
|
|
72
120
|
// Return unsubscribe function
|
|
73
121
|
return () => {
|
|
74
122
|
this.subscriptions.get(key)?.delete(callback);
|
|
@@ -82,6 +130,11 @@ export class RealtimeClient {
|
|
|
82
130
|
this.statusCallbacks.add(callback);
|
|
83
131
|
return () => this.statusCallbacks.delete(callback);
|
|
84
132
|
}
|
|
133
|
+
/** Called when the engine ends the socket because its credentials were revoked. */
|
|
134
|
+
onUnauthorized(callback) {
|
|
135
|
+
this.unauthorizedCallbacks.add(callback);
|
|
136
|
+
return () => this.unauthorizedCallbacks.delete(callback);
|
|
137
|
+
}
|
|
85
138
|
sendSubscribe(channel) {
|
|
86
139
|
if (this.ws?.readyState === WebSocket.OPEN) {
|
|
87
140
|
this.ws.send(JSON.stringify({ type: 'subscribe', channel }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ZveltioClient.d.ts","sourceRoot":"","sources":["../../src/client/ZveltioClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EACZ,aAAa,EAGb,cAAc,EACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,qBAAa,aAAa;IACxB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,OAAO,CAAC,MAAM,CAAgB;gBAElB,MAAM,EAAE,aAAa;
|
|
1
|
+
{"version":3,"file":"ZveltioClient.d.ts","sourceRoot":"","sources":["../../src/client/ZveltioClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EACZ,aAAa,EAGb,cAAc,EACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,qBAAa,aAAa;IACxB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,OAAO,CAAC,MAAM,CAAgB;gBAElB,MAAM,EAAE,aAAa;IAajC,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY;IAMhC,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAKpF,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAMxD,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IASjE,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAS7E,OAAO,CAAC,CAAC,GAAG,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAQrE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAO/D,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC;CA4B/D;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CAEjE"}
|
|
@@ -8,7 +8,13 @@ export class ZveltioClient {
|
|
|
8
8
|
constructor(config) {
|
|
9
9
|
this.config = config;
|
|
10
10
|
this.auth = new Auth(config);
|
|
11
|
-
|
|
11
|
+
// The key the HTTP calls send, sent with the upgrade too (server-side
|
|
12
|
+
// clients; a browser authenticates the socket by its session cookie).
|
|
13
|
+
this.realtime = new RealtimeClient(config.baseUrl, {
|
|
14
|
+
headers: config.apiKey ? { 'X-API-Key': config.apiKey } : undefined,
|
|
15
|
+
});
|
|
16
|
+
// A socket closed for revoked credentials is the same event as a 401.
|
|
17
|
+
this.realtime.onUnauthorized(() => config.onUnauthorized?.());
|
|
12
18
|
}
|
|
13
19
|
// Fluent query builder
|
|
14
20
|
from(collection) {
|
package/dist/client.d.ts
CHANGED
|
@@ -3,6 +3,19 @@ export interface ZveltioClientConfig {
|
|
|
3
3
|
apiKey?: string;
|
|
4
4
|
headers?: Record<string, string>;
|
|
5
5
|
}
|
|
6
|
+
/** `GET /api/api-keys/self` — the key a client authenticates with, as the engine holds it. */
|
|
7
|
+
export interface ApiKeySelf {
|
|
8
|
+
id: string;
|
|
9
|
+
name: string;
|
|
10
|
+
key_prefix: string;
|
|
11
|
+
scopes: Array<{
|
|
12
|
+
collection: string;
|
|
13
|
+
actions: string[];
|
|
14
|
+
}>;
|
|
15
|
+
tenant_id: string | null;
|
|
16
|
+
expires_at: string | null;
|
|
17
|
+
rls_bypass: boolean;
|
|
18
|
+
}
|
|
6
19
|
export interface ListParams {
|
|
7
20
|
page?: number;
|
|
8
21
|
limit?: number;
|
|
@@ -72,8 +85,18 @@ export declare class ZveltioClient<Schema extends Record<string, any> = Record<s
|
|
|
72
85
|
readonly signup: (email: string, password: string, name: string) => Promise<any>;
|
|
73
86
|
readonly logout: () => Promise<any>;
|
|
74
87
|
readonly session: () => Promise<any>;
|
|
88
|
+
/**
|
|
89
|
+
* The API key this client was made with: its scopes, tenant, expiry and RLS
|
|
90
|
+
* exemption — never the hash. 403 for a session, 401 for a key that no
|
|
91
|
+
* longer authenticates.
|
|
92
|
+
*/
|
|
93
|
+
readonly apiKey: () => Promise<ApiKeySelf>;
|
|
75
94
|
};
|
|
76
|
-
/**
|
|
95
|
+
/**
|
|
96
|
+
* Storage helpers. A client made with `apiKey` needs a key holding the `$storage`
|
|
97
|
+
* scope — `{ collection: '$storage', actions: ['read', 'create', 'delete'] }`; a
|
|
98
|
+
* `*` collection does not include it, and the engine answers 403 without it.
|
|
99
|
+
*/
|
|
77
100
|
readonly storage: {
|
|
78
101
|
readonly upload: (file: File, folder?: string) => Promise<any>;
|
|
79
102
|
readonly list: (folder?: string) => Promise<any>;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
CHANGED
|
@@ -128,8 +128,18 @@ export class ZveltioClient {
|
|
|
128
128
|
signup: (email, password, name) => this.request('POST', '/api/auth/sign-up/email', { email, password, name }),
|
|
129
129
|
logout: () => this.request('POST', '/api/auth/sign-out'),
|
|
130
130
|
session: () => this.request('GET', '/api/auth/get-session'),
|
|
131
|
+
/**
|
|
132
|
+
* The API key this client was made with: its scopes, tenant, expiry and RLS
|
|
133
|
+
* exemption — never the hash. 403 for a session, 401 for a key that no
|
|
134
|
+
* longer authenticates.
|
|
135
|
+
*/
|
|
136
|
+
apiKey: () => this.request('GET', '/api/api-keys/self'),
|
|
131
137
|
};
|
|
132
|
-
/**
|
|
138
|
+
/**
|
|
139
|
+
* Storage helpers. A client made with `apiKey` needs a key holding the `$storage`
|
|
140
|
+
* scope — `{ collection: '$storage', actions: ['read', 'create', 'delete'] }`; a
|
|
141
|
+
* `*` collection does not include it, and the engine answers 403 without it.
|
|
142
|
+
*/
|
|
133
143
|
storage = {
|
|
134
144
|
upload: (file, folder) => {
|
|
135
145
|
const fd = new FormData();
|
|
@@ -550,23 +550,24 @@ export interface ExtensionInternals<DB = unknown> {
|
|
|
550
550
|
data?: unknown;
|
|
551
551
|
}) => Promise<void>;
|
|
552
552
|
/**
|
|
553
|
-
*
|
|
554
|
-
*
|
|
555
|
-
*
|
|
556
|
-
*
|
|
557
|
-
*
|
|
558
|
-
*
|
|
559
|
-
*
|
|
560
|
-
*
|
|
561
|
-
*
|
|
562
|
-
*
|
|
563
|
-
*
|
|
553
|
+
* Sign in a user your extension has already verified (SSO bridge: LDAP,
|
|
554
|
+
* SAML, OIDC). The session is written by the engine's better-auth — its pool
|
|
555
|
+
* and, with Valkey, its session cache — so `auth.api.getSession` accepts the
|
|
556
|
+
* cookie; `ctx.db` cannot reach the `session` table. Refuses a deactivated
|
|
557
|
+
* user with an error whose `code` is `'account_disabled'`.
|
|
558
|
+
*
|
|
559
|
+
* `db` is your transaction: pass the one that provisioned the user. A user it
|
|
560
|
+
* created gets their session when it commits, and none if it rolls back.
|
|
561
|
+
* `replaceExisting` ends the user's other sessions once this one is written
|
|
562
|
+
* and your request commits. Returns the `Set-Cookie` header value for your
|
|
563
|
+
* Response. Needs `auth:session`.
|
|
564
564
|
*/
|
|
565
565
|
createBetterAuthSession: (db: any, userId: string, opts?: {
|
|
566
566
|
ipAddress?: string;
|
|
567
567
|
userAgent?: string;
|
|
568
568
|
ttlSeconds?: number;
|
|
569
569
|
crossDomain?: boolean;
|
|
570
|
+
replaceExisting?: boolean;
|
|
570
571
|
}) => Promise<{
|
|
571
572
|
token: string;
|
|
572
573
|
setCookie: string;
|
|
@@ -599,6 +600,35 @@ export interface ExtensionInternals<DB = unknown> {
|
|
|
599
600
|
* legacy unencrypted rows still work during a rolling encryption rollout.
|
|
600
601
|
*/
|
|
601
602
|
decryptSecret: (value: string) => Promise<string>;
|
|
603
|
+
/**
|
|
604
|
+
* Delete a user exactly as `DELETE /api/users/:id` does: revoke their
|
|
605
|
+
* sessions (database AND cache), drop their grants, delete the row and audit
|
|
606
|
+
* `user.deleted` with `who`. `db` is the handle the row delete and the audit
|
|
607
|
+
* row run on — pass your transaction so they commit with it. Resolves `false`
|
|
608
|
+
* when there is no such user. Needs the `auth:users` capability.
|
|
609
|
+
*
|
|
610
|
+
* `actorUserId` must be a real user id (the audit column references "user");
|
|
611
|
+
* a non-user actor — a SCIM token, the erased subject — goes in `actor`.
|
|
612
|
+
*/
|
|
613
|
+
deleteUser: (db: unknown, userId: string, who: {
|
|
614
|
+
actorUserId?: string | null;
|
|
615
|
+
actor?: string;
|
|
616
|
+
reason: string;
|
|
617
|
+
metadata?: Record<string, unknown>;
|
|
618
|
+
}) => Promise<boolean>;
|
|
619
|
+
/**
|
|
620
|
+
* End every session a user has, in the database AND the cache — `ctx.db`
|
|
621
|
+
* cannot reach either. Needs the `auth:users` capability.
|
|
622
|
+
*/
|
|
623
|
+
revokeUserSessions: (userId: string) => Promise<void>;
|
|
624
|
+
/**
|
|
625
|
+
* `false` stops the user signing in by ANY method (password, magic link,
|
|
626
|
+
* passkey, OAuth, SSO) and revokes their sessions; `true` lets them back in
|
|
627
|
+
* with the credentials they had. Instance-wide: a user has one sign-in, not
|
|
628
|
+
* one per tenant. `db` is your transaction — pass the one that may already
|
|
629
|
+
* have written the user's row. Needs the `auth:users` capability.
|
|
630
|
+
*/
|
|
631
|
+
setUserActive: (db: unknown, userId: string, active: boolean) => Promise<void>;
|
|
602
632
|
}
|
|
603
633
|
/**
|
|
604
634
|
* Entity-access scope handed to each extension via `ctx.entityAccess`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/extension/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/extension/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { ZveltioClient, createZveltioClient } from './client.js';
|
|
2
|
-
export type { ZveltioClientConfig, ListParams, ListResult } from './client.js';
|
|
2
|
+
export type { ApiKeySelf, ZveltioClientConfig, ListParams, ListResult } from './client.js';
|
|
3
3
|
export { ZveltioApiError, PROBLEM_CONTENT_TYPE } from './errors.js';
|
|
4
4
|
export type { ProblemDetails } from './errors.js';
|
|
5
5
|
export { ZveltioRealtime } from './realtime.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACjE,YAAY,EAAE,mBAAmB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACjE,YAAY,EAAE,UAAU,EAAE,mBAAmB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC3F,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACpE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACnE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/D,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAG1B,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACjE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/realtime.d.ts
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The engine closes a socket with this code when the session or API key it
|
|
3
|
+
* opened with is no longer valid (signed out, revoked, expired, user
|
|
4
|
+
* deactivated). Reconnecting is refused with 401, so clients stop instead.
|
|
5
|
+
*/
|
|
6
|
+
export declare const WS_UNAUTHORIZED = 4001;
|
|
1
7
|
export declare class ZveltioRealtime {
|
|
2
8
|
private ws;
|
|
3
9
|
private listeners;
|
|
@@ -6,6 +12,7 @@ export declare class ZveltioRealtime {
|
|
|
6
12
|
private maxReconnectAttempts;
|
|
7
13
|
private reconnectTimer;
|
|
8
14
|
private headers;
|
|
15
|
+
private unauthorizedCallbacks;
|
|
9
16
|
/**
|
|
10
17
|
* @param options.headers Sent with the upgrade — e.g. `{ 'X-API-Key': key }`
|
|
11
18
|
* for a server-side client. Bun and Node (undici) accept them; a browser
|
|
@@ -17,6 +24,8 @@ export declare class ZveltioRealtime {
|
|
|
17
24
|
connect(): void;
|
|
18
25
|
private attemptReconnect;
|
|
19
26
|
subscribe(collection: string, callback: (data: any) => void): () => void;
|
|
27
|
+
/** Called when the engine ends the socket because its credentials were revoked. */
|
|
28
|
+
onUnauthorized(callback: () => void): () => void;
|
|
20
29
|
disconnect(): void;
|
|
21
30
|
}
|
|
22
31
|
//# sourceMappingURL=realtime.d.ts.map
|
package/dist/realtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../src/realtime.ts"],"names":[],"mappings":"AAAA,qBAAa,eAAe;IAC1B,OAAO,CAAC,EAAE,CAA0B;IAEpC,OAAO,CAAC,SAAS,CAAoD;IACrE,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,oBAAoB,CAAM;IAClC,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,OAAO,CAAqC;
|
|
1
|
+
{"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../src/realtime.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,eAAe,OAAO,CAAC;AAEpC,qBAAa,eAAe;IAC1B,OAAO,CAAC,EAAE,CAA0B;IAEpC,OAAO,CAAC,SAAS,CAAoD;IACrE,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,oBAAoB,CAAM;IAClC,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,qBAAqB,CAAyB;IAEtD;;;;OAIG;gBACS,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAO;IAM/E,OAAO,IAAI,IAAI;IAmDf,OAAO,CAAC,gBAAgB;IASxB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,GAAG,MAAM,IAAI;IAqBxE,mFAAmF;IACnF,cAAc,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAKhD,UAAU,IAAI,IAAI;CAQnB"}
|
package/dist/realtime.js
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The engine closes a socket with this code when the session or API key it
|
|
3
|
+
* opened with is no longer valid (signed out, revoked, expired, user
|
|
4
|
+
* deactivated). Reconnecting is refused with 401, so clients stop instead.
|
|
5
|
+
*/
|
|
6
|
+
export const WS_UNAUTHORIZED = 4001;
|
|
1
7
|
export class ZveltioRealtime {
|
|
2
8
|
ws = null;
|
|
3
9
|
// biome-ignore lint/suspicious/noExplicitAny: legacy any; tracked in hardening plan item H-01
|
|
@@ -7,6 +13,7 @@ export class ZveltioRealtime {
|
|
|
7
13
|
maxReconnectAttempts = 10;
|
|
8
14
|
reconnectTimer = null;
|
|
9
15
|
headers;
|
|
16
|
+
unauthorizedCallbacks = new Set();
|
|
10
17
|
/**
|
|
11
18
|
* @param options.headers Sent with the upgrade — e.g. `{ 'X-API-Key': key }`
|
|
12
19
|
* for a server-side client. Bun and Node (undici) accept them; a browser
|
|
@@ -52,7 +59,13 @@ export class ZveltioRealtime {
|
|
|
52
59
|
/* invalid JSON — ignore */
|
|
53
60
|
}
|
|
54
61
|
};
|
|
55
|
-
this.ws.onclose = () => {
|
|
62
|
+
this.ws.onclose = (event) => {
|
|
63
|
+
if (event?.code === WS_UNAUTHORIZED) {
|
|
64
|
+
// No retry: every attempt would be refused. `connect()` again once the
|
|
65
|
+
// app holds a valid session or key.
|
|
66
|
+
this.unauthorizedCallbacks.forEach((cb) => cb());
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
56
69
|
this.attemptReconnect();
|
|
57
70
|
};
|
|
58
71
|
this.ws.onerror = () => {
|
|
@@ -87,6 +100,11 @@ export class ZveltioRealtime {
|
|
|
87
100
|
}
|
|
88
101
|
};
|
|
89
102
|
}
|
|
103
|
+
/** Called when the engine ends the socket because its credentials were revoked. */
|
|
104
|
+
onUnauthorized(callback) {
|
|
105
|
+
this.unauthorizedCallbacks.add(callback);
|
|
106
|
+
return () => this.unauthorizedCallbacks.delete(callback);
|
|
107
|
+
}
|
|
90
108
|
disconnect() {
|
|
91
109
|
if (this.reconnectTimer)
|
|
92
110
|
clearTimeout(this.reconnectTimer);
|
package/dist/schema-watcher.d.ts
CHANGED
|
@@ -20,8 +20,16 @@ export interface CollectionSchema {
|
|
|
20
20
|
fields: CollectionField[];
|
|
21
21
|
}
|
|
22
22
|
export interface WatchSchemaOptions {
|
|
23
|
-
/**
|
|
23
|
+
/**
|
|
24
|
+
* A root-tenant API key holding the explicit scope
|
|
25
|
+
* `{ collection: '$schema', actions: ['read'] }` — a `*` scope does not include it.
|
|
26
|
+
*/
|
|
24
27
|
apiKey?: string;
|
|
28
|
+
/**
|
|
29
|
+
* Extra headers for the collections fetch and the socket upgrade — e.g. a
|
|
30
|
+
* `cookie` carrying the session of a user who may alter collections.
|
|
31
|
+
*/
|
|
32
|
+
headers?: Record<string, string>;
|
|
25
33
|
/** Reconnect delay in ms (default: 3000) */
|
|
26
34
|
reconnectDelay?: number;
|
|
27
35
|
/** Called after each successful type regeneration */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-watcher.d.ts","sourceRoot":"","sources":["../src/schema-watcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"schema-watcher.d.ts","sourceRoot":"","sources":["../src/schema-watcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,4CAA4C;IAC5C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IACrD,kCAAkC;IAClC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CAChC;AA8GD;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,MAAM,IAAI,CAAC,CA4FrB;AAED,iDAAiD;AACjD,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAKf"}
|
package/dist/schema-watcher.js
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* import { watchSchema } from '@zveltio/sdk';
|
|
10
10
|
* await watchSchema('http://localhost:3000', './src/zveltio-types.d.ts');
|
|
11
11
|
*/
|
|
12
|
+
import { WS_UNAUTHORIZED } from './realtime.js';
|
|
12
13
|
const TYPE_MAP = {
|
|
13
14
|
text: 'string',
|
|
14
15
|
textarea: 'string',
|
|
@@ -81,8 +82,8 @@ function toPascalCase(str) {
|
|
|
81
82
|
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
82
83
|
.join('');
|
|
83
84
|
}
|
|
84
|
-
async function fetchCollections(engineUrl, apiKey) {
|
|
85
|
-
const headers = { 'Content-Type': 'application/json' };
|
|
85
|
+
async function fetchCollections(engineUrl, apiKey, extra) {
|
|
86
|
+
const headers = { 'Content-Type': 'application/json', ...extra };
|
|
86
87
|
if (apiKey)
|
|
87
88
|
headers['Authorization'] = `Bearer ${apiKey}`;
|
|
88
89
|
const res = await fetch(`${engineUrl}/api/collections`, { headers });
|
|
@@ -108,10 +109,10 @@ async function writeTypes(outputPath, content) {
|
|
|
108
109
|
* Returns a cleanup function that closes the WebSocket.
|
|
109
110
|
*/
|
|
110
111
|
export async function watchSchema(engineUrl, outputPath, options = {}) {
|
|
111
|
-
const { apiKey, reconnectDelay = 3000, onUpdate, onError } = options;
|
|
112
|
+
const { apiKey, headers, reconnectDelay = 3000, onUpdate, onError } = options;
|
|
112
113
|
// Generate initial types on startup
|
|
113
114
|
try {
|
|
114
|
-
const collections = await fetchCollections(engineUrl, apiKey);
|
|
115
|
+
const collections = await fetchCollections(engineUrl, apiKey, headers);
|
|
115
116
|
const content = generateTypesFile(collections);
|
|
116
117
|
await writeTypes(outputPath, content);
|
|
117
118
|
console.log(`[zveltio] ✓ Types generated at ${outputPath} (${collections.length} collections)`);
|
|
@@ -128,21 +129,34 @@ export async function watchSchema(engineUrl, outputPath, options = {}) {
|
|
|
128
129
|
function connect() {
|
|
129
130
|
if (stopped)
|
|
130
131
|
return;
|
|
131
|
-
|
|
132
|
+
// The key `fetchCollections` sends, on the upgrade too: without it the
|
|
133
|
+
// engine refuses the socket (401) and the watcher only ever reconnected.
|
|
134
|
+
// The two-argument form is the Bun/undici extension; a browser cannot set it.
|
|
135
|
+
const upgradeHeaders = { ...headers, ...(apiKey ? { 'X-API-Key': apiKey } : {}) };
|
|
136
|
+
ws =
|
|
137
|
+
Object.keys(upgradeHeaders).length > 0
|
|
138
|
+
? new WebSocket(wsUrl, { headers: upgradeHeaders })
|
|
139
|
+
: new WebSocket(wsUrl);
|
|
132
140
|
ws.onopen = () => {
|
|
133
141
|
console.log('[zveltio] Schema watcher connected.');
|
|
134
|
-
//
|
|
135
|
-
|
|
142
|
+
// The engine's schema channel: `$` cannot start a collection name, so it
|
|
143
|
+
// never collides with a collection's record events.
|
|
144
|
+
ws.send(JSON.stringify({ type: 'subscribe', channel: '$schema' }));
|
|
136
145
|
};
|
|
137
146
|
ws.onmessage = async (event) => {
|
|
138
147
|
try {
|
|
139
148
|
const msg = JSON.parse(event.data);
|
|
149
|
+
// The subscribe was refused: this principal may not alter collections.
|
|
150
|
+
if (msg.type === 'error') {
|
|
151
|
+
onError?.(new Error(`Schema watcher: ${msg.message ?? 'subscribe refused'}`));
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
140
154
|
const isSchemaChange = msg.event === 'schema:changed' ||
|
|
141
155
|
msg.type === 'schema:changed' ||
|
|
142
156
|
['create_collection', 'drop_collection', 'add_field', 'drop_field'].includes(msg.event);
|
|
143
157
|
if (!isSchemaChange)
|
|
144
158
|
return;
|
|
145
|
-
const collections = await fetchCollections(engineUrl, apiKey);
|
|
159
|
+
const collections = await fetchCollections(engineUrl, apiKey, headers);
|
|
146
160
|
const content = generateTypesFile(collections);
|
|
147
161
|
await writeTypes(outputPath, content);
|
|
148
162
|
const changed = msg.collection ?? msg.data?.collection ?? '?';
|
|
@@ -153,7 +167,13 @@ export async function watchSchema(engineUrl, outputPath, options = {}) {
|
|
|
153
167
|
// Non-fatal: keep watching
|
|
154
168
|
}
|
|
155
169
|
};
|
|
156
|
-
ws.onclose = () => {
|
|
170
|
+
ws.onclose = (event) => {
|
|
171
|
+
if (!stopped && event?.code === WS_UNAUTHORIZED) {
|
|
172
|
+
// The API key was revoked or expired: every retry would be refused.
|
|
173
|
+
stopped = true;
|
|
174
|
+
onError?.(new Error('Schema watcher stopped: the engine revoked its credentials.'));
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
157
177
|
if (!stopped) {
|
|
158
178
|
console.log(`[zveltio] Schema watcher disconnected. Reconnecting in ${reconnectDelay}ms…`);
|
|
159
179
|
setTimeout(connect, reconnectDelay);
|
|
@@ -27,6 +27,12 @@ describe('ZveltioClient URL building', () => {
|
|
|
27
27
|
'https://engine.test/api/data/products/a%2Fb',
|
|
28
28
|
]);
|
|
29
29
|
});
|
|
30
|
+
it('asks the engine who its key is at the route that answers it', async () => {
|
|
31
|
+
const urls = captureUrls();
|
|
32
|
+
const client = createZveltioClient({ baseUrl: 'https://engine.test', apiKey: 'zvk_x' });
|
|
33
|
+
await client.auth.apiKey();
|
|
34
|
+
expect(urls).toEqual(['https://engine.test/api/api-keys/self']);
|
|
35
|
+
});
|
|
30
36
|
it('encodes the storage folder into the query string', async () => {
|
|
31
37
|
const urls = captureUrls();
|
|
32
38
|
const client = createZveltioClient({ baseUrl: 'https://engine.test' });
|
|
@@ -1,5 +1,10 @@
|
|
|
1
|
-
import { describe, it, expect, afterEach } from 'bun:test';
|
|
1
|
+
import { describe, it, expect, afterEach, jest, spyOn } from 'bun:test';
|
|
2
|
+
import { rm } from 'node:fs/promises';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { RealtimeClient } from '../client/RealtimeClient.js';
|
|
5
|
+
import { ZveltioClient } from '../client/ZveltioClient.js';
|
|
2
6
|
import { ZveltioRealtime } from '../realtime.js';
|
|
7
|
+
import { watchSchema } from '../schema-watcher.js';
|
|
3
8
|
const RealWebSocket = globalThis.WebSocket;
|
|
4
9
|
afterEach(() => {
|
|
5
10
|
globalThis.WebSocket = RealWebSocket;
|
|
@@ -37,3 +42,243 @@ describe('ZveltioRealtime upgrade headers', () => {
|
|
|
37
42
|
rt.disconnect();
|
|
38
43
|
});
|
|
39
44
|
});
|
|
45
|
+
/** Fake sockets that record themselves, so a test can open or close one. */
|
|
46
|
+
function fakeSockets() {
|
|
47
|
+
const made = [];
|
|
48
|
+
globalThis.WebSocket = class {
|
|
49
|
+
static CONNECTING = 0;
|
|
50
|
+
static OPEN = 1;
|
|
51
|
+
readyState = 0;
|
|
52
|
+
sent = [];
|
|
53
|
+
args;
|
|
54
|
+
onopen;
|
|
55
|
+
onclose;
|
|
56
|
+
constructor(...args) {
|
|
57
|
+
this.args = args;
|
|
58
|
+
made.push(this);
|
|
59
|
+
}
|
|
60
|
+
close() { }
|
|
61
|
+
send(p) {
|
|
62
|
+
this.sent.push(p);
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
return made;
|
|
66
|
+
}
|
|
67
|
+
/** Close a fake socket as the runtime does: CLOSED first, then the event. */
|
|
68
|
+
function closeWith(ws, code) {
|
|
69
|
+
ws.readyState = 3;
|
|
70
|
+
ws.onclose?.({ code });
|
|
71
|
+
}
|
|
72
|
+
/** Drive a fake socket to OPEN, as the engine accepting the upgrade would. */
|
|
73
|
+
function accept(ws) {
|
|
74
|
+
ws.readyState = 1;
|
|
75
|
+
ws.onopen?.();
|
|
76
|
+
}
|
|
77
|
+
describe('a socket the engine closed for revoked credentials', () => {
|
|
78
|
+
// The engine closes with 4001 when the session or key is revoked, and every
|
|
79
|
+
// reconnect is then refused with 401 — retrying only hammered the engine.
|
|
80
|
+
afterEach(() => jest.useRealTimers());
|
|
81
|
+
it('ZveltioRealtime stops reconnecting on 4001 and says so', () => {
|
|
82
|
+
jest.useFakeTimers();
|
|
83
|
+
const made = fakeSockets();
|
|
84
|
+
const rt = new ZveltioRealtime('http://engine.test');
|
|
85
|
+
let told = 0;
|
|
86
|
+
rt.onUnauthorized(() => told++);
|
|
87
|
+
rt.connect();
|
|
88
|
+
closeWith(made[0], 4001);
|
|
89
|
+
jest.advanceTimersByTime(60_000);
|
|
90
|
+
expect(made).toHaveLength(1);
|
|
91
|
+
expect(told).toBe(1);
|
|
92
|
+
rt.disconnect();
|
|
93
|
+
});
|
|
94
|
+
it('ZveltioRealtime still reconnects on any other close', () => {
|
|
95
|
+
jest.useFakeTimers();
|
|
96
|
+
const made = fakeSockets();
|
|
97
|
+
const rt = new ZveltioRealtime('http://engine.test');
|
|
98
|
+
let told = 0;
|
|
99
|
+
rt.onUnauthorized(() => told++);
|
|
100
|
+
rt.connect();
|
|
101
|
+
closeWith(made[0], 1006);
|
|
102
|
+
jest.advanceTimersByTime(1_000);
|
|
103
|
+
expect(made).toHaveLength(2);
|
|
104
|
+
expect(told).toBe(0);
|
|
105
|
+
rt.disconnect();
|
|
106
|
+
});
|
|
107
|
+
it('RealtimeClient stops reconnecting on 4001 and says so', () => {
|
|
108
|
+
jest.useFakeTimers();
|
|
109
|
+
const made = fakeSockets();
|
|
110
|
+
const rt = new RealtimeClient('http://engine.test');
|
|
111
|
+
let told = 0;
|
|
112
|
+
rt.onUnauthorized(() => told++);
|
|
113
|
+
rt.connect();
|
|
114
|
+
closeWith(made[0], 4001);
|
|
115
|
+
jest.advanceTimersByTime(60_000);
|
|
116
|
+
expect(made).toHaveLength(1);
|
|
117
|
+
expect(told).toBe(1);
|
|
118
|
+
rt.disconnect();
|
|
119
|
+
});
|
|
120
|
+
it('RealtimeClient still reconnects on any other close', () => {
|
|
121
|
+
jest.useFakeTimers();
|
|
122
|
+
const made = fakeSockets();
|
|
123
|
+
const rt = new RealtimeClient('http://engine.test');
|
|
124
|
+
rt.connect();
|
|
125
|
+
closeWith(made[0], 1006);
|
|
126
|
+
jest.advanceTimersByTime(1_000);
|
|
127
|
+
expect(made).toHaveLength(2);
|
|
128
|
+
rt.disconnect();
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
describe('RealtimeClient after a revocation and while the engine refuses it', () => {
|
|
132
|
+
afterEach(() => jest.useRealTimers());
|
|
133
|
+
it('after 4001, subscribe() only records; an explicit connect() sends it', () => {
|
|
134
|
+
jest.useFakeTimers();
|
|
135
|
+
const made = fakeSockets();
|
|
136
|
+
const rt = new RealtimeClient('http://engine.test');
|
|
137
|
+
rt.connect();
|
|
138
|
+
closeWith(made[0], 4001);
|
|
139
|
+
// It used to dial again here, be refused with 401 (seen as 1006) and back
|
|
140
|
+
// off forever.
|
|
141
|
+
rt.subscribe('orders', '*', () => { });
|
|
142
|
+
jest.advanceTimersByTime(600_000);
|
|
143
|
+
expect(made).toHaveLength(1);
|
|
144
|
+
rt.connect(); // the app re-authenticated
|
|
145
|
+
expect(made).toHaveLength(2);
|
|
146
|
+
accept(made[1]);
|
|
147
|
+
expect(made[1].sent).toEqual([JSON.stringify({ type: 'subscribe', channel: 'orders:*' })]);
|
|
148
|
+
rt.disconnect();
|
|
149
|
+
});
|
|
150
|
+
it('stops after a bounded number of reconnects', () => {
|
|
151
|
+
jest.useFakeTimers();
|
|
152
|
+
const made = fakeSockets();
|
|
153
|
+
const rt = new RealtimeClient('http://engine.test');
|
|
154
|
+
rt.connect();
|
|
155
|
+
// A refused handshake: no runtime shows the 401, only a 1006/1002 close.
|
|
156
|
+
for (let i = 0; i < 20; i++) {
|
|
157
|
+
closeWith(made[made.length - 1], 1006);
|
|
158
|
+
jest.advanceTimersByTime(30_000);
|
|
159
|
+
}
|
|
160
|
+
expect(made).toHaveLength(11); // the first dial and ten retries
|
|
161
|
+
rt.disconnect();
|
|
162
|
+
});
|
|
163
|
+
it('sends its headers with the upgrade', () => {
|
|
164
|
+
const made = fakeSockets();
|
|
165
|
+
const rt = new RealtimeClient('https://engine.test', { headers: { 'X-API-Key': 'zvk_x' } });
|
|
166
|
+
rt.connect();
|
|
167
|
+
expect(made[0].args).toEqual([
|
|
168
|
+
'wss://engine.test/api/ws',
|
|
169
|
+
{ headers: { 'X-API-Key': 'zvk_x' } },
|
|
170
|
+
]);
|
|
171
|
+
rt.disconnect();
|
|
172
|
+
});
|
|
173
|
+
it('ZveltioClient sends its API key on the socket and reports a 4001 as unauthorized', () => {
|
|
174
|
+
const made = fakeSockets();
|
|
175
|
+
let told = 0;
|
|
176
|
+
const client = new ZveltioClient({
|
|
177
|
+
baseUrl: 'https://engine.test',
|
|
178
|
+
apiKey: 'zvk_y',
|
|
179
|
+
onUnauthorized: () => told++,
|
|
180
|
+
});
|
|
181
|
+
client.realtime.connect();
|
|
182
|
+
expect(made[0].args).toEqual([
|
|
183
|
+
'wss://engine.test/api/ws',
|
|
184
|
+
{ headers: { 'X-API-Key': 'zvk_y' } },
|
|
185
|
+
]);
|
|
186
|
+
closeWith(made[0], 4001);
|
|
187
|
+
expect(told).toBe(1);
|
|
188
|
+
client.realtime.disconnect();
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
describe('watchSchema', () => {
|
|
192
|
+
// It dialled the socket with no credentials, so the engine refused every
|
|
193
|
+
// upgrade (401) and the watcher reconnected every few seconds, forever.
|
|
194
|
+
it('sends its API key with the upgrade', async () => {
|
|
195
|
+
let upgradeKey;
|
|
196
|
+
const server = Bun.serve({
|
|
197
|
+
port: 0,
|
|
198
|
+
fetch(req, srv) {
|
|
199
|
+
const url = new URL(req.url);
|
|
200
|
+
if (url.pathname === '/api/collections')
|
|
201
|
+
return Response.json({ collections: [] });
|
|
202
|
+
if (url.pathname === '/api/ws') {
|
|
203
|
+
upgradeKey = req.headers.get('x-api-key');
|
|
204
|
+
if (upgradeKey !== 'zvk_watch')
|
|
205
|
+
return new Response('Unauthorized', { status: 401 });
|
|
206
|
+
return srv.upgrade(req) ? undefined : new Response('no upgrade', { status: 426 });
|
|
207
|
+
}
|
|
208
|
+
return new Response('not found', { status: 404 });
|
|
209
|
+
},
|
|
210
|
+
websocket: { message() { } },
|
|
211
|
+
});
|
|
212
|
+
const out = `${tmpdir()}/zveltio-watch-${Date.now()}.d.ts`;
|
|
213
|
+
const log = spyOn(console, 'log').mockImplementation(() => { });
|
|
214
|
+
const stop = await watchSchema(`http://127.0.0.1:${server.port}`, out, { apiKey: 'zvk_watch' });
|
|
215
|
+
try {
|
|
216
|
+
for (let i = 0; i < 100 && upgradeKey === undefined; i++)
|
|
217
|
+
await Bun.sleep(10);
|
|
218
|
+
expect(upgradeKey).toBe('zvk_watch');
|
|
219
|
+
for (let i = 0; i < 100 && !log.mock.calls.some((c) => String(c[0]).includes('connected')); i++) {
|
|
220
|
+
await Bun.sleep(10);
|
|
221
|
+
}
|
|
222
|
+
expect(log.mock.calls.some((c) => String(c[0]).includes('Schema watcher connected'))).toBe(true);
|
|
223
|
+
}
|
|
224
|
+
finally {
|
|
225
|
+
stop();
|
|
226
|
+
log.mockRestore();
|
|
227
|
+
server.stop(true);
|
|
228
|
+
await rm(out, { force: true });
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
// The engine publishes schema changes on `$schema` as `schema:changed`, to a
|
|
232
|
+
// schema admin's session only — so the watcher must be able to send one.
|
|
233
|
+
it('regenerates on a schema:changed event, and reports a refused subscribe', async () => {
|
|
234
|
+
let upgradeCookie = null;
|
|
235
|
+
const subscribed = [];
|
|
236
|
+
const server = Bun.serve({
|
|
237
|
+
port: 0,
|
|
238
|
+
fetch(req, srv) {
|
|
239
|
+
const url = new URL(req.url);
|
|
240
|
+
if (url.pathname === '/api/collections')
|
|
241
|
+
return Response.json({ collections: [] });
|
|
242
|
+
if (url.pathname === '/api/ws') {
|
|
243
|
+
upgradeCookie = req.headers.get('cookie');
|
|
244
|
+
return srv.upgrade(req) ? undefined : new Response('no upgrade', { status: 426 });
|
|
245
|
+
}
|
|
246
|
+
return new Response('not found', { status: 404 });
|
|
247
|
+
},
|
|
248
|
+
websocket: {
|
|
249
|
+
message(ws, raw) {
|
|
250
|
+
const msg = JSON.parse(String(raw));
|
|
251
|
+
subscribed.push(msg);
|
|
252
|
+
if (msg.channel !== '$schema')
|
|
253
|
+
return;
|
|
254
|
+
ws.send(JSON.stringify({ type: 'subscribed', channel: '$schema' }));
|
|
255
|
+
ws.send(JSON.stringify({ type: 'schema:changed', collection: 'orders', action: 'alter' }));
|
|
256
|
+
ws.send(JSON.stringify({ type: 'error', message: 'No read permission for "$schema"' }));
|
|
257
|
+
},
|
|
258
|
+
},
|
|
259
|
+
});
|
|
260
|
+
const out = `${tmpdir()}/zveltio-watch-evt-${Date.now()}.d.ts`;
|
|
261
|
+
const log = spyOn(console, 'log').mockImplementation(() => { });
|
|
262
|
+
let updates = 0;
|
|
263
|
+
const errors = [];
|
|
264
|
+
const stop = await watchSchema(`http://127.0.0.1:${server.port}`, out, {
|
|
265
|
+
headers: { cookie: 'session=abc' },
|
|
266
|
+
onUpdate: () => updates++,
|
|
267
|
+
onError: (e) => errors.push(e.message),
|
|
268
|
+
});
|
|
269
|
+
try {
|
|
270
|
+
for (let i = 0; i < 200 && (updates < 2 || errors.length === 0); i++)
|
|
271
|
+
await Bun.sleep(10);
|
|
272
|
+
expect(upgradeCookie).toBe('session=abc');
|
|
273
|
+
expect(subscribed).toEqual([{ type: 'subscribe', channel: '$schema' }]);
|
|
274
|
+
expect(updates).toBe(2); // the initial generation, then the event
|
|
275
|
+
expect(errors).toEqual(['Schema watcher: No read permission for "$schema"']);
|
|
276
|
+
}
|
|
277
|
+
finally {
|
|
278
|
+
stop();
|
|
279
|
+
log.mockRestore();
|
|
280
|
+
server.stop(true);
|
|
281
|
+
await rm(out, { force: true });
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validate/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,MAAM,WAAW,eAAe;IAC9B,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,oDAAoD;IACpD,KAAK,EAAE;QACL,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAmDD,MAAM,WAAW,uBAAuB;IACtC,+DAA+D;IAC/D,QAAQ,EAAE,OAAO,CAAC;IAClB,0EAA0E;IAC1E,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,uBAAuB,GAAG,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validate/index.ts"],"names":[],"mappings":"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"}
|
package/dist/validate/index.js
CHANGED
|
@@ -93,6 +93,15 @@ export function validateManifest(input) {
|
|
|
93
93
|
if (typeof obj.zveltioMaxVersion === 'string' && !SEMVER_RE.test(obj.zveltioMaxVersion)) {
|
|
94
94
|
out.push(err('MANIFEST_BAD_MAX_VERSION', `zveltioMaxVersion "${obj.zveltioMaxVersion}" is not valid semver`));
|
|
95
95
|
}
|
|
96
|
+
// The engine's manifest schema refuses the whole extension (422) on a bad entry.
|
|
97
|
+
if (obj.apiKeyRoutes !== undefined) {
|
|
98
|
+
const routes = Array.isArray(obj.apiKeyRoutes) ? obj.apiKeyRoutes : [obj.apiKeyRoutes];
|
|
99
|
+
for (const r of routes) {
|
|
100
|
+
if (typeof r !== 'string' || !/^(GET|POST|PUT|PATCH|DELETE) \S+$/.test(r)) {
|
|
101
|
+
out.push(err('MANIFEST_BAD_API_KEY_ROUTE', `apiKeyRoutes entry ${JSON.stringify(r)} must be "<GET|POST|PUT|PATCH|DELETE> <pattern>"`));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
96
105
|
if (typeof obj.category === 'string' && !KNOWN_CATEGORIES.has(obj.category)) {
|
|
97
106
|
// A true warning — categories are open-ended in practice (e.g. the RO
|
|
98
107
|
// compliance set uses "compliance/ro"). Surfaced so authors notice typos
|