@livequery/nestjs 1.0.48 → 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 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.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
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 declare type DatasourceOptions<T> = Array<T & {
4
+ export type DatasourceOptions<T> = Array<T & {
5
5
  refs: string[];
6
6
  }>;
7
- export declare type Datasource<T = any> = {
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 declare type RealtimeSubscription = {
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, common_1.Optional()), __param(0, common_1.Inject(common_1.forwardRef(() => LivequeryWebsocketSync_1.LivequeryWebsocketSync))),
76
- __param(1, common_1.Optional()), __param(1, UseWebsocketShareKeyPair_1.InjectWebsocketPrivateKey()),
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
- exports.LivequeryInterceptor = LivequeryInterceptor;
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
  });
@@ -1,4 +1,4 @@
1
- export declare type LivequeryResponse<T = any> = {
1
+ export type LivequeryResponse<T = any> = {
2
2
  items: T[];
3
3
  page_info?: {
4
4
  has_more: boolean;
@@ -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<any>>;
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
- start({ id = crypto_1.randomUUID() }, socket) {
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, common_1.Optional()), __param(0, UseWebsocketShareKeyPair_1.InjectWebsocketPublicKey()),
104
- __param(1, common_1.Optional()), __param(1, common_1.Inject(common_1.forwardRef(() => LivequeryInterceptor_1.LivequeryInterceptor))),
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: () => (target: object, key: string | symbol, index?: number) => void;
3
- export declare const InjectWebsocketPrivateKey: () => (target: object, key: string | symbol, index?: number) => void;
4
- export declare const UseWebsocketPublicKey: (secret_or_public_key: string) => Provider<any>;
5
- export declare const UseWebsocketPrivateKey: (secret_or_private_key: string) => Provider<any>;
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 ref_without_action = ref.split('/~')[0];
27
- const refs_without_action = ref_without_action.split('/');
28
- const is_collection = refs_without_action.length % 2 == 1;
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.48",
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
  }