@aerostack/sdk-node 0.8.3 → 0.8.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/commonjs/__tests__/realtime.test.d.ts +2 -0
- package/dist/commonjs/__tests__/realtime.test.d.ts.map +1 -0
- package/dist/commonjs/__tests__/realtime.test.js +364 -0
- package/dist/commonjs/__tests__/realtime.test.js.map +1 -0
- package/dist/commonjs/__tests__/sdk.test.d.ts +2 -0
- package/dist/commonjs/__tests__/sdk.test.d.ts.map +1 -0
- package/dist/commonjs/__tests__/sdk.test.js +356 -0
- package/dist/commonjs/__tests__/sdk.test.js.map +1 -0
- package/dist/commonjs/_generated/runtime.d.ts.map +1 -1
- package/dist/commonjs/_generated/runtime.js +1 -1
- package/dist/commonjs/_generated/runtime.js.map +1 -1
- package/dist/commonjs/realtime.d.ts +2 -0
- package/dist/commonjs/realtime.d.ts.map +1 -1
- package/dist/commonjs/realtime.js +19 -5
- package/dist/commonjs/realtime.js.map +1 -1
- package/dist/commonjs/sdk.js +1 -1
- package/dist/commonjs/sdk.js.map +1 -1
- package/dist/esm/__tests__/realtime.test.d.ts +2 -0
- package/dist/esm/__tests__/realtime.test.d.ts.map +1 -0
- package/dist/esm/__tests__/realtime.test.js +362 -0
- package/dist/esm/__tests__/realtime.test.js.map +1 -0
- package/dist/esm/__tests__/sdk.test.d.ts +2 -0
- package/dist/esm/__tests__/sdk.test.d.ts.map +1 -0
- package/dist/esm/__tests__/sdk.test.js +354 -0
- package/dist/esm/__tests__/sdk.test.js.map +1 -0
- package/dist/esm/_generated/runtime.d.ts.map +1 -1
- package/dist/esm/_generated/runtime.js +1 -1
- package/dist/esm/_generated/runtime.js.map +1 -1
- package/dist/esm/realtime.d.ts +2 -0
- package/dist/esm/realtime.d.ts.map +1 -1
- package/dist/esm/realtime.js +19 -5
- package/dist/esm/realtime.js.map +1 -1
- package/dist/esm/sdk.js +1 -1
- package/dist/esm/sdk.js.map +1 -1
- package/examples/e2e/__tests__/e2e.test.ts +118 -0
- package/examples/e2e/package.json +15 -0
- package/examples/e2e/vitest.config.ts +8 -0
- package/package.json +2 -2
- package/src/__tests__/realtime.test.ts +430 -0
- package/src/__tests__/sdk.test.ts +412 -0
- package/src/_generated/runtime.ts +1 -1
- package/src/realtime.ts +17 -3
- package/src/sdk.ts +1 -1
package/dist/esm/sdk.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../src/sdk.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../src/sdk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node SDK E2E Tests
|
|
3
|
+
*
|
|
4
|
+
* Verifies SDK initialization, facade methods, and streaming.
|
|
5
|
+
* Imports from source since tshy build may not be available.
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
8
|
+
|
|
9
|
+
// Mock the generated SDK APIs that the Node SDK depends on
|
|
10
|
+
vi.mock('../../../src/generated/api.js', () => {
|
|
11
|
+
const makeApi = () => ({
|
|
12
|
+
_serverURL: '',
|
|
13
|
+
_client: { _baseURL: '' },
|
|
14
|
+
listProducts: vi.fn(),
|
|
15
|
+
createProduct: vi.fn(),
|
|
16
|
+
});
|
|
17
|
+
return {
|
|
18
|
+
Auth: vi.fn().mockImplementation(() => makeApi()),
|
|
19
|
+
Ai: vi.fn().mockImplementation(() => makeApi()),
|
|
20
|
+
Database: vi.fn().mockImplementation(() => makeApi()),
|
|
21
|
+
Storage: vi.fn().mockImplementation(() => makeApi()),
|
|
22
|
+
Queue: vi.fn().mockImplementation(() => makeApi()),
|
|
23
|
+
Services: vi.fn().mockImplementation(() => makeApi()),
|
|
24
|
+
Cache: vi.fn().mockImplementation(() => ({
|
|
25
|
+
...makeApi(),
|
|
26
|
+
cacheGet: vi.fn().mockResolvedValue({ result: '{}' }),
|
|
27
|
+
cacheSet: vi.fn().mockResolvedValue({}),
|
|
28
|
+
cacheDelete: vi.fn().mockResolvedValue({}),
|
|
29
|
+
cacheClear: vi.fn().mockResolvedValue({}),
|
|
30
|
+
cacheList: vi.fn().mockResolvedValue({ result: '[]' }),
|
|
31
|
+
cacheHas: vi.fn().mockResolvedValue({ result: 'true' }),
|
|
32
|
+
cacheIncrement: vi.fn().mockResolvedValue({ result: '1' }),
|
|
33
|
+
cacheDecrement: vi.fn().mockResolvedValue({ result: '0' }),
|
|
34
|
+
cacheTtl: vi.fn().mockResolvedValue({ result: '3600' }),
|
|
35
|
+
cacheExpire: vi.fn().mockResolvedValue({}),
|
|
36
|
+
cachePersist: vi.fn().mockResolvedValue({}),
|
|
37
|
+
cacheSetAdd: vi.fn().mockResolvedValue({}),
|
|
38
|
+
})),
|
|
39
|
+
SDKConfig: vi.fn().mockImplementation(() => ({
|
|
40
|
+
_serverURL: '',
|
|
41
|
+
_client: { _baseURL: '' },
|
|
42
|
+
})),
|
|
43
|
+
};
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
vi.mock('../../../src/generated/models/operations/index.js', () => ({}));
|
|
47
|
+
|
|
48
|
+
const { SDK, Aerostack, createClient } = await import('../../../src/sdk');
|
|
49
|
+
const { NodeRealtimeClient } = await import('../../../src/realtime');
|
|
50
|
+
|
|
51
|
+
describe('Node SDK E2E', () => {
|
|
52
|
+
describe('SDK initialization', () => {
|
|
53
|
+
it('should create SDK instance with default options', () => {
|
|
54
|
+
const sdk = new SDK();
|
|
55
|
+
expect(sdk).toBeDefined();
|
|
56
|
+
expect(sdk.database).toBeDefined();
|
|
57
|
+
expect(sdk.auth).toBeDefined();
|
|
58
|
+
expect(sdk.cache).toBeDefined();
|
|
59
|
+
expect(sdk.queue).toBeDefined();
|
|
60
|
+
expect(sdk.storage).toBeDefined();
|
|
61
|
+
expect(sdk.ai).toBeDefined();
|
|
62
|
+
expect(sdk.services).toBeDefined();
|
|
63
|
+
expect(sdk.gateway).toBeDefined();
|
|
64
|
+
expect(sdk.realtime).toBeDefined();
|
|
65
|
+
expect(sdk.rpc).toBeDefined();
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('should create SDK with api key and custom server', () => {
|
|
69
|
+
const sdk = new SDK({
|
|
70
|
+
apiKey: 'ac_secret_test_key',
|
|
71
|
+
serverUrl: 'https://custom.api.com/v1',
|
|
72
|
+
projectId: 'proj-test',
|
|
73
|
+
});
|
|
74
|
+
expect(sdk).toBeDefined();
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it('should support backward-compat aliases', () => {
|
|
78
|
+
const sdk = new SDK({
|
|
79
|
+
apiKeyAuth: 'ac_secret_test_key',
|
|
80
|
+
serverURL: 'https://custom.api.com/v1',
|
|
81
|
+
});
|
|
82
|
+
expect(sdk).toBeDefined();
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it('should export Aerostack as deprecated alias', () => {
|
|
86
|
+
expect(Aerostack).toBe(SDK);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('should export createClient factory', () => {
|
|
90
|
+
const sdk = createClient({ apiKey: 'key' });
|
|
91
|
+
expect(sdk).toBeInstanceOf(SDK);
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
describe('setApiKey', () => {
|
|
96
|
+
it('should update API key and recreate services', () => {
|
|
97
|
+
const sdk = new SDK({ apiKey: 'old-key' });
|
|
98
|
+
sdk.setApiKey('new-key');
|
|
99
|
+
expect(sdk.auth).toBeDefined();
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
describe('NodeRealtimeClient export', () => {
|
|
104
|
+
it('should export NodeRealtimeClient', () => {
|
|
105
|
+
expect(NodeRealtimeClient).toBeDefined();
|
|
106
|
+
expect(typeof NodeRealtimeClient).toBe('function');
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it('should create realtime client', () => {
|
|
110
|
+
const client = new NodeRealtimeClient({
|
|
111
|
+
serverUrl: 'https://api.test.com/v1',
|
|
112
|
+
projectId: 'proj-1',
|
|
113
|
+
});
|
|
114
|
+
expect(client.status).toBe('idle');
|
|
115
|
+
expect(client.connected).toBe(false);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@aerostack/node-e2e",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"test": "vitest run"
|
|
8
|
+
},
|
|
9
|
+
"dependencies": {
|
|
10
|
+
"@aerostack/sdk-node": "file:../../"
|
|
11
|
+
},
|
|
12
|
+
"devDependencies": {
|
|
13
|
+
"vitest": "^1.0.0"
|
|
14
|
+
}
|
|
15
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aerostack/sdk-node",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.5",
|
|
4
4
|
"author": "Aerostack",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"tshy": {
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"ws": "^8.19.0"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@aerostack/core": "^0.8.
|
|
34
|
+
"@aerostack/core": "^0.8.5",
|
|
35
35
|
"zod": "^3.25.0 || ^4.0.0"
|
|
36
36
|
},
|
|
37
37
|
"exports": {
|
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { NodeRealtimeClient, RealtimeSubscription } from '../realtime.js';
|
|
3
|
+
|
|
4
|
+
// ─── Mock WebSocket ───────────────────────────────────────────
|
|
5
|
+
|
|
6
|
+
class MockWebSocket {
|
|
7
|
+
static OPEN = 1;
|
|
8
|
+
static CLOSED = 3;
|
|
9
|
+
|
|
10
|
+
url: string;
|
|
11
|
+
readyState = MockWebSocket.OPEN;
|
|
12
|
+
onopen: (() => void) | null = null;
|
|
13
|
+
onmessage: ((event: any) => void) | null = null;
|
|
14
|
+
onclose: (() => void) | null = null;
|
|
15
|
+
onerror: ((err: any) => void) | null = null;
|
|
16
|
+
sent: any[] = [];
|
|
17
|
+
|
|
18
|
+
constructor(url: string) {
|
|
19
|
+
this.url = url;
|
|
20
|
+
setTimeout(() => this.onopen?.(), 0);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
send(data: string) {
|
|
24
|
+
this.sent.push(JSON.parse(data));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
close() {
|
|
28
|
+
this.readyState = MockWebSocket.CLOSED;
|
|
29
|
+
setTimeout(() => this.onclose?.(), 0);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
beforeEach(() => {
|
|
34
|
+
vi.stubGlobal('WebSocket', MockWebSocket);
|
|
35
|
+
vi.stubGlobal('fetch', vi.fn());
|
|
36
|
+
vi.useFakeTimers();
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
afterEach(() => {
|
|
40
|
+
vi.restoreAllMocks();
|
|
41
|
+
vi.useRealTimers();
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
// ─── RealtimeSubscription ─────────────────────────────────────
|
|
45
|
+
|
|
46
|
+
describe('RealtimeSubscription', () => {
|
|
47
|
+
function createSub() {
|
|
48
|
+
const client = new NodeRealtimeClient({
|
|
49
|
+
serverUrl: 'https://api.test.com/v1',
|
|
50
|
+
projectId: 'proj-1',
|
|
51
|
+
});
|
|
52
|
+
const sub = client.channel('users');
|
|
53
|
+
return { client, sub };
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
it('should register and fire callbacks', () => {
|
|
57
|
+
const { sub } = createSub();
|
|
58
|
+
const cb = vi.fn();
|
|
59
|
+
sub.on('INSERT', cb);
|
|
60
|
+
|
|
61
|
+
sub._emit({
|
|
62
|
+
type: 'db_change',
|
|
63
|
+
topic: sub.topic,
|
|
64
|
+
operation: 'INSERT',
|
|
65
|
+
data: { id: 1 },
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
expect(cb).toHaveBeenCalledOnce();
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it('should support wildcard listener', () => {
|
|
72
|
+
const { sub } = createSub();
|
|
73
|
+
const cb = vi.fn();
|
|
74
|
+
sub.on('*', cb);
|
|
75
|
+
|
|
76
|
+
sub._emit({
|
|
77
|
+
type: 'db_change',
|
|
78
|
+
topic: sub.topic,
|
|
79
|
+
operation: 'DELETE',
|
|
80
|
+
data: { id: 1 },
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
expect(cb).toHaveBeenCalledOnce();
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it('should support custom event names', () => {
|
|
87
|
+
const { sub } = createSub();
|
|
88
|
+
const cb = vi.fn();
|
|
89
|
+
sub.on('player-moved', cb);
|
|
90
|
+
|
|
91
|
+
sub._emit({
|
|
92
|
+
type: 'event',
|
|
93
|
+
topic: sub.topic,
|
|
94
|
+
event: 'player-moved',
|
|
95
|
+
data: { x: 10 },
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
expect(cb).toHaveBeenCalledOnce();
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it('should remove callbacks with off()', () => {
|
|
102
|
+
const { sub } = createSub();
|
|
103
|
+
const cb = vi.fn();
|
|
104
|
+
sub.on('INSERT', cb);
|
|
105
|
+
sub.off('INSERT', cb);
|
|
106
|
+
|
|
107
|
+
sub._emit({
|
|
108
|
+
type: 'db_change',
|
|
109
|
+
topic: sub.topic,
|
|
110
|
+
operation: 'INSERT',
|
|
111
|
+
data: {},
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
expect(cb).not.toHaveBeenCalled();
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
it('should be chainable', () => {
|
|
118
|
+
const { sub } = createSub();
|
|
119
|
+
const result = sub.on('INSERT', vi.fn()).on('UPDATE', vi.fn());
|
|
120
|
+
expect(result).toBe(sub);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it('should track isSubscribed state', () => {
|
|
124
|
+
const { sub } = createSub();
|
|
125
|
+
expect(sub.isSubscribed).toBe(false);
|
|
126
|
+
sub.subscribe();
|
|
127
|
+
expect(sub.isSubscribed).toBe(true);
|
|
128
|
+
sub.unsubscribe();
|
|
129
|
+
expect(sub.isSubscribed).toBe(false);
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it('should not send duplicate subscribe', () => {
|
|
133
|
+
const { sub } = createSub();
|
|
134
|
+
sub.subscribe();
|
|
135
|
+
sub.subscribe(); // Should be no-op
|
|
136
|
+
expect(sub.isSubscribed).toBe(true);
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
it('should clear callbacks on unsubscribe', () => {
|
|
140
|
+
const { sub } = createSub();
|
|
141
|
+
const cb = vi.fn();
|
|
142
|
+
sub.on('INSERT', cb);
|
|
143
|
+
sub.subscribe();
|
|
144
|
+
sub.unsubscribe();
|
|
145
|
+
|
|
146
|
+
sub._emit({
|
|
147
|
+
type: 'db_change',
|
|
148
|
+
topic: sub.topic,
|
|
149
|
+
operation: 'INSERT',
|
|
150
|
+
data: {},
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
expect(cb).not.toHaveBeenCalled();
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
it('should publish events', () => {
|
|
157
|
+
const { sub } = createSub();
|
|
158
|
+
sub.publish('custom-event', { key: 'value' }, { persist: true });
|
|
159
|
+
// Should not throw
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it('should track presence', () => {
|
|
163
|
+
const { sub } = createSub();
|
|
164
|
+
sub.track({ online: true });
|
|
165
|
+
sub.untrack();
|
|
166
|
+
// Should not throw
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it('should fetch history', async () => {
|
|
170
|
+
const mockFetch = vi.fn().mockResolvedValue({
|
|
171
|
+
json: async () => ({ messages: [{ id: '1' }] }),
|
|
172
|
+
});
|
|
173
|
+
vi.stubGlobal('fetch', mockFetch);
|
|
174
|
+
|
|
175
|
+
const { sub } = createSub();
|
|
176
|
+
const history = await sub.getHistory(10);
|
|
177
|
+
expect(history).toEqual([{ id: '1' }]);
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
// ─── NodeRealtimeClient ───────────────────────────────────────
|
|
182
|
+
|
|
183
|
+
describe('NodeRealtimeClient', () => {
|
|
184
|
+
describe('constructor', () => {
|
|
185
|
+
it('should convert https to wss URL', () => {
|
|
186
|
+
const client = new NodeRealtimeClient({
|
|
187
|
+
serverUrl: 'https://api.test.com/v1',
|
|
188
|
+
projectId: 'proj-1',
|
|
189
|
+
});
|
|
190
|
+
expect(client.status).toBe('idle');
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
it('should start as idle', () => {
|
|
194
|
+
const client = new NodeRealtimeClient({
|
|
195
|
+
serverUrl: 'https://api.test.com/v1',
|
|
196
|
+
projectId: 'proj-1',
|
|
197
|
+
});
|
|
198
|
+
expect(client.status).toBe('idle');
|
|
199
|
+
expect(client.connected).toBe(false);
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
describe('connect', () => {
|
|
204
|
+
it('should connect and set status to connected', async () => {
|
|
205
|
+
const client = new NodeRealtimeClient({
|
|
206
|
+
serverUrl: 'https://api.test.com/v1',
|
|
207
|
+
projectId: 'proj-1',
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
const connectPromise = client.connect();
|
|
211
|
+
await vi.advanceTimersByTimeAsync(10);
|
|
212
|
+
await connectPromise;
|
|
213
|
+
|
|
214
|
+
expect(client.status).toBe('connected');
|
|
215
|
+
expect(client.connected).toBe(true);
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
it('should pass apiKey in URL query params', async () => {
|
|
219
|
+
const client = new NodeRealtimeClient({
|
|
220
|
+
serverUrl: 'https://api.test.com/v1',
|
|
221
|
+
projectId: 'proj-1',
|
|
222
|
+
apiKey: 'my-key',
|
|
223
|
+
token: 'my-token',
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
const connectPromise = client.connect();
|
|
227
|
+
await vi.advanceTimersByTimeAsync(10);
|
|
228
|
+
await connectPromise;
|
|
229
|
+
|
|
230
|
+
expect(client.status).toBe('connected');
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
it('should not create duplicate connections', async () => {
|
|
234
|
+
const client = new NodeRealtimeClient({
|
|
235
|
+
serverUrl: 'https://api.test.com/v1',
|
|
236
|
+
projectId: 'proj-1',
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
const p1 = client.connect();
|
|
240
|
+
const p2 = client.connect();
|
|
241
|
+
await vi.advanceTimersByTimeAsync(10);
|
|
242
|
+
await Promise.all([p1, p2]);
|
|
243
|
+
|
|
244
|
+
expect(client.status).toBe('connected');
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
describe('disconnect', () => {
|
|
249
|
+
it('should disconnect and set status', async () => {
|
|
250
|
+
const client = new NodeRealtimeClient({
|
|
251
|
+
serverUrl: 'https://api.test.com/v1',
|
|
252
|
+
projectId: 'proj-1',
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
const connectPromise = client.connect();
|
|
256
|
+
await vi.advanceTimersByTimeAsync(10);
|
|
257
|
+
await connectPromise;
|
|
258
|
+
|
|
259
|
+
client.disconnect();
|
|
260
|
+
expect(client.status).toBe('disconnected');
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
it('should be safe when not connected', () => {
|
|
264
|
+
const client = new NodeRealtimeClient({
|
|
265
|
+
serverUrl: 'https://api.test.com/v1',
|
|
266
|
+
projectId: 'proj-1',
|
|
267
|
+
});
|
|
268
|
+
client.disconnect();
|
|
269
|
+
expect(client.status).toBe('disconnected');
|
|
270
|
+
});
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
describe('channel', () => {
|
|
274
|
+
it('should qualify topic with projectId', () => {
|
|
275
|
+
const client = new NodeRealtimeClient({
|
|
276
|
+
serverUrl: 'https://api.test.com/v1',
|
|
277
|
+
projectId: 'proj-1',
|
|
278
|
+
});
|
|
279
|
+
const sub = client.channel('users');
|
|
280
|
+
expect(sub.topic).toBe('table/users/proj-1');
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
it('should append projectId to topic with path', () => {
|
|
284
|
+
const client = new NodeRealtimeClient({
|
|
285
|
+
serverUrl: 'https://api.test.com/v1',
|
|
286
|
+
projectId: 'proj-1',
|
|
287
|
+
});
|
|
288
|
+
const sub = client.channel('table/orders');
|
|
289
|
+
expect(sub.topic).toBe('table/orders/proj-1');
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
it('should not double-qualify topics', () => {
|
|
293
|
+
const client = new NodeRealtimeClient({
|
|
294
|
+
serverUrl: 'https://api.test.com/v1',
|
|
295
|
+
projectId: 'proj-1',
|
|
296
|
+
});
|
|
297
|
+
const sub = client.channel('table/users/proj-1');
|
|
298
|
+
expect(sub.topic).toBe('table/users/proj-1');
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
it('should reuse subscriptions for same topic', () => {
|
|
302
|
+
const client = new NodeRealtimeClient({
|
|
303
|
+
serverUrl: 'https://api.test.com/v1',
|
|
304
|
+
projectId: 'proj-1',
|
|
305
|
+
});
|
|
306
|
+
const sub1 = client.channel('users');
|
|
307
|
+
const sub2 = client.channel('users');
|
|
308
|
+
expect(sub1).toBe(sub2);
|
|
309
|
+
});
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
describe('status listeners', () => {
|
|
313
|
+
it('should notify status change listeners', async () => {
|
|
314
|
+
const client = new NodeRealtimeClient({
|
|
315
|
+
serverUrl: 'https://api.test.com/v1',
|
|
316
|
+
projectId: 'proj-1',
|
|
317
|
+
});
|
|
318
|
+
const statuses: string[] = [];
|
|
319
|
+
client.onStatusChange((s: string) => statuses.push(s));
|
|
320
|
+
|
|
321
|
+
const connectPromise = client.connect();
|
|
322
|
+
await vi.advanceTimersByTimeAsync(10);
|
|
323
|
+
await connectPromise;
|
|
324
|
+
|
|
325
|
+
expect(statuses).toContain('connecting');
|
|
326
|
+
expect(statuses).toContain('connected');
|
|
327
|
+
});
|
|
328
|
+
|
|
329
|
+
it('should allow unsubscribing', () => {
|
|
330
|
+
const client = new NodeRealtimeClient({
|
|
331
|
+
serverUrl: 'https://api.test.com/v1',
|
|
332
|
+
projectId: 'proj-1',
|
|
333
|
+
});
|
|
334
|
+
const cb = vi.fn();
|
|
335
|
+
const unsub = client.onStatusChange(cb);
|
|
336
|
+
unsub();
|
|
337
|
+
client.disconnect();
|
|
338
|
+
expect(cb).not.toHaveBeenCalled();
|
|
339
|
+
});
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
describe('setToken', () => {
|
|
343
|
+
it('should send auth message', async () => {
|
|
344
|
+
const client = new NodeRealtimeClient({
|
|
345
|
+
serverUrl: 'https://api.test.com/v1',
|
|
346
|
+
projectId: 'proj-1',
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
const connectPromise = client.connect();
|
|
350
|
+
await vi.advanceTimersByTimeAsync(10);
|
|
351
|
+
await connectPromise;
|
|
352
|
+
|
|
353
|
+
client.setToken('new-token');
|
|
354
|
+
});
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
describe('sendChat', () => {
|
|
358
|
+
it('should send chat message', () => {
|
|
359
|
+
const client = new NodeRealtimeClient({
|
|
360
|
+
serverUrl: 'https://api.test.com/v1',
|
|
361
|
+
projectId: 'proj-1',
|
|
362
|
+
});
|
|
363
|
+
client.sendChat('room-1', 'Hello!');
|
|
364
|
+
// Message queued since not connected
|
|
365
|
+
});
|
|
366
|
+
});
|
|
367
|
+
|
|
368
|
+
describe('_generateId', () => {
|
|
369
|
+
it('should return unique strings', () => {
|
|
370
|
+
const client = new NodeRealtimeClient({
|
|
371
|
+
serverUrl: 'https://api.test.com/v1',
|
|
372
|
+
projectId: 'proj-1',
|
|
373
|
+
});
|
|
374
|
+
const ids = new Set(Array.from({ length: 50 }, () => client._generateId()));
|
|
375
|
+
expect(ids.size).toBe(50);
|
|
376
|
+
});
|
|
377
|
+
});
|
|
378
|
+
|
|
379
|
+
describe('_fetchHistory', () => {
|
|
380
|
+
it('should fetch from REST API with auth headers', async () => {
|
|
381
|
+
const mockFetch = vi.fn().mockResolvedValue({
|
|
382
|
+
json: async () => ({ messages: [{ id: '1' }] }),
|
|
383
|
+
});
|
|
384
|
+
vi.stubGlobal('fetch', mockFetch);
|
|
385
|
+
|
|
386
|
+
const client = new NodeRealtimeClient({
|
|
387
|
+
serverUrl: 'https://api.test.com/v1',
|
|
388
|
+
projectId: 'proj-1',
|
|
389
|
+
apiKey: 'my-key',
|
|
390
|
+
token: 'my-token',
|
|
391
|
+
});
|
|
392
|
+
|
|
393
|
+
const result = await client._fetchHistory('room/test', 25, 9999);
|
|
394
|
+
expect(result).toEqual([{ id: '1' }]);
|
|
395
|
+
|
|
396
|
+
const url = new URL(mockFetch.mock.calls[0][0]);
|
|
397
|
+
expect(url.pathname).toBe('/api/v1/public/realtime/history');
|
|
398
|
+
expect(url.searchParams.get('room')).toBe('room/test');
|
|
399
|
+
expect(url.searchParams.get('limit')).toBe('25');
|
|
400
|
+
expect(url.searchParams.get('before')).toBe('9999');
|
|
401
|
+
|
|
402
|
+
const headers = mockFetch.mock.calls[0][1].headers;
|
|
403
|
+
expect(headers['X-Aerostack-Key']).toBe('my-key');
|
|
404
|
+
expect(headers['Authorization']).toBe('Bearer my-token');
|
|
405
|
+
});
|
|
406
|
+
});
|
|
407
|
+
|
|
408
|
+
describe('maxReconnectAttempts', () => {
|
|
409
|
+
it('should accept maxReconnectAttempts option', () => {
|
|
410
|
+
const client = new NodeRealtimeClient({
|
|
411
|
+
serverUrl: 'https://api.test.com/v1',
|
|
412
|
+
projectId: 'proj-1',
|
|
413
|
+
maxReconnectAttempts: 3,
|
|
414
|
+
});
|
|
415
|
+
expect(client.status).toBe('idle');
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
it('should allow onMaxRetriesExceeded listener', () => {
|
|
419
|
+
const client = new NodeRealtimeClient({
|
|
420
|
+
serverUrl: 'https://api.test.com/v1',
|
|
421
|
+
projectId: 'proj-1',
|
|
422
|
+
maxReconnectAttempts: 0,
|
|
423
|
+
});
|
|
424
|
+
const cb = vi.fn();
|
|
425
|
+
const unsub = client.onMaxRetriesExceeded(cb);
|
|
426
|
+
expect(typeof unsub).toBe('function');
|
|
427
|
+
unsub();
|
|
428
|
+
});
|
|
429
|
+
});
|
|
430
|
+
});
|