@livequery/rest 2.0.92 → 2.0.98
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 +15 -2
- package/dist/RestTransporter.js +158 -0
- package/dist/RestTransporter.js.map +1 -0
- package/dist/Socket.js +77 -0
- package/dist/Socket.js.map +1 -0
- package/dist/helpers/parseJson.js +9 -0
- package/dist/helpers/parseJson.js.map +1 -0
- package/dist/index.js +3 -2551
- package/dist/index.js.map +1 -93
- package/package.json +20 -7
package/README.md
CHANGED
|
@@ -432,6 +432,12 @@ Methods:
|
|
|
432
432
|
import { Socket } from '@livequery/rest'
|
|
433
433
|
```
|
|
434
434
|
|
|
435
|
+
Subpath import is also available:
|
|
436
|
+
|
|
437
|
+
```ts
|
|
438
|
+
import { Socket } from '@livequery/rest/Socket'
|
|
439
|
+
```
|
|
440
|
+
|
|
435
441
|
The socket class is exported for low-level integrations and debugging.
|
|
436
442
|
|
|
437
443
|
Example:
|
|
@@ -472,8 +478,15 @@ bun run build
|
|
|
472
478
|
Build steps:
|
|
473
479
|
|
|
474
480
|
- clean `dist/`
|
|
475
|
-
-
|
|
476
|
-
- generate `.d.ts
|
|
481
|
+
- emit Node.js ESM files with TypeScript (`module: NodeNext`)
|
|
482
|
+
- generate `.js`, `.d.ts`, `.js.map`, and `.d.ts.map`
|
|
483
|
+
|
|
484
|
+
The published package is strict ESM (`"type": "module"`) and exposes these entrypoints:
|
|
485
|
+
|
|
486
|
+
- `@livequery/rest`
|
|
487
|
+
- `@livequery/rest/RestTransporter`
|
|
488
|
+
- `@livequery/rest/Socket`
|
|
489
|
+
- `@livequery/rest/helpers/parseJson`
|
|
477
490
|
|
|
478
491
|
## License
|
|
479
492
|
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { of, firstValueFrom, EMPTY, from } from 'rxjs';
|
|
2
|
+
import { catchError, filter, first, map, mergeMap, take } from 'rxjs/operators';
|
|
3
|
+
import { merge } from 'rxjs';
|
|
4
|
+
import { Socket } from './Socket.js';
|
|
5
|
+
import { parseJson } from './helpers/parseJson.js';
|
|
6
|
+
export class RestTransporter {
|
|
7
|
+
config;
|
|
8
|
+
socket;
|
|
9
|
+
constructor(config) {
|
|
10
|
+
this.config = config;
|
|
11
|
+
if (config.ws) {
|
|
12
|
+
this.socket = new Socket(config.ws);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
async #call(req) {
|
|
16
|
+
const url = `${await this.config.api}/${req.ref}${req.action ? `/~${req.action}` : ''}${Object.keys(req.query || {}).length > 0 ? `?${new URLSearchParams(req.query).toString()}` : ''}`;
|
|
17
|
+
const base_headers = {
|
|
18
|
+
...req.body ? {
|
|
19
|
+
'Content-Type': 'application/json'
|
|
20
|
+
} : {},
|
|
21
|
+
...this.socket ? {
|
|
22
|
+
socket_id: this.socket.client_id,
|
|
23
|
+
'x-lcid': this.socket.client_id,
|
|
24
|
+
'x-lgid': await firstValueFrom(this.socket.$gateway)
|
|
25
|
+
} : {}
|
|
26
|
+
};
|
|
27
|
+
const original_request = {
|
|
28
|
+
url,
|
|
29
|
+
method: req.method,
|
|
30
|
+
body: req.body,
|
|
31
|
+
headers: base_headers,
|
|
32
|
+
query: req.query,
|
|
33
|
+
ref: req.ref
|
|
34
|
+
};
|
|
35
|
+
const { response: fake_response, headers, ...modified } = await this.config.onRequest?.(original_request) || {};
|
|
36
|
+
if (fake_response) {
|
|
37
|
+
this.config.onResponse && await this.config.onResponse(original_request, fake_response);
|
|
38
|
+
if (fake_response.error)
|
|
39
|
+
throw fake_response.error;
|
|
40
|
+
return fake_response.data;
|
|
41
|
+
}
|
|
42
|
+
const request = {
|
|
43
|
+
ref: req.ref,
|
|
44
|
+
url,
|
|
45
|
+
method: req.method,
|
|
46
|
+
...req.body ? { body: typeof req.body === 'string' ? req.body : JSON.stringify(req.body) } : {},
|
|
47
|
+
...modified,
|
|
48
|
+
headers: {
|
|
49
|
+
...req.body && typeof req.body != 'string' ? { 'Content-Type': 'application/json' } : {},
|
|
50
|
+
...base_headers,
|
|
51
|
+
...headers
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
const response = fake_response ? fake_response : await (async () => {
|
|
55
|
+
try {
|
|
56
|
+
const result = await fetch(request.url, request);
|
|
57
|
+
return parseJson(await result.text()) || {};
|
|
58
|
+
}
|
|
59
|
+
catch (e) {
|
|
60
|
+
return {
|
|
61
|
+
error: {
|
|
62
|
+
code: e instanceof Error ? e.name : 'UnknownError',
|
|
63
|
+
message: e instanceof Error ? e.message : 'An unknown error occurred'
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
})();
|
|
68
|
+
this.config.onResponse && await this.config.onResponse(request, response);
|
|
69
|
+
if (response.error)
|
|
70
|
+
throw response.error;
|
|
71
|
+
return response.data;
|
|
72
|
+
}
|
|
73
|
+
query({ ref, filters }) {
|
|
74
|
+
const ready$ = from(this.socket ? (this.socket.pipe(filter(s => !!s.connected), map(() => Date.now()))) : of(1)).pipe(first());
|
|
75
|
+
const watch$ = (!this.socket || !filters || filters[':after'] || filters[':before'] || filters[':around']) ? EMPTY : this.socket.listen(ref);
|
|
76
|
+
const refs = ref.split('/');
|
|
77
|
+
const collection_ref = refs.length % 2 == 0 ? refs.slice(0, -1).join('/') : ref;
|
|
78
|
+
return merge(ready$.pipe(take(1), mergeMap(() => (from(this.#call({
|
|
79
|
+
ref,
|
|
80
|
+
method: 'GET',
|
|
81
|
+
query: filters
|
|
82
|
+
})).pipe(map(collection => {
|
|
83
|
+
collection.subscription_token && this.socket?.subscribeWith(collection.subscription_token);
|
|
84
|
+
// If collection
|
|
85
|
+
if (collection.items) {
|
|
86
|
+
const items = Array.isArray(collection.items) ? collection.items : [];
|
|
87
|
+
const length = items.length;
|
|
88
|
+
return {
|
|
89
|
+
summary: collection.summary,
|
|
90
|
+
paging: {
|
|
91
|
+
current: collection?.count?.current ?? length,
|
|
92
|
+
total: collection?.count?.total ?? length,
|
|
93
|
+
next: collection?.has?.next ? {
|
|
94
|
+
count: collection?.count?.next || 0,
|
|
95
|
+
cursor: collection?.cursor?.last
|
|
96
|
+
} : undefined,
|
|
97
|
+
prev: collection?.has?.prev ? {
|
|
98
|
+
count: collection?.count?.prev || 0,
|
|
99
|
+
cursor: collection?.cursor?.first
|
|
100
|
+
} : undefined
|
|
101
|
+
},
|
|
102
|
+
changes: items.map(data => ({
|
|
103
|
+
data,
|
|
104
|
+
type: 'added',
|
|
105
|
+
id: data.id,
|
|
106
|
+
collection_ref
|
|
107
|
+
})),
|
|
108
|
+
source: "query"
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
// If document
|
|
112
|
+
return {
|
|
113
|
+
summary: collection.summary,
|
|
114
|
+
changes: [{
|
|
115
|
+
data: collection.item,
|
|
116
|
+
type: 'added',
|
|
117
|
+
id: collection.item.id,
|
|
118
|
+
collection_ref
|
|
119
|
+
}],
|
|
120
|
+
source: "query"
|
|
121
|
+
};
|
|
122
|
+
}), catchError(e => {
|
|
123
|
+
const error = e instanceof Error ? { code: e.name, message: e.message } : { code: e.code || 'UnknownError', message: e.message || 'An unknown error occurred' };
|
|
124
|
+
return of({ error, source: "query" });
|
|
125
|
+
}))))), watch$.pipe(map((change) => {
|
|
126
|
+
const id = change.data?.id;
|
|
127
|
+
if (id) {
|
|
128
|
+
const e = {
|
|
129
|
+
changes: [
|
|
130
|
+
{
|
|
131
|
+
...change,
|
|
132
|
+
collection_ref,
|
|
133
|
+
id
|
|
134
|
+
}
|
|
135
|
+
],
|
|
136
|
+
source: "realtime"
|
|
137
|
+
};
|
|
138
|
+
return e;
|
|
139
|
+
}
|
|
140
|
+
}), filter(Boolean)));
|
|
141
|
+
}
|
|
142
|
+
async add(ref, data) {
|
|
143
|
+
const r = await this.#call({ method: 'POST', ref, body: data, query: {} });
|
|
144
|
+
if (r.id)
|
|
145
|
+
return r;
|
|
146
|
+
return r.item;
|
|
147
|
+
}
|
|
148
|
+
update(collection_ref, id, data) {
|
|
149
|
+
return this.#call({ method: 'PATCH', ref: collection_ref + '/' + id, body: data, query: {} });
|
|
150
|
+
}
|
|
151
|
+
delete(collection_ref, id) {
|
|
152
|
+
return this.#call({ method: 'DELETE', ref: collection_ref + '/' + id, body: undefined, query: {} });
|
|
153
|
+
}
|
|
154
|
+
trigger({ ref, action, payload }) {
|
|
155
|
+
return this.#call({ method: 'POST', ref, action, body: payload, query: {} });
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=RestTransporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RestTransporter.js","sourceRoot":"","sources":["../src/RestTransporter.ts"],"names":[],"mappings":"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"}
|
package/dist/Socket.js
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { fromEvent, Observable, Subject, BehaviorSubject, merge, ReplaySubject, Subscription, of, interval, EMPTY } from "rxjs";
|
|
2
|
+
import { catchError, finalize, ignoreElements, map, mergeMap, retry, switchMap, takeUntil, tap } from "rxjs/operators";
|
|
3
|
+
import { v7 as uuidv7 } from 'uuid';
|
|
4
|
+
export class Socket extends BehaviorSubject {
|
|
5
|
+
endpoint;
|
|
6
|
+
client_id = uuidv7();
|
|
7
|
+
$gateway = new ReplaySubject(1);
|
|
8
|
+
$connected = new BehaviorSubject(false);
|
|
9
|
+
#topics = new Map();
|
|
10
|
+
#$input = new ReplaySubject(1000);
|
|
11
|
+
#running;
|
|
12
|
+
constructor(endpoint) {
|
|
13
|
+
super({
|
|
14
|
+
client_id: uuidv7(),
|
|
15
|
+
connected: false,
|
|
16
|
+
session: 0
|
|
17
|
+
});
|
|
18
|
+
this.endpoint = endpoint;
|
|
19
|
+
this.#init();
|
|
20
|
+
}
|
|
21
|
+
#init() {
|
|
22
|
+
if (typeof WebSocket == 'undefined')
|
|
23
|
+
return;
|
|
24
|
+
if (this.#running)
|
|
25
|
+
return;
|
|
26
|
+
this.#running = of(1).pipe(takeUntil(this.pipe(ignoreElements())), mergeMap(async () => new WebSocket(this.endpoint)), switchMap(ws => merge(fromEvent(ws, 'closed').pipe(map(e => { throw e; })), fromEvent(ws, 'close').pipe(map(e => { throw e; })), fromEvent(ws, 'error').pipe(map(e => { throw e; })), fromEvent(ws, 'open').pipe(switchMap(() => interval(60000)), tap(() => ws.send(JSON.stringify({ event: 'ping' })))), fromEvent(ws, 'open').pipe(tap(() => {
|
|
27
|
+
this.next({
|
|
28
|
+
...this.value,
|
|
29
|
+
connected: true,
|
|
30
|
+
session: this.value.session + 1
|
|
31
|
+
});
|
|
32
|
+
console.log(this.value.session == 1 ? 'Websocket connected' : `Websocket re-connected (${this.value.session})`);
|
|
33
|
+
ws.send(JSON.stringify({ event: 'start', data: { id: this.client_id } }));
|
|
34
|
+
}), mergeMap(() => this.#$input), tap(data => ws.send(JSON.stringify(data)))), fromEvent(ws, 'message').pipe(tap((evt) => {
|
|
35
|
+
const e = JSON.parse(evt.data);
|
|
36
|
+
const fn = this[`$${e.event}`];
|
|
37
|
+
typeof fn == 'function' && fn.call(this, e);
|
|
38
|
+
}))).pipe(finalize(() => ws.close()))), catchError(e => {
|
|
39
|
+
this.$connected.next(false);
|
|
40
|
+
throw e;
|
|
41
|
+
}), retry({ delay: 1000 })).subscribe();
|
|
42
|
+
}
|
|
43
|
+
stop() {
|
|
44
|
+
this.complete();
|
|
45
|
+
}
|
|
46
|
+
$sync(e) {
|
|
47
|
+
for (const change of e.data.changes) {
|
|
48
|
+
change.collection_ref = change.ref;
|
|
49
|
+
this.#topics.get(change.ref)?.stream.next(change);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
$hello(e) {
|
|
53
|
+
this.$gateway.next(e.gid);
|
|
54
|
+
}
|
|
55
|
+
subscribeWith(realtime_token) {
|
|
56
|
+
this.#$input.next({ event: 'subscribe', data: { realtime_token } });
|
|
57
|
+
}
|
|
58
|
+
listen(ref) {
|
|
59
|
+
if (!this.#topics.has(ref)) {
|
|
60
|
+
const stream = new Subject();
|
|
61
|
+
this.#topics.set(ref, { stream, listen_count: 0 });
|
|
62
|
+
}
|
|
63
|
+
const topic = this.#topics.get(ref);
|
|
64
|
+
if (!topic)
|
|
65
|
+
return EMPTY;
|
|
66
|
+
topic.listen_count++;
|
|
67
|
+
return topic.stream.pipe(finalize(() => {
|
|
68
|
+
topic.listen_count--;
|
|
69
|
+
setTimeout(() => {
|
|
70
|
+
if (topic.listen_count == 0) {
|
|
71
|
+
this.#$input.next({ event: 'unsubscribe', data: { ref } });
|
|
72
|
+
}
|
|
73
|
+
}, 2000);
|
|
74
|
+
}));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=Socket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Socket.js","sourceRoot":"","sources":["../src/Socket.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseJson.js","sourceRoot":"","sources":["../../src/helpers/parseJson.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,GAAW,EAAE,EAAE;IACrC,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC1B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,IAAI,CAAA;IACf,CAAC;AACL,CAAC,CAAA"}
|