dolphin-server-modules 2.0.0 → 2.2.1
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/DOLPHIN_MASTER_GUIDE_NEPALI.md +7 -2
- package/README.md +16 -4
- package/dist/server/server.js +6 -1
- package/dist/server/server.js.map +1 -1
- package/package.json +1 -1
- package/scripts/client.js +125 -30
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Dolphin Framework: Absolute Master Guide (100+ Pages Equivalent) 🐬🇳🇵
|
|
2
|
-
Latest Version: v2.
|
|
2
|
+
Latest Version: v2.2.0 | Updated: 2026-04-09 | License: MIT
|
|
3
3
|
|
|
4
4
|
यो डकुमेन्ट Dolphin Framework को आधिकारिक र विस्तृत गाइड हो। यसले तपाईँलाई एउटा साधारण कोड लेख्ने डेभलपरबाट "Framework Master" बनाउन मद्दत गर्नेछ।
|
|
5
5
|
|
|
@@ -885,7 +885,12 @@ function Dashboard() {
|
|
|
885
885
|
// १. सर्भरसँग कनेक्ट गर्ने
|
|
886
886
|
await dolphin.connect();
|
|
887
887
|
|
|
888
|
-
// २.
|
|
888
|
+
// २. API Proxy प्रयोग गर्ने (New v2.2)
|
|
889
|
+
// dolphin.api.products() -> GET /products
|
|
890
|
+
const products = await dolphin.api.products();
|
|
891
|
+
await dolphin.api.call.get(); // Handles keywords correctly!
|
|
892
|
+
|
|
893
|
+
// ३. High-Frequency Data प्राप्त गर्ने
|
|
889
894
|
dolphin.subscribe('sensors/temperature', (data) => {
|
|
890
895
|
setTemp(data.value);
|
|
891
896
|
});
|
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# 🐬 Dolphin Framework (v2.
|
|
1
|
+
# 🐬 Dolphin Framework (v2.2.0)
|
|
2
2
|
|
|
3
3
|
**Dolphin** is a 2026-ready, ultra-lightweight, and 100% modular backend ecosystem built on native Node.js. It's not just a framework; it's a universal toolkit for Web, Microservices, and Industrial IoT.
|
|
4
4
|
|
|
@@ -60,9 +60,21 @@ Dolphin now serves its own client-side library. Just include a script tag and yo
|
|
|
60
60
|
// 1. Auth & Token Management
|
|
61
61
|
await dolphin.auth.login("admin@test.com", "password123");
|
|
62
62
|
|
|
63
|
-
//
|
|
63
|
+
// 2. API with Dynamic Proxy (New in v2.2)
|
|
64
|
+
const products = await dolphin.api.products();
|
|
65
|
+
const profile = await dolphin.api.users.profile();
|
|
66
|
+
await dolphin.api.products.post({ name: "Dolphin" });
|
|
67
|
+
await dolphin.api.call.get(); // Smart proxy handles reserved keywords like 'call' or 'apply'
|
|
68
|
+
|
|
69
|
+
// 3. Advanced Realtime (v2.2)
|
|
64
70
|
await dolphin.connect();
|
|
65
71
|
|
|
72
|
+
// Subscribe with cleanup support
|
|
73
|
+
const onTemp = (val) => console.log(val);
|
|
74
|
+
dolphin.subscribe('sensors/temp', onTemp);
|
|
75
|
+
// ... later
|
|
76
|
+
dolphin.unsubscribe('sensors/temp', onTemp);
|
|
77
|
+
|
|
66
78
|
// High-frequency data (30,000+ msgs/sec)
|
|
67
79
|
dolphin.pubPush('sensors/temp', { val: 24.5 });
|
|
68
80
|
|
|
@@ -149,7 +161,7 @@ rt.subscribe('factory/machine/+', (data) => {
|
|
|
149
161
|
| **IoT Plugins** | `/realtime/plugins` | Native parsers for HL7, Modbus, and DICOM. |
|
|
150
162
|
| **Signaling** | `/signaling` | Universal WebRTC & Control Signaling module. |
|
|
151
163
|
| **Mongoose Adapter** | `/adapters/mongoose` | Full Mongoose ↔ CRUD bridge with query mapping. |
|
|
152
|
-
| **Client Lib** | `/dolphin-client.js` | Zero-dependency full-stack JS client. |
|
|
164
|
+
| **Client Lib** | `/dolphin-client.js` | Zero-dependency full-stack JS client (v2.2: with `unsubscribe` & `off*` methods). |
|
|
153
165
|
|
|
154
166
|
---
|
|
155
167
|
|
|
@@ -211,7 +223,7 @@ npm test # Run all 167 tests (12 suites)
|
|
|
211
223
|
| :--- | :--- | :--- | :--- |
|
|
212
224
|
| Express.js | ~15,000 | 180ms | N/A |
|
|
213
225
|
| Fastify | ~35,000 | 90ms | ~10,000 msgs/sec |
|
|
214
|
-
| **Dolphin V2** | **45,000+** | **< 10ms** | **
|
|
226
|
+
| **Dolphin V2** | **45,000+** | **< 10ms** | **35,000+ msgs/sec** |
|
|
215
227
|
|
|
216
228
|
---
|
|
217
229
|
|
package/dist/server/server.js
CHANGED
|
@@ -201,12 +201,17 @@ function createDolphinServer(options = {}) {
|
|
|
201
201
|
});
|
|
202
202
|
if (options.realtime) {
|
|
203
203
|
wss.on('connection', (ws, request) => {
|
|
204
|
-
// Automatic device extraction from URL or header (placeholder)
|
|
205
204
|
const deviceId = new URL(request.url, `http://h`).searchParams.get('deviceId') || 'anonymous';
|
|
206
205
|
options.realtime.register(deviceId, ws);
|
|
207
206
|
ws.on('message', (data) => {
|
|
207
|
+
// Keep device alive on every message
|
|
208
|
+
options.realtime.touch(deviceId);
|
|
208
209
|
options.realtime.handle(data, ws, deviceId);
|
|
209
210
|
});
|
|
211
|
+
// Keep device alive on pong (response to server ping)
|
|
212
|
+
ws.on('pong', () => {
|
|
213
|
+
options.realtime.touch(deviceId);
|
|
214
|
+
});
|
|
210
215
|
ws.on('close', () => options.realtime.unregister(deviceId));
|
|
211
216
|
ws.on('error', () => options.realtime.unregister(deviceId));
|
|
212
217
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../server/server.ts"],"names":[],"mappings":";;;;;AAMA,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../server/server.ts"],"names":[],"mappings":";;;;;AAMA,kDAyOC;AA/OD,0DAA6B;AAC7B,sDAAyB;AACzB,0DAA6B;AAC7B,2BAAqC;AACrC,6CAAuD;AAEvD,SAAgB,mBAAmB,CAAC,UAA4D,EAAE;IAChG,MAAM,MAAM,GAAG,IAAA,4BAAmB,GAAE,CAAC;IAErC,yCAAyC;IACzC,MAAM,CAAC,GAAG,CAAC,oBAAoB,EAAE,CAAC,GAAG,EAAE,EAAE;QACvC,MAAM,UAAU,GAAG,mBAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QACpE,IAAI,iBAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,iBAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACpD,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,wBAAwB,CAAC,CAAC;YACxD,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,MAAM,WAAW,GAAU,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAG,IAAI,oBAAe,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpD,MAAM,MAAM,GAAG,mBAAI,CAAC,YAAY,CAAC,KAAK,EAAE,GAAQ,EAAE,GAAQ,EAAE,EAAE;QAC5D,4BAA4B;QAC5B,IAAI,aAAa,GAAW,GAAG,CAAC;QAEhC,0BAA0B;QAC1B,MAAM,IAAI,GAAG,CAAC,IAAS,EAAE,WAAmB,EAAE,MAAe,EAAE,EAAE;YAC/D,IAAI,GAAG,CAAC,WAAW;gBAAE,OAAO;YAC5B,MAAM,WAAW,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC;YAClE,GAAG,CAAC,UAAU,GAAG,WAAW,CAAC;YAC7B,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;YAE3C,IAAI,WAAW,KAAK,kBAAkB,EAAE,CAAC;gBACvC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YACxB,CAAC;YACD,aAAa,GAAG,GAAG,CAAC,CAAC,mBAAmB;QAC1C,CAAC,CAAC;QAEF,uBAAuB;QACvB,GAAG,CAAC,IAAI,GAAG,CAAC,IAAS,EAAE,MAAe,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,kBAAkB,EAAE,MAAM,CAAC,CAAC;QAClF,GAAG,CAAC,IAAI,GAAG,CAAC,IAAS,EAAE,MAAe,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;QAC5E,GAAG,CAAC,IAAI,GAAG,CAAC,IAAS,EAAE,MAAe,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;QAE3E,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC;QAC7C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAI,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC;QAEtD,MAAM,GAAG,GAAQ;YACf,GAAG;YACH,GAAG;YACH,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,YAAY,CAAC;YACjD,IAAI,EAAE,EAAE;YACR,KAAK,EAAE,EAAE;YAET,IAAI,EAAE,CAAC,IAAS,EAAE,MAAe,EAAE,EAAE;gBACnC,IAAI,CAAC,IAAI,EAAE,kBAAkB,EAAE,MAAM,CAAC,CAAC;gBACvC,OAAO,GAAG,CAAC;YACb,CAAC;YAED,IAAI,EAAE,CAAC,IAAS,EAAE,MAAe,EAAE,EAAE;gBACnC,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;gBACjC,OAAO,GAAG,CAAC;YACb,CAAC;YAED,IAAI,EAAE,CAAC,IAAS,EAAE,MAAe,EAAE,EAAE;gBACnC,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;gBAChC,OAAO,GAAG,CAAC;YACb,CAAC;YAED,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;gBACvB,aAAa,GAAG,IAAI,CAAC;gBACrB,OAAO,GAAG,CAAC;YACb,CAAC;YAED,SAAS,EAAE,CAAC,IAAY,EAAE,KAAa,EAAE,EAAE;gBACzC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAC3B,OAAO,GAAG,CAAC;YACb,CAAC;YAED,SAAS,EAAE,CAAC,IAAY,EAAE,EAAE;gBAC1B,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACzC,CAAC;SACF,CAAC;QAEF,8BAA8B;QAC9B,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;YAC7B,IAAI,GAAG,CAAC,aAAa;gBAAE,OAAO;YAC9B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;gBAC1B,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACpB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;gBACxB,CAAC;qBAAM,CAAC;oBACN,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,kCAAkC;QAClC,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QACtD,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAO,CAAC,EAAE,CAAC;YACnD,IAAI,WAAW,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;gBAChD,oEAAoE;gBACpE,IAAK,GAAW,CAAC,IAAI;oBAAE,GAAG,CAAC,IAAI,GAAI,GAAW,CAAC,IAAI,CAAC;gBACpD,IAAK,GAAW,CAAC,IAAI;oBAAE,GAAG,CAAC,IAAI,GAAI,GAAW,CAAC,IAAI,CAAC;gBACpD,IAAK,GAAW,CAAC,KAAK;oBAAE,GAAG,CAAC,KAAK,GAAI,GAAW,CAAC,KAAK,CAAC;YACzD,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAU,EAAE,CAAC;gBACzB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG;oBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;gBAEjD,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;oBAC7C,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;wBACnC,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC;wBAClB,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC;oBACpB,CAAC;oBAAC,MAAM,CAAC;wBACP,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;wBACd,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;oBAChB,CAAC;gBACH,CAAC;qBAAM,IAAI,WAAW,CAAC,QAAQ,CAAC,mCAAmC,CAAC,EAAE,CAAC;oBACrE,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;oBAChE,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC;oBAClB,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC;gBACpB,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC;oBACnB,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC;gBACrB,CAAC;YACH,CAAC;QACH,CAAC;QAED,iBAAiB;QACjB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC5D,IAAI,KAAK,EAAE,CAAC;YACV,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;YAC1B,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;YAC1B,IAAI,CAAC;gBACH,IAAI,MAAW,CAAC;gBAChB,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;gBAEhC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACzC,IAAI,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,aAAa;wBAAE,MAAM;oBAEhD,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;oBAC5B,MAAM,IAAI,OAAO,CAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;wBAChD,IAAI,CAAC;4BACH,4CAA4C;4BAC5C,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gCACxB,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;4BACvC,CAAC;iCAAM,CAAC;gCACN,4BAA4B;gCAC5B,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;gCAC5B,OAAO,EAAE,CAAC;4BACZ,CAAC;wBACH,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACb,MAAM,CAAC,GAAG,CAAC,CAAC;wBACd,CAAC;oBACH,CAAC,CAAC,CAAC;gBACL,CAAC;gBAED,2DAA2D;gBAC3D,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;oBACrB,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;wBAC5C,+EAA+E;wBAC/E,MAAM,MAAM,GAAG,CAAC,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC;4BAC/F,CAAC,CAAC,MAAM,CAAC,MAAM;4BACf,CAAC,CAAC,aAAa,CAAC;wBAClB,IAAI,CAAC,MAAM,EAAE,kBAAkB,EAAE,MAAM,CAAC,CAAC;oBAC3C,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,IAAI,EAAE,kBAAkB,EAAE,GAAG,CAAC,CAAC;oBACtC,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;gBAC5C,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;oBACrB,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,IAAI,uBAAuB,EAAE,EAAE,kBAAkB,EAAE,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC;gBACjG,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBACrB,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,kBAAkB,EAAE,GAAG,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,qCAAqC;IACrC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;QAC7C,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAI,EAAE,UAAU,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAE7E,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;YACtD,GAAG,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE;gBAC9C,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,GAAG,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE;YACnC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAI,EAAE,UAAU,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,WAAW,CAAC;YAE/F,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAExC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;gBACxB,qCAAqC;gBACrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;YAC9C,CAAC,CAAC,CAAC;YAEH,sDAAsD;YACtD,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;gBACjB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACnC,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC5D,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,GAAG,MAAM;QACT,IAAI,EAAE,MAAM;QACZ,GAAG;QACH,GAAG,EAAE,CAAC,UAAwB,EAAE,EAAQ,EAAE,EAAE;YAC1C,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;gBAC3E,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QACD,MAAM,EAAE,CAAC,OAAe,OAAO,CAAC,IAAI,IAAI,IAAI,EAAE,QAAqB,EAAE,EAAE;YACrE,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,SAAS,EAAE,QAAQ,CAAC,CAAC;QAClE,CAAC;QACD,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE;KAC5B,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
package/scripts/client.js
CHANGED
|
@@ -44,6 +44,52 @@ class APIHandler {
|
|
|
44
44
|
*/
|
|
45
45
|
constructor(client) {
|
|
46
46
|
this.client = client;
|
|
47
|
+
return this._createProxy([]);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* @param {string[]} pathParts
|
|
52
|
+
* @private
|
|
53
|
+
*/
|
|
54
|
+
_createProxy(pathParts) {
|
|
55
|
+
const path = pathParts.join('/');
|
|
56
|
+
|
|
57
|
+
const target = (options) => {
|
|
58
|
+
return this.request('GET', path, null, options);
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
// Add standard methods to the function target
|
|
62
|
+
target.get = (pathOrOptions, options) => {
|
|
63
|
+
if (typeof pathOrOptions === 'string') return this.request('GET', pathOrOptions, null, options);
|
|
64
|
+
return this.request('GET', path, null, pathOrOptions);
|
|
65
|
+
};
|
|
66
|
+
target.post = (pathOrBody, bodyOrOptions, options) => {
|
|
67
|
+
if (typeof pathOrBody === 'string') return this.request('POST', pathOrBody, bodyOrOptions, options);
|
|
68
|
+
return this.request('POST', path, pathOrBody, bodyOrOptions);
|
|
69
|
+
};
|
|
70
|
+
target.put = (pathOrBody, bodyOrOptions, options) => {
|
|
71
|
+
if (typeof pathOrBody === 'string') return this.request('PUT', pathOrBody, bodyOrOptions, options);
|
|
72
|
+
return this.request('PUT', path, pathOrBody, bodyOrOptions);
|
|
73
|
+
};
|
|
74
|
+
target.del = (pathOrOptions, options) => {
|
|
75
|
+
if (typeof pathOrOptions === 'string') return this.request('DELETE', pathOrOptions, null, options);
|
|
76
|
+
return this.request('DELETE', path, null, pathOrOptions);
|
|
77
|
+
};
|
|
78
|
+
target.request = (method, subPath, body, options) => {
|
|
79
|
+
const finalPath = subPath ? `${path}/${subPath.startsWith('/') ? subPath.slice(1) : subPath}` : path;
|
|
80
|
+
return this.request(method, finalPath, body, options);
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
const methods = ['get', 'post', 'put', 'del', 'request'];
|
|
84
|
+
|
|
85
|
+
return new Proxy(target, {
|
|
86
|
+
get: (t, prop) => {
|
|
87
|
+
if (typeof prop === 'string' && !methods.includes(prop)) {
|
|
88
|
+
return this._createProxy([...pathParts, prop]);
|
|
89
|
+
}
|
|
90
|
+
return t[prop];
|
|
91
|
+
}
|
|
92
|
+
});
|
|
47
93
|
}
|
|
48
94
|
|
|
49
95
|
/**
|
|
@@ -59,8 +105,7 @@ class APIHandler {
|
|
|
59
105
|
'Content-Type': 'application/json',
|
|
60
106
|
...options.headers
|
|
61
107
|
};
|
|
62
|
-
|
|
63
|
-
// अटोमेटिक टोकन इन्जेक्सन
|
|
108
|
+
|
|
64
109
|
if (this.client.accessToken) {
|
|
65
110
|
headers['Authorization'] = `Bearer ${this.client.accessToken}`;
|
|
66
111
|
}
|
|
@@ -76,8 +121,6 @@ class APIHandler {
|
|
|
76
121
|
}
|
|
77
122
|
|
|
78
123
|
const response = await fetch(url, fetchOptions);
|
|
79
|
-
|
|
80
|
-
// JSON वा Text ह्यान्डल गर्ने
|
|
81
124
|
const contentType = response.headers.get('content-type');
|
|
82
125
|
let data;
|
|
83
126
|
if (contentType && contentType.includes('application/json')) {
|
|
@@ -93,14 +136,35 @@ class APIHandler {
|
|
|
93
136
|
return data;
|
|
94
137
|
}
|
|
95
138
|
|
|
96
|
-
/**
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
139
|
+
/**
|
|
140
|
+
* @param {string|RequestInit} [pathOrOptions]
|
|
141
|
+
* @param {RequestInit} [options]
|
|
142
|
+
* @returns {Promise<any>}
|
|
143
|
+
*/
|
|
144
|
+
get(pathOrOptions, options) { return Promise.resolve(); }
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* @param {string|any} [pathOrBody]
|
|
148
|
+
* @param {any} [bodyOrOptions]
|
|
149
|
+
* @param {RequestInit} [options]
|
|
150
|
+
* @returns {Promise<any>}
|
|
151
|
+
*/
|
|
152
|
+
post(pathOrBody, bodyOrOptions, options) { return Promise.resolve(); }
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* @param {string|any} [pathOrBody]
|
|
156
|
+
* @param {any} [bodyOrOptions]
|
|
157
|
+
* @param {RequestInit} [options]
|
|
158
|
+
* @returns {Promise<any>}
|
|
159
|
+
*/
|
|
160
|
+
put(pathOrBody, bodyOrOptions, options) { return Promise.resolve(); }
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* @param {string|RequestInit} [pathOrOptions]
|
|
164
|
+
* @param {RequestInit} [options]
|
|
165
|
+
* @returns {Promise<any>}
|
|
166
|
+
*/
|
|
167
|
+
del(pathOrOptions, options) { return Promise.resolve(); }
|
|
104
168
|
}
|
|
105
169
|
|
|
106
170
|
class AuthHandler {
|
|
@@ -162,34 +226,37 @@ class DolphinClient {
|
|
|
162
226
|
if (!url && typeof window !== 'undefined') {
|
|
163
227
|
url = window.location.host;
|
|
164
228
|
}
|
|
165
|
-
|
|
166
|
-
this.host = (url || 'localhost').replace(/\/$/, "").replace(/^https?:\/\//, "");
|
|
167
|
-
|
|
229
|
+
|
|
168
230
|
let protocol = 'http:';
|
|
169
|
-
if (
|
|
231
|
+
if (url && url.startsWith('https://')) {
|
|
232
|
+
protocol = 'https:';
|
|
233
|
+
} else if (url && url.startsWith('http://')) {
|
|
234
|
+
protocol = 'http:';
|
|
235
|
+
} else if (typeof window !== 'undefined') {
|
|
170
236
|
protocol = window.location.protocol;
|
|
171
237
|
}
|
|
172
|
-
|
|
238
|
+
|
|
239
|
+
this.host = (url || 'localhost').replace(/\/$/, "").replace(/^https?:\/\//, "");
|
|
173
240
|
this.httpUrl = `${protocol}//${this.host}`;
|
|
174
241
|
this.deviceId = deviceId || 'web_' + Math.random().toString(36).substr(2, 5);
|
|
175
|
-
|
|
242
|
+
|
|
176
243
|
/** @type {WebSocket | null} */
|
|
177
244
|
this.socket = null;
|
|
178
|
-
|
|
245
|
+
|
|
179
246
|
// Polyfill Storage if not browser
|
|
180
247
|
this.storage = typeof localStorage !== 'undefined' ? localStorage : {
|
|
181
248
|
getItem: (key) => null,
|
|
182
|
-
setItem: (key, val) => {},
|
|
183
|
-
removeItem: (key) => {}
|
|
249
|
+
setItem: (key, val) => { },
|
|
250
|
+
removeItem: (key) => { }
|
|
184
251
|
};
|
|
185
|
-
|
|
252
|
+
|
|
186
253
|
/** @type {string | null} */
|
|
187
254
|
this.accessToken = this.storage.getItem('dolphin_token');
|
|
188
|
-
|
|
255
|
+
|
|
189
256
|
// Sub-handlers
|
|
190
257
|
this.api = new APIHandler(this);
|
|
191
258
|
this.auth = new AuthHandler(this);
|
|
192
|
-
|
|
259
|
+
|
|
193
260
|
/** @type {Map<string, Set<TopicCallback>>} */
|
|
194
261
|
this.handlers = new Map(); // topic -> Set of callbacks
|
|
195
262
|
/** @type {Set<function(SignalMessage): void>} */
|
|
@@ -221,7 +288,7 @@ class DolphinClient {
|
|
|
221
288
|
return new Promise((resolve, reject) => {
|
|
222
289
|
const protocol = this.httpUrl.startsWith('https') ? 'wss:' : 'ws:';
|
|
223
290
|
const wsUrl = `${protocol}//${this.host}/realtime?deviceId=${this.deviceId}`;
|
|
224
|
-
|
|
291
|
+
|
|
225
292
|
console.log(`[Dolphin] Connecting to ${wsUrl}...`);
|
|
226
293
|
this.socket = new WebSocket(wsUrl);
|
|
227
294
|
|
|
@@ -250,7 +317,7 @@ class DolphinClient {
|
|
|
250
317
|
_handleMessage(data) {
|
|
251
318
|
try {
|
|
252
319
|
const parsed = JSON.parse(data);
|
|
253
|
-
|
|
320
|
+
|
|
254
321
|
// १. Signaling Messages
|
|
255
322
|
if (parsed.type && parsed.from && (parsed.to === this.deviceId || parsed.to === 'all')) {
|
|
256
323
|
// Auto-ACK for signaling messages
|
|
@@ -332,6 +399,20 @@ class DolphinClient {
|
|
|
332
399
|
this.handlers.get(topic).add(callback);
|
|
333
400
|
}
|
|
334
401
|
|
|
402
|
+
/**
|
|
403
|
+
* @param {string} topic
|
|
404
|
+
* @param {TopicCallback} callback
|
|
405
|
+
*/
|
|
406
|
+
unsubscribe(topic, callback) {
|
|
407
|
+
if (this.handlers.has(topic)) {
|
|
408
|
+
const callbacks = this.handlers.get(topic);
|
|
409
|
+
callbacks.delete(callback);
|
|
410
|
+
if (callbacks.size === 0) {
|
|
411
|
+
this.handlers.delete(topic);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
|
|
335
416
|
/**
|
|
336
417
|
* @param {string} topic
|
|
337
418
|
* @param {any} payload
|
|
@@ -360,10 +441,10 @@ class DolphinClient {
|
|
|
360
441
|
*/
|
|
361
442
|
subPull(topic, count = 10) {
|
|
362
443
|
if (this.socket && this.socket.readyState === WebSocket.OPEN) {
|
|
363
|
-
this.socket.send(JSON.stringify({
|
|
364
|
-
type: 'PULL_REQUEST',
|
|
365
|
-
topic,
|
|
366
|
-
count
|
|
444
|
+
this.socket.send(JSON.stringify({
|
|
445
|
+
type: 'PULL_REQUEST',
|
|
446
|
+
topic,
|
|
447
|
+
count
|
|
367
448
|
}));
|
|
368
449
|
}
|
|
369
450
|
}
|
|
@@ -408,6 +489,13 @@ class DolphinClient {
|
|
|
408
489
|
this.signalHandlers.add(handler);
|
|
409
490
|
}
|
|
410
491
|
|
|
492
|
+
/**
|
|
493
|
+
* @param {function(SignalMessage): void} handler
|
|
494
|
+
*/
|
|
495
|
+
offSignal(handler) {
|
|
496
|
+
this.signalHandlers.delete(handler);
|
|
497
|
+
}
|
|
498
|
+
|
|
411
499
|
/**
|
|
412
500
|
* @param {function(FileMetadata): void} handler
|
|
413
501
|
*/
|
|
@@ -415,6 +503,13 @@ class DolphinClient {
|
|
|
415
503
|
this.fileHandlers.add(handler);
|
|
416
504
|
}
|
|
417
505
|
|
|
506
|
+
/**
|
|
507
|
+
* @param {function(FileMetadata): void} handler
|
|
508
|
+
*/
|
|
509
|
+
offFileAvailable(handler) {
|
|
510
|
+
this.fileHandlers.delete(handler);
|
|
511
|
+
}
|
|
512
|
+
|
|
418
513
|
_maybeReconnect() {
|
|
419
514
|
if (this.reconnectAttempts < this.maxReconnectAttempts) {
|
|
420
515
|
this.reconnectAttempts++;
|