@livequery/nestjs 1.0.49 → 1.0.50
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/build/index.js +5 -1
- package/build/src/LivequeryDatasourceInterceptors.d.ts +2 -2
- package/build/src/LivequeryDatasourceInterceptors.js +4 -5
- package/build/src/LivequeryInterceptor.d.ts +1 -1
- package/build/src/LivequeryInterceptor.js +9 -8
- package/build/src/LivequeryRequest.js +1 -1
- package/build/src/LivequeryResponse.d.ts +1 -1
- package/build/src/LivequeryResponse.js +1 -1
- package/build/src/LivequeryWebsocketSync.d.ts +11 -2
- package/build/src/LivequeryWebsocketSync.js +57 -16
- package/build/src/UseWebsocketShareKeyPair.d.ts +4 -4
- package/build/src/UseWebsocketShareKeyPair.js +2 -2
- package/build/src/helpers/PathHelper.js +6 -6
- package/build/src/helpers/createDatasourceMapper.js +1 -1
- package/package.json +3 -2
package/build/index.js
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { CallHandler, ExecutionContext, NestInterceptor } from '@nestjs/common';
|
|
2
2
|
import { LivequeryRequest } from '@livequery/types';
|
|
3
3
|
import { ModuleRef } from '@nestjs/core';
|
|
4
|
-
export
|
|
4
|
+
export type DatasourceOptions<T> = Array<T & {
|
|
5
5
|
refs: string[];
|
|
6
6
|
}>;
|
|
7
|
-
export
|
|
7
|
+
export type Datasource<T = any> = {
|
|
8
8
|
query(query: LivequeryRequest): any;
|
|
9
9
|
};
|
|
10
10
|
export declare const DatasourceList: Map<new (...args: any[]) => Datasource, Datasource<any>>;
|
|
@@ -15,7 +15,7 @@ const rxjs_1 = require("rxjs");
|
|
|
15
15
|
const core_1 = require("@nestjs/core");
|
|
16
16
|
exports.DatasourceList = new Map();
|
|
17
17
|
exports.$__datasource_factory_token = Symbol();
|
|
18
|
-
let LivequeryDatasourceInterceptors = class LivequeryDatasourceInterceptors {
|
|
18
|
+
let LivequeryDatasourceInterceptors = exports.LivequeryDatasourceInterceptors = class LivequeryDatasourceInterceptors {
|
|
19
19
|
moduleRef;
|
|
20
20
|
constructor(moduleRef) {
|
|
21
21
|
this.moduleRef = moduleRef;
|
|
@@ -25,11 +25,10 @@ let LivequeryDatasourceInterceptors = class LivequeryDatasourceInterceptors {
|
|
|
25
25
|
const datasource = exports.DatasourceList.has(token) ? exports.DatasourceList.get(token) : this.moduleRef.get(token);
|
|
26
26
|
const req = ctx.switchToHttp().getRequest();
|
|
27
27
|
req.livequery_response = await datasource.query(req.livequery);
|
|
28
|
-
return next.handle().pipe(rxjs_1.map(rs => rs ?? req.livequery_response));
|
|
28
|
+
return next.handle().pipe((0, rxjs_1.map)(rs => rs ?? req.livequery_response));
|
|
29
29
|
}
|
|
30
30
|
};
|
|
31
|
-
LivequeryDatasourceInterceptors = __decorate([
|
|
32
|
-
common_1.Injectable(),
|
|
31
|
+
exports.LivequeryDatasourceInterceptors = LivequeryDatasourceInterceptors = __decorate([
|
|
32
|
+
(0, common_1.Injectable)(),
|
|
33
33
|
__metadata("design:paramtypes", [core_1.ModuleRef])
|
|
34
34
|
], LivequeryDatasourceInterceptors);
|
|
35
|
-
exports.LivequeryDatasourceInterceptors = LivequeryDatasourceInterceptors;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { CallHandler, ExecutionContext, NestInterceptor } from "@nestjs/common";
|
|
2
2
|
import { LivequeryWebsocketSync } from "./LivequeryWebsocketSync";
|
|
3
|
-
export
|
|
3
|
+
export type RealtimeSubscription = {
|
|
4
4
|
collection_ref: string;
|
|
5
5
|
doc_id: string;
|
|
6
6
|
};
|
|
@@ -19,7 +19,7 @@ const PathHelper_1 = require("./helpers/PathHelper");
|
|
|
19
19
|
const LivequeryWebsocketSync_1 = require("./LivequeryWebsocketSync");
|
|
20
20
|
const UseWebsocketShareKeyPair_1 = require("./UseWebsocketShareKeyPair");
|
|
21
21
|
const JWT = require('jsonwebtoken');
|
|
22
|
-
let LivequeryInterceptor = class LivequeryInterceptor {
|
|
22
|
+
let LivequeryInterceptor = exports.LivequeryInterceptor = class LivequeryInterceptor {
|
|
23
23
|
LivequeryWebsocketSync;
|
|
24
24
|
secret_or_private_key;
|
|
25
25
|
constructor(LivequeryWebsocketSync, secret_or_private_key) {
|
|
@@ -67,15 +67,16 @@ let LivequeryInterceptor = class LivequeryInterceptor {
|
|
|
67
67
|
return s(null);
|
|
68
68
|
JWT.sign({ collection_ref, doc_id }, this.secret_or_private_key, {}, (error, data) => s(error ? null : data));
|
|
69
69
|
});
|
|
70
|
-
return next.handle().pipe(operators_1.map(data => ({ data: { ...data, realtime_token } })));
|
|
70
|
+
return next.handle().pipe((0, operators_1.map)(data => ({ data: { ...data, realtime_token } })));
|
|
71
71
|
}
|
|
72
72
|
};
|
|
73
|
-
LivequeryInterceptor = __decorate([
|
|
74
|
-
common_1.Injectable(),
|
|
75
|
-
__param(0,
|
|
76
|
-
__param(
|
|
73
|
+
exports.LivequeryInterceptor = LivequeryInterceptor = __decorate([
|
|
74
|
+
(0, common_1.Injectable)(),
|
|
75
|
+
__param(0, (0, common_1.Optional)()),
|
|
76
|
+
__param(0, (0, common_1.Inject)((0, common_1.forwardRef)(() => LivequeryWebsocketSync_1.LivequeryWebsocketSync))),
|
|
77
|
+
__param(1, (0, common_1.Optional)()),
|
|
78
|
+
__param(1, (0, UseWebsocketShareKeyPair_1.InjectWebsocketPrivateKey)()),
|
|
77
79
|
__metadata("design:paramtypes", [LivequeryWebsocketSync_1.LivequeryWebsocketSync, String])
|
|
78
80
|
], LivequeryInterceptor);
|
|
79
|
-
|
|
80
|
-
const UseLivequeryInterceptor = () => common_1.UseInterceptors(LivequeryInterceptor);
|
|
81
|
+
const UseLivequeryInterceptor = () => (0, common_1.UseInterceptors)(LivequeryInterceptor);
|
|
81
82
|
exports.UseLivequeryInterceptor = UseLivequeryInterceptor;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.LivequeryRequest = void 0;
|
|
4
4
|
const common_1 = require("@nestjs/common");
|
|
5
|
-
exports.LivequeryRequest = common_1.createParamDecorator((data, ctx) => {
|
|
5
|
+
exports.LivequeryRequest = (0, common_1.createParamDecorator)((data, ctx) => {
|
|
6
6
|
const request = ctx.switchToHttp().getRequest();
|
|
7
7
|
return request.livequery;
|
|
8
8
|
});
|
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.LivequeryResponse = void 0;
|
|
4
4
|
const common_1 = require("@nestjs/common");
|
|
5
|
-
exports.LivequeryResponse = common_1.createParamDecorator((data, ctx) => ctx.switchToHttp().getRequest().livequery_response);
|
|
5
|
+
exports.LivequeryResponse = (0, common_1.createParamDecorator)((data, ctx) => ctx.switchToHttp().getRequest().livequery_response);
|
|
@@ -1,13 +1,22 @@
|
|
|
1
1
|
import { Subject } from "rxjs";
|
|
2
2
|
import { LivequeryInterceptor, RealtimeSubscription } from "./LivequeryInterceptor";
|
|
3
|
-
import { UpdatedData } from "@livequery/types";
|
|
3
|
+
import { UpdatedData, UpdatedDataType } from "@livequery/types";
|
|
4
4
|
export declare class LivequeryWebsocketSync {
|
|
5
5
|
private secret_or_public_key;
|
|
6
6
|
private connections;
|
|
7
7
|
private refs;
|
|
8
|
-
readonly changes: Subject<UpdatedData
|
|
8
|
+
readonly changes: Subject<UpdatedData>;
|
|
9
9
|
constructor(secret_or_public_key: string, LivequeryInterceptor: LivequeryInterceptor);
|
|
10
10
|
private handleDisconnect;
|
|
11
|
+
sync_db_change<T extends {
|
|
12
|
+
id: string;
|
|
13
|
+
}>(event: {
|
|
14
|
+
type: UpdatedDataType;
|
|
15
|
+
old_data?: T;
|
|
16
|
+
old_ref: string;
|
|
17
|
+
new_data?: T;
|
|
18
|
+
new_ref: string;
|
|
19
|
+
}): Promise<void>;
|
|
11
20
|
start({ id }: {
|
|
12
21
|
id: string;
|
|
13
22
|
}, socket: WebSocket & {
|
|
@@ -20,7 +20,7 @@ const crypto_1 = require("crypto");
|
|
|
20
20
|
const common_1 = require("@nestjs/common");
|
|
21
21
|
const UseWebsocketShareKeyPair_1 = require("./UseWebsocketShareKeyPair");
|
|
22
22
|
const JWT = require('jsonwebtoken');
|
|
23
|
-
let LivequeryWebsocketSync = class LivequeryWebsocketSync {
|
|
23
|
+
let LivequeryWebsocketSync = exports.LivequeryWebsocketSync = class LivequeryWebsocketSync {
|
|
24
24
|
secret_or_public_key;
|
|
25
25
|
connections = new Map();
|
|
26
26
|
refs = new Map();
|
|
@@ -46,7 +46,47 @@ let LivequeryWebsocketSync = class LivequeryWebsocketSync {
|
|
|
46
46
|
});
|
|
47
47
|
this.connections.delete(socket.id);
|
|
48
48
|
}
|
|
49
|
-
|
|
49
|
+
async sync_db_change(event) {
|
|
50
|
+
if (event.type == 'added') {
|
|
51
|
+
this.changes.next({
|
|
52
|
+
data: event.new_data,
|
|
53
|
+
ref: event.new_ref,
|
|
54
|
+
type: event.type
|
|
55
|
+
});
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (event.type == 'modified') {
|
|
59
|
+
if (event.old_ref == event.new_ref) {
|
|
60
|
+
this.changes.next({
|
|
61
|
+
type: 'modified',
|
|
62
|
+
ref: event.new_ref,
|
|
63
|
+
data: event.new_data
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
this.changes.next({
|
|
68
|
+
type: 'removed',
|
|
69
|
+
ref: event.old_ref,
|
|
70
|
+
data: { id: event.old_data.id }
|
|
71
|
+
});
|
|
72
|
+
this.changes.next({
|
|
73
|
+
type: 'added',
|
|
74
|
+
ref: event.new_ref,
|
|
75
|
+
data: { ...event.old_data || {}, ...event.new_data || {}, id: event.old_data.id }
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (event.type == 'removed') {
|
|
81
|
+
this.changes.next({
|
|
82
|
+
data: { id: event.old_data.id },
|
|
83
|
+
ref: event.old_ref,
|
|
84
|
+
type: event.type
|
|
85
|
+
});
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
start({ id = (0, crypto_1.randomUUID)() }, socket) {
|
|
50
90
|
if (typeof id == 'string' && id.length < 40) {
|
|
51
91
|
socket.id = id;
|
|
52
92
|
this.connections.set(id, { socket, refs: new Set() });
|
|
@@ -75,33 +115,34 @@ let LivequeryWebsocketSync = class LivequeryWebsocketSync {
|
|
|
75
115
|
}
|
|
76
116
|
};
|
|
77
117
|
__decorate([
|
|
78
|
-
websockets_1.SubscribeMessage('start'),
|
|
79
|
-
__param(0, websockets_1.MessageBody()),
|
|
80
|
-
__param(1, websockets_1.ConnectedSocket()),
|
|
118
|
+
(0, websockets_1.SubscribeMessage)('start'),
|
|
119
|
+
__param(0, (0, websockets_1.MessageBody)()),
|
|
120
|
+
__param(1, (0, websockets_1.ConnectedSocket)()),
|
|
81
121
|
__metadata("design:type", Function),
|
|
82
122
|
__metadata("design:paramtypes", [Object, Object]),
|
|
83
123
|
__metadata("design:returntype", void 0)
|
|
84
124
|
], LivequeryWebsocketSync.prototype, "start", null);
|
|
85
125
|
__decorate([
|
|
86
|
-
websockets_1.SubscribeMessage('subscribe'),
|
|
87
|
-
__param(0, websockets_1.MessageBody()),
|
|
88
|
-
__param(1, websockets_1.ConnectedSocket()),
|
|
126
|
+
(0, websockets_1.SubscribeMessage)('subscribe'),
|
|
127
|
+
__param(0, (0, websockets_1.MessageBody)()),
|
|
128
|
+
__param(1, (0, websockets_1.ConnectedSocket)()),
|
|
89
129
|
__metadata("design:type", Function),
|
|
90
130
|
__metadata("design:paramtypes", [Object, Object]),
|
|
91
131
|
__metadata("design:returntype", Promise)
|
|
92
132
|
], LivequeryWebsocketSync.prototype, "subscribe", null);
|
|
93
133
|
__decorate([
|
|
94
|
-
websockets_1.SubscribeMessage('unsubscribe'),
|
|
95
|
-
__param(0, websockets_1.MessageBody()),
|
|
96
|
-
__param(1, websockets_1.ConnectedSocket()),
|
|
134
|
+
(0, websockets_1.SubscribeMessage)('unsubscribe'),
|
|
135
|
+
__param(0, (0, websockets_1.MessageBody)()),
|
|
136
|
+
__param(1, (0, websockets_1.ConnectedSocket)()),
|
|
97
137
|
__metadata("design:type", Function),
|
|
98
138
|
__metadata("design:paramtypes", [Object, Object]),
|
|
99
139
|
__metadata("design:returntype", void 0)
|
|
100
140
|
], LivequeryWebsocketSync.prototype, "unsubscribe", null);
|
|
101
|
-
LivequeryWebsocketSync = __decorate([
|
|
102
|
-
websockets_1.WebSocketGateway({ path: process.env.REALTIME_UPDATE_SOCKET_PATH || '/livequery/realtime-updates' }),
|
|
103
|
-
__param(0,
|
|
104
|
-
__param(
|
|
141
|
+
exports.LivequeryWebsocketSync = LivequeryWebsocketSync = __decorate([
|
|
142
|
+
(0, websockets_1.WebSocketGateway)({ path: process.env.REALTIME_UPDATE_SOCKET_PATH || '/livequery/realtime-updates' }),
|
|
143
|
+
__param(0, (0, common_1.Optional)()),
|
|
144
|
+
__param(0, (0, UseWebsocketShareKeyPair_1.InjectWebsocketPublicKey)()),
|
|
145
|
+
__param(1, (0, common_1.Optional)()),
|
|
146
|
+
__param(1, (0, common_1.Inject)((0, common_1.forwardRef)(() => LivequeryInterceptor_1.LivequeryInterceptor))),
|
|
105
147
|
__metadata("design:paramtypes", [String, LivequeryInterceptor_1.LivequeryInterceptor])
|
|
106
148
|
], LivequeryWebsocketSync);
|
|
107
|
-
exports.LivequeryWebsocketSync = LivequeryWebsocketSync;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Provider } from "@nestjs/common";
|
|
2
|
-
export declare const InjectWebsocketPublicKey: () =>
|
|
3
|
-
export declare const InjectWebsocketPrivateKey: () =>
|
|
4
|
-
export declare const UseWebsocketPublicKey: (secret_or_public_key: string) => Provider
|
|
5
|
-
export declare const UseWebsocketPrivateKey: (secret_or_private_key: string) => Provider
|
|
2
|
+
export declare const InjectWebsocketPublicKey: () => PropertyDecorator & ParameterDecorator;
|
|
3
|
+
export declare const InjectWebsocketPrivateKey: () => PropertyDecorator & ParameterDecorator;
|
|
4
|
+
export declare const UseWebsocketPublicKey: (secret_or_public_key: string) => Provider;
|
|
5
|
+
export declare const UseWebsocketPrivateKey: (secret_or_private_key: string) => Provider;
|
|
@@ -4,9 +4,9 @@ exports.UseWebsocketPrivateKey = exports.UseWebsocketPublicKey = exports.InjectW
|
|
|
4
4
|
const common_1 = require("@nestjs/common");
|
|
5
5
|
const WebsocketPublicKey = 'WebsocketPublicKey';
|
|
6
6
|
const WebsocketPrivateKey = 'WebsocketPrivateKey';
|
|
7
|
-
const InjectWebsocketPublicKey = () => common_1.Inject(WebsocketPublicKey);
|
|
7
|
+
const InjectWebsocketPublicKey = () => (0, common_1.Inject)(WebsocketPublicKey);
|
|
8
8
|
exports.InjectWebsocketPublicKey = InjectWebsocketPublicKey;
|
|
9
|
-
const InjectWebsocketPrivateKey = () => common_1.Inject(WebsocketPrivateKey);
|
|
9
|
+
const InjectWebsocketPrivateKey = () => (0, common_1.Inject)(WebsocketPrivateKey);
|
|
10
10
|
exports.InjectWebsocketPrivateKey = InjectWebsocketPrivateKey;
|
|
11
11
|
const UseWebsocketPublicKey = (secret_or_public_key) => ({
|
|
12
12
|
provide: WebsocketPublicKey,
|
|
@@ -5,6 +5,7 @@ const const_1 = require("../const");
|
|
|
5
5
|
class PathHelper {
|
|
6
6
|
static trimLivequeryHotkey(path) {
|
|
7
7
|
const ref = path
|
|
8
|
+
?.split('~')[0]
|
|
8
9
|
?.replaceAll(':', '')
|
|
9
10
|
?.split(const_1.LIVEQUERY_MAGIC_KEY)?.[1]
|
|
10
11
|
?.split('/')
|
|
@@ -16,19 +17,18 @@ class PathHelper {
|
|
|
16
17
|
}
|
|
17
18
|
static parseHttpRequestPath(path) {
|
|
18
19
|
const refs = path
|
|
20
|
+
?.split('~')[0]
|
|
19
21
|
?.replaceAll(':', '')
|
|
20
22
|
?.split(const_1.LIVEQUERY_MAGIC_KEY)?.[1]
|
|
21
23
|
?.split('/')
|
|
22
24
|
?.filter(s => s.length > 0);
|
|
23
25
|
if (!refs)
|
|
24
26
|
throw 'LIVEQUERY_MAGIC_KEY_NOT_FOUND';
|
|
27
|
+
const is_collection = refs.length % 2 == 1;
|
|
25
28
|
const ref = refs.join('/');
|
|
26
|
-
const
|
|
27
|
-
const
|
|
28
|
-
const
|
|
29
|
-
const collection_ref = is_collection ? ref_without_action : refs_without_action.slice(0, refs_without_action.length - 1).join('/');
|
|
30
|
-
const schema_ref = refs_without_action.filter((_, i) => i % 2 == 0).join('/');
|
|
31
|
-
const doc_id = is_collection ? null : refs_without_action[refs_without_action.length - 1];
|
|
29
|
+
const collection_ref = is_collection ? ref : refs.slice(0, refs.length - 1).join('/');
|
|
30
|
+
const schema_ref = refs.filter((_, i) => i % 2 == 0).join('/');
|
|
31
|
+
const doc_id = is_collection ? null : refs[refs.length - 1];
|
|
32
32
|
return { ref, schema_ref, is_collection, doc_id, collection_ref };
|
|
33
33
|
}
|
|
34
34
|
static join(a, b) {
|
|
@@ -7,7 +7,7 @@ const LivequeryInterceptor_1 = require("../LivequeryInterceptor");
|
|
|
7
7
|
const PathHelper_1 = require("./PathHelper");
|
|
8
8
|
const createDatasourceMapper = (datasource_factory) => {
|
|
9
9
|
const RouteConfigList = [];
|
|
10
|
-
const decorator = (options) => common_1.applyDecorators((target, method) => RouteConfigList.push({ target, method, options }), LivequeryInterceptor_1.UseLivequeryInterceptor(), common_1.UseInterceptors(LivequeryDatasourceInterceptors_1.LivequeryDatasourceInterceptors), (target, method, descriptor) => {
|
|
10
|
+
const decorator = (options) => (0, common_1.applyDecorators)((target, method) => RouteConfigList.push({ target, method, options }), (0, LivequeryInterceptor_1.UseLivequeryInterceptor)(), (0, common_1.UseInterceptors)(LivequeryDatasourceInterceptors_1.LivequeryDatasourceInterceptors), (target, method, descriptor) => {
|
|
11
11
|
Reflect.defineMetadata(LivequeryDatasourceInterceptors_1.$__datasource_factory_token, datasource_factory, descriptor.value);
|
|
12
12
|
});
|
|
13
13
|
const getDatasourceMetadatas = () => RouteConfigList.map(config => {
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"repository": {
|
|
4
4
|
"url": "git@github.com:livequery/nestjs.git"
|
|
5
5
|
},
|
|
6
|
-
"version": "1.0.
|
|
6
|
+
"version": "1.0.50",
|
|
7
7
|
"description": "",
|
|
8
8
|
"main": "build/index.js",
|
|
9
9
|
"types": "build/index.d.ts",
|
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
"license": "ISC",
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"@types/jsonwebtoken": "x",
|
|
39
|
-
"jsonwebtoken": "x"
|
|
39
|
+
"jsonwebtoken": "x",
|
|
40
|
+
"typescript": "^5.1.6"
|
|
40
41
|
}
|
|
41
42
|
}
|