dolphin-server-modules 2.11.0 → 2.11.2
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/TUTORIAL_NEPALI.md +181 -0
- package/dist/adapters/mongoose/index.d.ts +4 -4
- package/dist/adapters/mongoose/index.js.map +1 -1
- package/dist/adapters/mongoose/index.test.d.ts +1 -0
- package/dist/adapters/mongoose/index.test.js +145 -0
- package/dist/adapters/mongoose/index.test.js.map +1 -0
- package/dist/adapters/mongoose/integration.test.d.ts +5 -0
- package/dist/adapters/mongoose/integration.test.js +217 -0
- package/dist/adapters/mongoose/integration.test.js.map +1 -0
- package/dist/ai/dolphin-agent/agent.d.ts +5 -0
- package/dist/ai/dolphin-agent/agent.js +93 -35
- package/dist/ai/dolphin-agent/agent.js.map +1 -1
- package/dist/ai/dolphin-agent/config.js +30 -37
- package/dist/ai/dolphin-agent/config.js.map +1 -1
- package/dist/auth/auth.test.d.ts +1 -0
- package/dist/auth/auth.test.js +286 -0
- package/dist/auth/auth.test.js.map +1 -0
- package/dist/authController/authController.test.d.ts +1 -0
- package/dist/authController/authController.test.js +359 -0
- package/dist/authController/authController.test.js.map +1 -0
- package/dist/bin/cli.js +494 -165
- package/dist/bin/cli.js.map +1 -1
- package/dist/client.test.d.ts +22 -0
- package/dist/client.test.js +573 -0
- package/dist/client.test.js.map +1 -0
- package/dist/controller/controller.test.d.ts +1 -0
- package/dist/controller/controller.test.js +37 -0
- package/dist/controller/controller.test.js.map +1 -0
- package/dist/curd/crud.test.d.ts +1 -0
- package/dist/curd/crud.test.js +104 -0
- package/dist/curd/crud.test.js.map +1 -0
- package/dist/demo-server.d.ts +1 -0
- package/dist/demo-server.js +191 -0
- package/dist/demo-server.js.map +1 -0
- package/dist/djson/djson.test.d.ts +1 -0
- package/dist/djson/djson.test.js +200 -0
- package/dist/djson/djson.test.js.map +1 -0
- package/dist/dolphin-bench.d.ts +1 -0
- package/dist/dolphin-bench.js +63 -0
- package/dist/dolphin-bench.js.map +1 -0
- package/dist/hard-performance-test.d.ts +1 -0
- package/dist/hard-performance-test.js +97 -0
- package/dist/hard-performance-test.js.map +1 -0
- package/dist/middleware/zod.test.d.ts +1 -0
- package/dist/middleware/zod.test.js +74 -0
- package/dist/middleware/zod.test.js.map +1 -0
- package/dist/performance-test.d.ts +1 -0
- package/dist/performance-test.js +92 -0
- package/dist/performance-test.js.map +1 -0
- package/dist/real-test-mongoose.d.ts +1 -0
- package/dist/real-test-mongoose.js +104 -0
- package/dist/real-test-mongoose.js.map +1 -0
- package/dist/realtime/camera.d.ts +119 -0
- package/dist/realtime/camera.js +299 -0
- package/dist/realtime/camera.js.map +1 -0
- package/dist/realtime/camera.test.d.ts +1 -0
- package/dist/realtime/camera.test.js +345 -0
- package/dist/realtime/camera.test.js.map +1 -0
- package/dist/realtime/index.d.ts +2 -0
- package/dist/realtime/index.js +2 -0
- package/dist/realtime/index.js.map +1 -1
- package/dist/realtime/realtime.test.d.ts +1 -0
- package/dist/realtime/realtime.test.js +623 -0
- package/dist/realtime/realtime.test.js.map +1 -0
- package/dist/realtime/rtsp.d.ts +65 -0
- package/dist/realtime/rtsp.js +410 -0
- package/dist/realtime/rtsp.js.map +1 -0
- package/dist/realtime/rtsp.test.d.ts +1 -0
- package/dist/realtime/rtsp.test.js +361 -0
- package/dist/realtime/rtsp.test.js.map +1 -0
- package/dist/router/router.test.d.ts +1 -0
- package/dist/router/router.test.js +45 -0
- package/dist/router/router.test.js.map +1 -0
- package/dist/server/server.test.d.ts +1 -0
- package/dist/server/server.test.js +299 -0
- package/dist/server/server.test.js.map +1 -0
- package/dist/services/ai-service.js +22 -11
- package/dist/services/ai-service.js.map +1 -1
- package/dist/signaling/signaling.test.d.ts +1 -0
- package/dist/signaling/signaling.test.js +112 -0
- package/dist/signaling/signaling.test.js.map +1 -0
- package/dist/swagger/swagger.js +31 -31
- package/dist/swagger/swagger.test.d.ts +1 -0
- package/dist/swagger/swagger.test.js +38 -0
- package/dist/swagger/swagger.test.js.map +1 -0
- package/dist/templates/index.d.ts +6 -0
- package/dist/templates/index.js +282 -105
- package/dist/templates/index.js.map +1 -1
- package/dist/test-2fa-real.d.ts +1 -0
- package/dist/test-2fa-real.js +105 -0
- package/dist/test-2fa-real.js.map +1 -0
- package/dist/test-dolphin.d.ts +1 -0
- package/dist/test-dolphin.js +98 -0
- package/dist/test-dolphin.js.map +1 -0
- package/dist/utils/ctx.d.ts +50 -0
- package/dist/utils/ctx.js +82 -0
- package/dist/utils/ctx.js.map +1 -0
- package/package.json +155 -45
- package/scripts/client.js +838 -0
- package/scripts/dolphin-persist.js +211 -0
|
@@ -0,0 +1,573 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* client.test.ts — DolphinClient को लागि Jest unit tests
|
|
4
|
+
*
|
|
5
|
+
* Test गरिएका कुराहरू:
|
|
6
|
+
* - DolphinClient constructor + URL parsing
|
|
7
|
+
* - setToken / storage
|
|
8
|
+
* - APIHandler (proxy path building, request, timeout, 401 auto-refresh)
|
|
9
|
+
* - AuthHandler (login, logout, refresh, 2FA)
|
|
10
|
+
* - _matchTopic (MQTT wildcards)
|
|
11
|
+
* - pub/sub (subscribe / unsubscribe / publish / offline queue)
|
|
12
|
+
* - pubFile (chunked file upload)
|
|
13
|
+
* - _uint8ToBase64
|
|
14
|
+
* - DolphinStore (collection, where, orderBy, remote update)
|
|
15
|
+
* - disconnect
|
|
16
|
+
*/
|
|
17
|
+
// Custom jest-esm-strip-transform.cjs ले automatically ESM export line strip गर्छ
|
|
18
|
+
// त्यसैले सिधै client.js import गर्न मिल्छ — client.cjs manually बनाउनु पर्दैन
|
|
19
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
20
|
+
const { DolphinClient } = require('../scripts/client.js');
|
|
21
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
22
|
+
/** Build a fake WebSocket that triggers onopen immediately */
|
|
23
|
+
function makeFakeWS(overrides = {}) {
|
|
24
|
+
const ws = {
|
|
25
|
+
readyState: 1 /* OPEN */,
|
|
26
|
+
sent: [],
|
|
27
|
+
send(msg) { this.sent.push(msg); },
|
|
28
|
+
close() { if (this.onclose)
|
|
29
|
+
this.onclose(); },
|
|
30
|
+
onopen: null,
|
|
31
|
+
onmessage: null,
|
|
32
|
+
onclose: null,
|
|
33
|
+
onerror: null,
|
|
34
|
+
...overrides,
|
|
35
|
+
};
|
|
36
|
+
return ws;
|
|
37
|
+
}
|
|
38
|
+
/** Inject a fake WebSocket constructor into global scope */
|
|
39
|
+
function injectFakeWS(ws) {
|
|
40
|
+
global.WebSocket = class {
|
|
41
|
+
static OPEN = 1;
|
|
42
|
+
readyState = ws.readyState;
|
|
43
|
+
sent = ws.sent;
|
|
44
|
+
send = ws.send.bind(ws);
|
|
45
|
+
close = ws.close.bind(ws);
|
|
46
|
+
set onopen(v) { ws.onopen = v; }
|
|
47
|
+
get onopen() { return ws.onopen; }
|
|
48
|
+
set onmessage(v) { ws.onmessage = v; }
|
|
49
|
+
get onmessage() { return ws.onmessage; }
|
|
50
|
+
set onclose(v) { ws.onclose = v; }
|
|
51
|
+
get onclose() { return ws.onclose; }
|
|
52
|
+
set onerror(v) { ws.onerror = v; }
|
|
53
|
+
get onerror() { return ws.onerror; }
|
|
54
|
+
constructor() { setTimeout(() => ws.onopen && ws.onopen(), 0); }
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/** Build a fake fetch that resolves with the given body */
|
|
58
|
+
function makeFetch(status, body, contentType = 'application/json') {
|
|
59
|
+
return jest.fn().mockResolvedValue({
|
|
60
|
+
ok: status >= 200 && status < 300,
|
|
61
|
+
status,
|
|
62
|
+
headers: { get: () => contentType },
|
|
63
|
+
json: async () => body,
|
|
64
|
+
text: async () => JSON.stringify(body),
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
68
|
+
// 1. Constructor + URL parsing
|
|
69
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
70
|
+
describe('DolphinClient — constructor', () => {
|
|
71
|
+
test('http:// URL parse गर्छ', () => {
|
|
72
|
+
const c = new DolphinClient('http://localhost:3000');
|
|
73
|
+
expect(c.httpUrl).toBe('http://localhost:3000');
|
|
74
|
+
expect(c.host).toBe('localhost:3000');
|
|
75
|
+
});
|
|
76
|
+
test('https:// URL parse गर्छ', () => {
|
|
77
|
+
const c = new DolphinClient('https://example.com');
|
|
78
|
+
expect(c.httpUrl).toBe('https://example.com');
|
|
79
|
+
});
|
|
80
|
+
test('trailing slash हटाउँछ', () => {
|
|
81
|
+
const c = new DolphinClient('http://localhost:3000/');
|
|
82
|
+
expect(c.host).toBe('localhost:3000');
|
|
83
|
+
});
|
|
84
|
+
test('default options सेट हुन्छन्', () => {
|
|
85
|
+
const c = new DolphinClient('http://localhost:3000');
|
|
86
|
+
expect(c.options.timeout).toBe(15000);
|
|
87
|
+
expect(c.options.chunkSize).toBe(65536);
|
|
88
|
+
expect(c.options.maxReconnect).toBe(5);
|
|
89
|
+
expect(c.options.autoRefreshToken).toBe(true);
|
|
90
|
+
});
|
|
91
|
+
test('custom options override हुन्छन्', () => {
|
|
92
|
+
const c = new DolphinClient('http://localhost:3000', 'dev1', { timeout: 5000, maxReconnect: 2 });
|
|
93
|
+
expect(c.options.timeout).toBe(5000);
|
|
94
|
+
expect(c.options.maxReconnect).toBe(2);
|
|
95
|
+
});
|
|
96
|
+
test('deviceId custom सेट हुन्छ', () => {
|
|
97
|
+
const c = new DolphinClient('http://localhost:3000', 'myDevice');
|
|
98
|
+
expect(c.deviceId).toBe('myDevice');
|
|
99
|
+
});
|
|
100
|
+
test('deviceId auto-generate हुन्छ जब दिइँदैन', () => {
|
|
101
|
+
const c = new DolphinClient('http://localhost:3000');
|
|
102
|
+
expect(c.deviceId).toMatch(/^web_/);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
106
|
+
// 2. setToken
|
|
107
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
108
|
+
describe('DolphinClient — setToken', () => {
|
|
109
|
+
let c;
|
|
110
|
+
let store;
|
|
111
|
+
beforeEach(() => {
|
|
112
|
+
store = {};
|
|
113
|
+
c = new DolphinClient('http://localhost:3000');
|
|
114
|
+
c.storage = {
|
|
115
|
+
getItem: (k) => store[k] ?? null,
|
|
116
|
+
setItem: (k, v) => { store[k] = v; },
|
|
117
|
+
removeItem: (k) => { delete store[k]; },
|
|
118
|
+
};
|
|
119
|
+
});
|
|
120
|
+
test('token set र storage मा save गर्छ', () => {
|
|
121
|
+
c.setToken('abc123');
|
|
122
|
+
expect(c.accessToken).toBe('abc123');
|
|
123
|
+
expect(store['dolphin_token']).toBe('abc123');
|
|
124
|
+
});
|
|
125
|
+
test('null दिँदा token clear हुन्छ', () => {
|
|
126
|
+
c.setToken('abc123');
|
|
127
|
+
c.setToken(null);
|
|
128
|
+
expect(c.accessToken).toBeNull();
|
|
129
|
+
expect(store['dolphin_token']).toBeUndefined();
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
133
|
+
// 3. APIHandler — proxy path building
|
|
134
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
135
|
+
describe('APIHandler — proxy paths', () => {
|
|
136
|
+
let c;
|
|
137
|
+
beforeEach(() => {
|
|
138
|
+
c = new DolphinClient('http://localhost:3000');
|
|
139
|
+
global.fetch = makeFetch(200, { ok: true });
|
|
140
|
+
});
|
|
141
|
+
afterEach(() => { delete global.fetch; });
|
|
142
|
+
test('api.users.get() → /users मा GET request', async () => {
|
|
143
|
+
await c.api.users.get();
|
|
144
|
+
const url = global.fetch.mock.calls[0][0];
|
|
145
|
+
expect(url).toBe('http://localhost:3000/users');
|
|
146
|
+
});
|
|
147
|
+
test('api.users.posts.get() → /users/posts', async () => {
|
|
148
|
+
await c.api.users.posts.get();
|
|
149
|
+
const url = global.fetch.mock.calls[0][0];
|
|
150
|
+
expect(url).toBe('http://localhost:3000/users/posts');
|
|
151
|
+
});
|
|
152
|
+
test('api.users.post(body) → POST /users', async () => {
|
|
153
|
+
await c.api.users.post({ name: 'Ram' });
|
|
154
|
+
const [url, opts] = global.fetch.mock.calls[0];
|
|
155
|
+
expect(url).toBe('http://localhost:3000/users');
|
|
156
|
+
expect(opts.method).toBe('POST');
|
|
157
|
+
expect(JSON.parse(opts.body)).toEqual({ name: 'Ram' });
|
|
158
|
+
});
|
|
159
|
+
test('api.users.del() → DELETE /users', async () => {
|
|
160
|
+
await c.api.users.del();
|
|
161
|
+
const [, opts] = global.fetch.mock.calls[0];
|
|
162
|
+
expect(opts.method).toBe('DELETE');
|
|
163
|
+
});
|
|
164
|
+
test('Authorization header token हुँदा लाग्छ', async () => {
|
|
165
|
+
c.setToken('tok99');
|
|
166
|
+
await c.api.me.get();
|
|
167
|
+
const [, opts] = global.fetch.mock.calls[0];
|
|
168
|
+
expect(opts.headers['Authorization']).toBe('Bearer tok99');
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
172
|
+
// 4. APIHandler — request timeout
|
|
173
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
174
|
+
describe('APIHandler — timeout', () => {
|
|
175
|
+
test('AbortError → 408 थ्रो गर्छ', async () => {
|
|
176
|
+
const c = new DolphinClient('http://localhost:3000', '', { timeout: 100 });
|
|
177
|
+
global.fetch = jest.fn().mockRejectedValue(Object.assign(new Error('abort'), { name: 'AbortError' }));
|
|
178
|
+
await expect(c.api.request('GET', '/slow', null)).rejects.toMatchObject({ status: 408 });
|
|
179
|
+
delete global.fetch;
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
183
|
+
// 5. APIHandler — 401 auto-refresh
|
|
184
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
185
|
+
describe('APIHandler — 401 auto-refresh', () => {
|
|
186
|
+
test('401 मा token refresh गरेर retry गर्छ', async () => {
|
|
187
|
+
const c = new DolphinClient('http://localhost:3000');
|
|
188
|
+
let callCount = 0;
|
|
189
|
+
global.fetch = jest.fn().mockImplementation(() => {
|
|
190
|
+
callCount++;
|
|
191
|
+
if (callCount === 1) {
|
|
192
|
+
// First call → 401
|
|
193
|
+
return Promise.resolve({
|
|
194
|
+
ok: false, status: 401,
|
|
195
|
+
headers: { get: () => 'application/json' },
|
|
196
|
+
json: async () => ({ error: 'Unauthorized' }),
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
if (callCount === 2) {
|
|
200
|
+
// Refresh call → new token
|
|
201
|
+
return Promise.resolve({
|
|
202
|
+
ok: true, status: 200,
|
|
203
|
+
headers: { get: () => 'application/json' },
|
|
204
|
+
json: async () => ({ accessToken: 'newTok' }),
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
// Retry call → success
|
|
208
|
+
return Promise.resolve({
|
|
209
|
+
ok: true, status: 200,
|
|
210
|
+
headers: { get: () => 'application/json' },
|
|
211
|
+
json: async () => ({ data: 'ok' }),
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
const res = await c.api.request('GET', '/protected');
|
|
215
|
+
expect(res).toEqual({ data: 'ok' });
|
|
216
|
+
expect(c.accessToken).toBe('newTok');
|
|
217
|
+
delete global.fetch;
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
221
|
+
// 6. AuthHandler
|
|
222
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
223
|
+
describe('AuthHandler', () => {
|
|
224
|
+
let c;
|
|
225
|
+
beforeEach(() => {
|
|
226
|
+
c = new DolphinClient('http://localhost:3000');
|
|
227
|
+
});
|
|
228
|
+
afterEach(() => { delete global.fetch; });
|
|
229
|
+
test('login — token र user set गर्छ', async () => {
|
|
230
|
+
global.fetch = makeFetch(200, { accessToken: 'tok1', user: { id: 1, email: 'a@b.com' } });
|
|
231
|
+
await c.auth.login('a@b.com', 'pass');
|
|
232
|
+
expect(c.accessToken).toBe('tok1');
|
|
233
|
+
expect(c.auth.user).toEqual({ id: 1, email: 'a@b.com' });
|
|
234
|
+
});
|
|
235
|
+
test('logout — token clear गर्छ', async () => {
|
|
236
|
+
global.fetch = makeFetch(200, {});
|
|
237
|
+
c.setToken('tok1');
|
|
238
|
+
await c.auth.logout();
|
|
239
|
+
expect(c.accessToken).toBeNull();
|
|
240
|
+
expect(c.auth.user).toBeNull();
|
|
241
|
+
});
|
|
242
|
+
test('register — POST /auth/register', async () => {
|
|
243
|
+
global.fetch = makeFetch(200, { success: true });
|
|
244
|
+
await c.auth.register({ email: 'new@b.com', password: '123456' });
|
|
245
|
+
const [url, opts] = global.fetch.mock.calls[0];
|
|
246
|
+
expect(url).toContain('/auth/register');
|
|
247
|
+
expect(opts.method).toBe('POST');
|
|
248
|
+
});
|
|
249
|
+
test('me — user update गर्छ', async () => {
|
|
250
|
+
global.fetch = makeFetch(200, { success: true, data: { id: 2 } });
|
|
251
|
+
await c.auth.me();
|
|
252
|
+
expect(c.auth.user).toEqual({ id: 2 });
|
|
253
|
+
});
|
|
254
|
+
test('verify2FA — token set गर्छ', async () => {
|
|
255
|
+
global.fetch = makeFetch(200, { accessToken: 'tok2fa', user: { id: 3 } });
|
|
256
|
+
c.auth.user = { email: 'x@y.com' };
|
|
257
|
+
await c.auth.verify2FA('123456');
|
|
258
|
+
expect(c.accessToken).toBe('tok2fa');
|
|
259
|
+
expect(c.auth.user).toEqual({ id: 3 });
|
|
260
|
+
});
|
|
261
|
+
test('forgotPassword — POST /auth/forgot-password', async () => {
|
|
262
|
+
global.fetch = makeFetch(200, { success: true });
|
|
263
|
+
await c.auth.forgotPassword('test@example.com');
|
|
264
|
+
const [url] = global.fetch.mock.calls[0];
|
|
265
|
+
expect(url).toContain('/auth/forgot-password');
|
|
266
|
+
});
|
|
267
|
+
test('resetPassword — POST /auth/reset-password', async () => {
|
|
268
|
+
global.fetch = makeFetch(200, { success: true });
|
|
269
|
+
await c.auth.resetPassword('reset-tok', 'newPass');
|
|
270
|
+
const [url, opts] = global.fetch.mock.calls[0];
|
|
271
|
+
expect(url).toContain('/auth/reset-password');
|
|
272
|
+
expect(JSON.parse(opts.body)).toEqual({ token: 'reset-tok', newPassword: 'newPass' });
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
276
|
+
// 7. _matchTopic — MQTT wildcard matching
|
|
277
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
278
|
+
describe('_matchTopic — MQTT wildcards', () => {
|
|
279
|
+
let c;
|
|
280
|
+
beforeAll(() => { c = new DolphinClient('http://localhost:3000'); });
|
|
281
|
+
const cases = [
|
|
282
|
+
['sensor/temp', 'sensor/temp', true],
|
|
283
|
+
['sensor/+', 'sensor/temp', true],
|
|
284
|
+
['sensor/+', 'sensor/humid', true],
|
|
285
|
+
['sensor/+', 'sensor/a/b', false],
|
|
286
|
+
['#', 'anything/deep/path', true],
|
|
287
|
+
['sensor/#', 'sensor/a/b/c', true],
|
|
288
|
+
['sensor/#', 'other/topic', false],
|
|
289
|
+
['a/b/c', 'a/b/d', false],
|
|
290
|
+
['a/b', 'a/b/c', false],
|
|
291
|
+
];
|
|
292
|
+
test.each(cases)('pattern="%s" topic="%s" → %s', (pattern, topic, expected) => {
|
|
293
|
+
expect(c._matchTopic(pattern, topic)).toBe(expected);
|
|
294
|
+
});
|
|
295
|
+
});
|
|
296
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
297
|
+
// 8. Pub/Sub — subscribe / unsubscribe / publish
|
|
298
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
299
|
+
describe('Pub/Sub', () => {
|
|
300
|
+
let c;
|
|
301
|
+
let ws;
|
|
302
|
+
beforeEach(() => {
|
|
303
|
+
ws = makeFakeWS();
|
|
304
|
+
injectFakeWS(ws);
|
|
305
|
+
c = new DolphinClient('http://localhost:3000');
|
|
306
|
+
});
|
|
307
|
+
afterEach(() => { delete global.WebSocket; });
|
|
308
|
+
test('subscribe — handler register हुन्छ', () => {
|
|
309
|
+
const cb = jest.fn();
|
|
310
|
+
c.subscribe('news', cb);
|
|
311
|
+
expect(c.handlers.has('news')).toBe(true);
|
|
312
|
+
});
|
|
313
|
+
test('subscribe — WS मा sub message पठाउँछ (जब connected)', async () => {
|
|
314
|
+
await c.connect();
|
|
315
|
+
const cb = jest.fn();
|
|
316
|
+
c.subscribe('chat', cb);
|
|
317
|
+
const subMsg = ws.sent.find((s) => {
|
|
318
|
+
try {
|
|
319
|
+
return JSON.parse(s).type === 'sub';
|
|
320
|
+
}
|
|
321
|
+
catch {
|
|
322
|
+
return false;
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
expect(subMsg).toBeDefined();
|
|
326
|
+
});
|
|
327
|
+
test('unsubscribe — handler हटाउँछ', () => {
|
|
328
|
+
const cb = jest.fn();
|
|
329
|
+
c.subscribe('room', cb);
|
|
330
|
+
c.unsubscribe('room', cb);
|
|
331
|
+
expect(c.handlers.has('room')).toBe(false);
|
|
332
|
+
});
|
|
333
|
+
test('publish — WS मा message पठाउँछ', async () => {
|
|
334
|
+
await c.connect();
|
|
335
|
+
c.publish('topic1', { hello: 'world' });
|
|
336
|
+
const pub = ws.sent.find((s) => {
|
|
337
|
+
try {
|
|
338
|
+
const p = JSON.parse(s);
|
|
339
|
+
return p.topic === 'topic1';
|
|
340
|
+
}
|
|
341
|
+
catch {
|
|
342
|
+
return false;
|
|
343
|
+
}
|
|
344
|
+
});
|
|
345
|
+
expect(pub).toBeDefined();
|
|
346
|
+
expect(JSON.parse(pub).payload).toEqual({ hello: 'world' });
|
|
347
|
+
});
|
|
348
|
+
test('_handleMessage — topic callback fire हुन्छ', () => {
|
|
349
|
+
const cb = jest.fn();
|
|
350
|
+
c.subscribe('data/sensor', cb);
|
|
351
|
+
c._handleMessage(JSON.stringify({ topic: 'data/sensor', payload: { v: 42 } }));
|
|
352
|
+
expect(cb).toHaveBeenCalledWith({ v: 42 }, 'data/sensor');
|
|
353
|
+
});
|
|
354
|
+
test('+ wildcard — matching topic मा callback fire हुन्छ', () => {
|
|
355
|
+
const cb = jest.fn();
|
|
356
|
+
c.subscribe('data/+', cb);
|
|
357
|
+
c._handleMessage(JSON.stringify({ topic: 'data/temp', payload: 25 }));
|
|
358
|
+
expect(cb).toHaveBeenCalledWith(25, 'data/temp');
|
|
359
|
+
});
|
|
360
|
+
test('# wildcard — सबै subtopic मा callback fire हुन्छ', () => {
|
|
361
|
+
const cb = jest.fn();
|
|
362
|
+
c.subscribe('data/#', cb);
|
|
363
|
+
c._handleMessage(JSON.stringify({ topic: 'data/a/b/c', payload: 99 }));
|
|
364
|
+
expect(cb).toHaveBeenCalledWith(99, 'data/a/b/c');
|
|
365
|
+
});
|
|
366
|
+
});
|
|
367
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
368
|
+
// 9. Offline queue
|
|
369
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
370
|
+
describe('Offline queue', () => {
|
|
371
|
+
test('socket नभएको बेला message queue मा जान्छ', () => {
|
|
372
|
+
const c = new DolphinClient('http://localhost:3000');
|
|
373
|
+
c.socket = null;
|
|
374
|
+
c.publish('topic', { x: 1 });
|
|
375
|
+
expect(c._offlineQueue.length).toBe(1);
|
|
376
|
+
});
|
|
377
|
+
test('connect भएपछि queue flush हुन्छ', async () => {
|
|
378
|
+
const ws = makeFakeWS();
|
|
379
|
+
injectFakeWS(ws);
|
|
380
|
+
const c = new DolphinClient('http://localhost:3000');
|
|
381
|
+
c._offlineQueue.push(JSON.stringify({ topic: 'q', payload: 'hi' }));
|
|
382
|
+
await c.connect();
|
|
383
|
+
expect(c._offlineQueue.length).toBe(0);
|
|
384
|
+
delete global.WebSocket;
|
|
385
|
+
});
|
|
386
|
+
test('100 भन्दा बढी queue हुँदैन', () => {
|
|
387
|
+
const c = new DolphinClient('http://localhost:3000');
|
|
388
|
+
c.socket = null;
|
|
389
|
+
for (let i = 0; i < 150; i++)
|
|
390
|
+
c.publish('t', i);
|
|
391
|
+
expect(c._offlineQueue.length).toBe(100);
|
|
392
|
+
});
|
|
393
|
+
});
|
|
394
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
395
|
+
// 10. pubFile — chunked file upload
|
|
396
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
397
|
+
describe('pubFile — chunked upload', () => {
|
|
398
|
+
let c;
|
|
399
|
+
let ws;
|
|
400
|
+
beforeEach(async () => {
|
|
401
|
+
ws = makeFakeWS();
|
|
402
|
+
injectFakeWS(ws);
|
|
403
|
+
c = new DolphinClient('http://localhost:3000', '', { chunkSize: 4 });
|
|
404
|
+
await c.connect();
|
|
405
|
+
});
|
|
406
|
+
afterEach(() => { delete global.WebSocket; });
|
|
407
|
+
test('FILE_UPLOAD_START + CHUNK + DONE messages पठाउँछ', async () => {
|
|
408
|
+
const data = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]); // 8 bytes → 2 chunks of 4
|
|
409
|
+
await c.pubFile('file1', data, 'test.bin');
|
|
410
|
+
const msgs = ws.sent.map((s) => JSON.parse(s));
|
|
411
|
+
const start = msgs.find((m) => m.type === 'FILE_UPLOAD_START');
|
|
412
|
+
const chunks = msgs.filter((m) => m.type === 'FILE_UPLOAD_CHUNK');
|
|
413
|
+
const done = msgs.find((m) => m.type === 'FILE_UPLOAD_DONE');
|
|
414
|
+
expect(start).toBeDefined();
|
|
415
|
+
expect(start.fileId).toBe('file1');
|
|
416
|
+
expect(start.totalChunks).toBe(2);
|
|
417
|
+
expect(chunks).toHaveLength(2);
|
|
418
|
+
expect(done).toBeDefined();
|
|
419
|
+
});
|
|
420
|
+
test('onProgress callback सही percent call हुन्छ', async () => {
|
|
421
|
+
const data = new Uint8Array([1, 2, 3, 4]);
|
|
422
|
+
const progress = [];
|
|
423
|
+
await c.pubFile('file2', data, 'tiny.bin', (p) => progress.push(p));
|
|
424
|
+
expect(progress).toContain(100);
|
|
425
|
+
});
|
|
426
|
+
});
|
|
427
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
428
|
+
// 11. _uint8ToBase64
|
|
429
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
430
|
+
describe('_uint8ToBase64', () => {
|
|
431
|
+
let c;
|
|
432
|
+
beforeAll(() => { c = new DolphinClient('http://localhost:3000'); });
|
|
433
|
+
test('empty array → empty string', () => {
|
|
434
|
+
expect(c._uint8ToBase64(new Uint8Array([]))).toBe('');
|
|
435
|
+
});
|
|
436
|
+
test('known bytes → correct base64', () => {
|
|
437
|
+
// [72, 101, 108, 108, 111] = "Hello"
|
|
438
|
+
const result = c._uint8ToBase64(new Uint8Array([72, 101, 108, 108, 111]));
|
|
439
|
+
expect(result).toBe('SGVsbG8=');
|
|
440
|
+
});
|
|
441
|
+
});
|
|
442
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
443
|
+
// 12. Signaling handlers
|
|
444
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
445
|
+
describe('Signaling handlers', () => {
|
|
446
|
+
let c;
|
|
447
|
+
beforeEach(() => {
|
|
448
|
+
c = new DolphinClient('http://localhost:3000', 'deviceA');
|
|
449
|
+
});
|
|
450
|
+
test('onSignal — handler register र fire हुन्छ', () => {
|
|
451
|
+
const handler = jest.fn();
|
|
452
|
+
c.onSignal(handler);
|
|
453
|
+
c._handleMessage(JSON.stringify({
|
|
454
|
+
msgId: 'm1', type: 'offer', from: 'deviceB', to: 'deviceA', data: {}, timestamp: Date.now()
|
|
455
|
+
}));
|
|
456
|
+
expect(handler).toHaveBeenCalled();
|
|
457
|
+
});
|
|
458
|
+
test('offSignal — handler हटाइन्छ', () => {
|
|
459
|
+
const handler = jest.fn();
|
|
460
|
+
c.onSignal(handler);
|
|
461
|
+
c.offSignal(handler);
|
|
462
|
+
c._handleMessage(JSON.stringify({
|
|
463
|
+
msgId: 'm2', type: 'offer', from: 'deviceB', to: 'deviceA', data: {}, timestamp: Date.now()
|
|
464
|
+
}));
|
|
465
|
+
expect(handler).not.toHaveBeenCalled();
|
|
466
|
+
});
|
|
467
|
+
test('onFileAvailable — handler register हुन्छ', () => {
|
|
468
|
+
const handler = jest.fn();
|
|
469
|
+
c.onFileAvailable(handler);
|
|
470
|
+
c._handleMessage(JSON.stringify({ type: 'FILE_AVAILABLE', fileId: 'f1', name: 'img.png', size: 1024, totalChunks: 1, chunkSize: 65536 }));
|
|
471
|
+
expect(handler).toHaveBeenCalled();
|
|
472
|
+
});
|
|
473
|
+
});
|
|
474
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
475
|
+
// 13. DolphinStore — collection management
|
|
476
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
477
|
+
describe('DolphinStore', () => {
|
|
478
|
+
let c;
|
|
479
|
+
beforeEach(() => {
|
|
480
|
+
c = new DolphinClient('http://localhost:3000');
|
|
481
|
+
// Stub fetch to return empty list (store does HTTP GET)
|
|
482
|
+
global.fetch = makeFetch(200, []);
|
|
483
|
+
});
|
|
484
|
+
afterEach(() => { delete global.fetch; });
|
|
485
|
+
test('store.users access → collection object return गर्छ', () => {
|
|
486
|
+
const col = c.store.users;
|
|
487
|
+
expect(col).toBeDefined();
|
|
488
|
+
expect(col.loading).toBe(true);
|
|
489
|
+
expect(col.items).toEqual([]);
|
|
490
|
+
});
|
|
491
|
+
test('getSnapshot — default state return गर्छ जब collection छैन', () => {
|
|
492
|
+
const snap = c.store.getSnapshot('nonexistent');
|
|
493
|
+
expect(snap).toEqual({ items: [], loading: false, error: null, success: false });
|
|
494
|
+
});
|
|
495
|
+
test('subscribe listener — notify हुन्छ', async () => {
|
|
496
|
+
const listener = jest.fn();
|
|
497
|
+
const unsub = c.store.subscribe(listener);
|
|
498
|
+
// Trigger a remote update manually
|
|
499
|
+
c.store.data.set('items', { _rawItems: [{ id: 1 }], items: [], loading: false, success: true, error: null, _filter: null, _sort: null });
|
|
500
|
+
c.store._applyTransform(c.store.data.get('items'));
|
|
501
|
+
expect(listener).toHaveBeenCalled();
|
|
502
|
+
unsub();
|
|
503
|
+
});
|
|
504
|
+
test('_handleRemoteUpdate — create: item थपिन्छ', () => {
|
|
505
|
+
c.store.data.set('posts', {
|
|
506
|
+
_rawItems: [{ _id: 'a', title: 'First' }],
|
|
507
|
+
items: [], loading: false, success: true, error: null, _filter: null, _sort: null,
|
|
508
|
+
});
|
|
509
|
+
c.store._handleRemoteUpdate('posts', { type: 'create', data: { _id: 'b', title: 'Second' } });
|
|
510
|
+
const col = c.store.data.get('posts');
|
|
511
|
+
expect(col._rawItems).toHaveLength(2);
|
|
512
|
+
});
|
|
513
|
+
test('_handleRemoteUpdate — update: item update हुन्छ', () => {
|
|
514
|
+
c.store.data.set('posts', {
|
|
515
|
+
_rawItems: [{ _id: 'a', title: 'Old' }],
|
|
516
|
+
items: [], loading: false, success: true, error: null, _filter: null, _sort: null,
|
|
517
|
+
});
|
|
518
|
+
c.store._handleRemoteUpdate('posts', { type: 'update', data: { _id: 'a', title: 'New' } });
|
|
519
|
+
expect(c.store.data.get('posts')._rawItems[0].title).toBe('New');
|
|
520
|
+
});
|
|
521
|
+
test('_handleRemoteUpdate — delete: item हटाइन्छ', () => {
|
|
522
|
+
c.store.data.set('posts', {
|
|
523
|
+
_rawItems: [{ _id: 'a' }, { _id: 'b' }],
|
|
524
|
+
items: [], loading: false, success: true, error: null, _filter: null, _sort: null,
|
|
525
|
+
});
|
|
526
|
+
c.store._handleRemoteUpdate('posts', { type: 'delete', data: { _id: 'a' } });
|
|
527
|
+
expect(c.store.data.get('posts')._rawItems).toHaveLength(1);
|
|
528
|
+
});
|
|
529
|
+
test('where filter लाग्छ', () => {
|
|
530
|
+
const col = {
|
|
531
|
+
_rawItems: [{ id: 1, active: true }, { id: 2, active: false }],
|
|
532
|
+
items: [], loading: false, success: true, error: null, _filter: null, _sort: null,
|
|
533
|
+
where: (fn) => { col._filter = fn; c.store._applyTransform(col); return col; },
|
|
534
|
+
orderBy: () => col,
|
|
535
|
+
reset: () => col,
|
|
536
|
+
};
|
|
537
|
+
c.store.data.set('filter_test', col);
|
|
538
|
+
col.where((item) => item.active);
|
|
539
|
+
expect(col.items).toHaveLength(1);
|
|
540
|
+
expect(col.items[0].id).toBe(1);
|
|
541
|
+
});
|
|
542
|
+
test('orderBy sort लाग्छ', () => {
|
|
543
|
+
const col = {
|
|
544
|
+
_rawItems: [{ id: 2 }, { id: 1 }, { id: 3 }],
|
|
545
|
+
items: [], loading: false, success: true, error: null, _filter: null, _sort: null,
|
|
546
|
+
where: () => col,
|
|
547
|
+
orderBy: (key, dir = 'asc') => {
|
|
548
|
+
col._sort = { key, direction: dir };
|
|
549
|
+
c.store._applyTransform(col);
|
|
550
|
+
return col;
|
|
551
|
+
},
|
|
552
|
+
reset: () => col,
|
|
553
|
+
};
|
|
554
|
+
c.store.data.set('sort_test', col);
|
|
555
|
+
col.orderBy('id', 'asc');
|
|
556
|
+
expect(col.items.map((i) => i.id)).toEqual([1, 2, 3]);
|
|
557
|
+
});
|
|
558
|
+
});
|
|
559
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
560
|
+
// 14. disconnect
|
|
561
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
562
|
+
describe('disconnect', () => {
|
|
563
|
+
test('socket null गर्छ र auto-reconnect हुँदैन', async () => {
|
|
564
|
+
const ws = makeFakeWS();
|
|
565
|
+
injectFakeWS(ws);
|
|
566
|
+
const c = new DolphinClient('http://localhost:3000');
|
|
567
|
+
await c.connect();
|
|
568
|
+
c.disconnect();
|
|
569
|
+
expect(c.socket).toBeNull();
|
|
570
|
+
delete global.WebSocket;
|
|
571
|
+
});
|
|
572
|
+
});
|
|
573
|
+
//# sourceMappingURL=client.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.test.js","sourceRoot":"","sources":["../src/client.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|