remult 0.17.2 → 0.18.0

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.
Files changed (165) hide show
  1. package/SseSubscriptionServer.d.ts +23 -0
  2. package/SseSubscriptionServer.js +143 -0
  3. package/ably.d.ts +13 -0
  4. package/ably.js +59 -0
  5. package/esm/SseSubscriptionServer.d.ts +23 -0
  6. package/esm/SseSubscriptionServer.js +102 -0
  7. package/esm/ably.d.ts +13 -0
  8. package/esm/ably.js +28 -0
  9. package/esm/graphql.js +0 -1
  10. package/esm/index.d.ts +7 -4
  11. package/esm/index.js +4 -2
  12. package/esm/live-query/data-provider-live-query-storage.d.ts +23 -0
  13. package/esm/live-query/data-provider-live-query-storage.js +78 -0
  14. package/esm/myLog.d.ts +1 -0
  15. package/esm/myLog.js +5 -0
  16. package/esm/postgres/postgres-data-provider.d.ts +4 -2
  17. package/esm/postgres/postgres-data-provider.js +18 -6
  18. package/esm/postgres/schema-builder.d.ts +2 -1
  19. package/esm/postgres/schema-builder.js +49 -29
  20. package/esm/remult-knex/index.d.ts +10 -32
  21. package/esm/remult-knex/index.js +75 -51
  22. package/esm/remult-mongo.d.ts +9 -2
  23. package/esm/remult-mongo.js +24 -8
  24. package/esm/remult-next.d.ts +11 -0
  25. package/esm/remult-next.js +27 -0
  26. package/esm/server/core.d.ts +2 -0
  27. package/esm/server/core.js +2 -0
  28. package/esm/server/expressBridge.d.ts +19 -7
  29. package/esm/server/expressBridge.js +135 -31
  30. package/esm/server/index.d.ts +2 -1
  31. package/esm/server/index.js +2 -1
  32. package/esm/server/initDataProvider.d.ts +2 -0
  33. package/esm/server/initDataProvider.js +14 -0
  34. package/esm/src/buildRestDataProvider.d.ts +31 -0
  35. package/esm/src/buildRestDataProvider.js +110 -0
  36. package/esm/src/column-interfaces.d.ts +44 -8
  37. package/esm/src/column.d.ts +3 -3
  38. package/esm/src/context.d.ts +39 -36
  39. package/esm/src/context.js +87 -117
  40. package/esm/src/data-api.d.ts +9 -3
  41. package/esm/src/data-api.js +130 -63
  42. package/esm/src/data-interfaces.d.ts +5 -1
  43. package/esm/src/data-providers/array-entity-data-provider.d.ts +1 -1
  44. package/esm/src/data-providers/array-entity-data-provider.js +2 -17
  45. package/esm/src/data-providers/rest-data-provider.d.ts +4 -3
  46. package/esm/src/data-providers/rest-data-provider.js +64 -23
  47. package/esm/src/data-providers/sql-database.d.ts +7 -3
  48. package/esm/src/data-providers/sql-database.js +60 -17
  49. package/esm/src/data-providers/web-sql-data-provider.d.ts +3 -0
  50. package/esm/src/data-providers/web-sql-data-provider.js +23 -9
  51. package/esm/src/entity.d.ts +2 -2
  52. package/esm/src/filter/filter-consumer-bridge-to-sql-request.d.ts +16 -16
  53. package/esm/src/filter/filter-consumer-bridge-to-sql-request.js +29 -21
  54. package/esm/src/filter/filter-interfaces.d.ts +5 -5
  55. package/esm/src/filter/filter-interfaces.js +31 -26
  56. package/esm/src/live-query/LiveQueryClient.d.ts +1 -0
  57. package/esm/src/live-query/LiveQueryClient.js +184 -0
  58. package/esm/src/live-query/SseSubscriptionClient.d.ts +5 -0
  59. package/esm/src/live-query/SseSubscriptionClient.js +86 -0
  60. package/esm/src/live-query/SubscriptionChannel.d.ts +41 -0
  61. package/esm/src/live-query/SubscriptionChannel.js +121 -0
  62. package/esm/src/live-query/SubscriptionServer.d.ts +38 -0
  63. package/esm/src/live-query/SubscriptionServer.js +108 -0
  64. package/esm/src/remult-proxy.d.ts +1 -1
  65. package/esm/src/remult-proxy.js +52 -7
  66. package/esm/src/remult3/RepositoryImplementation.d.ts +14 -5
  67. package/esm/src/remult3/RepositoryImplementation.js +124 -44
  68. package/esm/src/remult3/getId.d.ts +2 -0
  69. package/esm/src/remult3/getId.js +7 -0
  70. package/esm/src/remult3/remult3.d.ts +67 -10
  71. package/esm/src/remult3/remult3.js +1 -0
  72. package/esm/src/server-action.d.ts +5 -1
  73. package/esm/src/server-action.js +11 -12
  74. package/esm/src/shared-tests/db-tests-setup.d.ts +12 -5
  75. package/esm/src/shared-tests/db-tests-setup.js +14 -6
  76. package/esm/src/shared-tests/db-tests.db-tests.js +71 -10
  77. package/esm/src/sort.d.ts +1 -0
  78. package/esm/src/sort.js +18 -0
  79. package/esm/src/sql-command.d.ts +5 -2
  80. package/esm/src/tests/entityForCustomFilter.d.ts +6 -6
  81. package/esm/src/tests/entityForCustomFilter.js +20 -21
  82. package/esm/src/tests/frontend-database-tests-setup.spec.js +3 -4
  83. package/esm/src/tests/testHelper.spec.d.ts +3 -1
  84. package/esm/src/tests/testHelper.spec.js +63 -60
  85. package/esm/src/valueConverters.js +15 -7
  86. package/graphql.js +0 -1
  87. package/index.d.ts +7 -4
  88. package/index.js +7 -3
  89. package/live-query/data-provider-live-query-storage.d.ts +23 -0
  90. package/live-query/data-provider-live-query-storage.js +236 -0
  91. package/myLog.d.ts +1 -0
  92. package/myLog.js +20 -0
  93. package/package.json +18 -1
  94. package/postgres/postgres-data-provider.d.ts +4 -2
  95. package/postgres/postgres-data-provider.js +54 -39
  96. package/postgres/schema-builder.d.ts +2 -1
  97. package/postgres/schema-builder.js +118 -70
  98. package/remult-express.js +1 -1
  99. package/remult-knex/index.d.ts +10 -32
  100. package/remult-knex/index.js +134 -87
  101. package/remult-mongo.d.ts +9 -2
  102. package/remult-mongo.js +39 -7
  103. package/remult-next.d.ts +11 -0
  104. package/remult-next.js +73 -0
  105. package/server/JsonEntityFileStorage.js +2 -2
  106. package/server/core.d.ts +2 -0
  107. package/server/core.js +5 -1
  108. package/server/expressBridge.d.ts +19 -7
  109. package/server/expressBridge.js +283 -69
  110. package/server/index.d.ts +2 -1
  111. package/server/index.js +3 -1
  112. package/server/initDataProvider.d.ts +2 -0
  113. package/server/initDataProvider.js +26 -0
  114. package/src/buildRestDataProvider.d.ts +31 -0
  115. package/src/buildRestDataProvider.js +162 -0
  116. package/src/column-interfaces.d.ts +44 -8
  117. package/src/column.d.ts +3 -3
  118. package/src/context.d.ts +39 -36
  119. package/src/context.js +171 -166
  120. package/src/data-api.d.ts +9 -3
  121. package/src/data-api.js +233 -88
  122. package/src/data-interfaces.d.ts +5 -1
  123. package/src/data-providers/array-entity-data-provider.d.ts +1 -1
  124. package/src/data-providers/array-entity-data-provider.js +2 -17
  125. package/src/data-providers/rest-data-provider.d.ts +4 -3
  126. package/src/data-providers/rest-data-provider.js +105 -39
  127. package/src/data-providers/sql-database.d.ts +7 -3
  128. package/src/data-providers/sql-database.js +89 -16
  129. package/src/data-providers/web-sql-data-provider.d.ts +3 -0
  130. package/src/data-providers/web-sql-data-provider.js +56 -11
  131. package/src/entity.d.ts +2 -2
  132. package/src/filter/filter-consumer-bridge-to-sql-request.d.ts +16 -16
  133. package/src/filter/filter-consumer-bridge-to-sql-request.js +59 -50
  134. package/src/filter/filter-interfaces.d.ts +5 -5
  135. package/src/filter/filter-interfaces.js +31 -26
  136. package/src/live-query/LiveQueryClient.d.ts +1 -0
  137. package/src/live-query/LiveQueryClient.js +283 -0
  138. package/src/live-query/SseSubscriptionClient.d.ts +5 -0
  139. package/src/live-query/SseSubscriptionClient.js +150 -0
  140. package/src/live-query/SubscriptionChannel.d.ts +41 -0
  141. package/src/live-query/SubscriptionChannel.js +209 -0
  142. package/src/live-query/SubscriptionServer.d.ts +38 -0
  143. package/src/live-query/SubscriptionServer.js +258 -0
  144. package/src/remult-proxy.d.ts +1 -1
  145. package/src/remult-proxy.js +153 -8
  146. package/src/remult3/RepositoryImplementation.d.ts +14 -5
  147. package/src/remult3/RepositoryImplementation.js +200 -85
  148. package/src/remult3/getId.d.ts +2 -0
  149. package/src/remult3/getId.js +11 -0
  150. package/src/remult3/remult3.d.ts +67 -10
  151. package/src/remult3/remult3.js +1 -0
  152. package/src/server-action.d.ts +5 -1
  153. package/src/server-action.js +11 -11
  154. package/src/shared-tests/db-tests-setup.d.ts +12 -5
  155. package/src/shared-tests/db-tests-setup.js +17 -8
  156. package/src/shared-tests/db-tests.db-tests.js +140 -8
  157. package/src/sort.d.ts +1 -0
  158. package/src/sort.js +18 -0
  159. package/src/sql-command.d.ts +5 -2
  160. package/src/tests/entityForCustomFilter.d.ts +6 -6
  161. package/src/tests/entityForCustomFilter.js +30 -31
  162. package/src/tests/frontend-database-tests-setup.spec.js +5 -6
  163. package/src/tests/testHelper.spec.d.ts +3 -1
  164. package/src/tests/testHelper.spec.js +104 -100
  165. package/src/valueConverters.js +15 -7
@@ -0,0 +1,283 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LiveQueryClient = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var rest_data_provider_1 = require("../data-providers/rest-data-provider");
6
+ var buildRestDataProvider_1 = require("../buildRestDataProvider");
7
+ var SubscriptionChannel_1 = require("./SubscriptionChannel");
8
+ /* @internal*/
9
+ var LiveQueryClient = /** @class */ (function () {
10
+ function LiveQueryClient(apiProvider, getUserId) {
11
+ this.apiProvider = apiProvider;
12
+ this.getUserId = getUserId;
13
+ this.queries = new Map();
14
+ this.channels = new Map();
15
+ }
16
+ LiveQueryClient.prototype.wrapMessageHandling = function (handleMessage) {
17
+ var x = this.apiProvider().wrapMessageHandling;
18
+ if (x)
19
+ x(handleMessage);
20
+ else
21
+ handleMessage();
22
+ };
23
+ ;
24
+ LiveQueryClient.prototype.runPromise = function (p) {
25
+ return p;
26
+ };
27
+ LiveQueryClient.prototype.close = function () {
28
+ this.queries.clear();
29
+ this.channels.clear();
30
+ this.closeIfNoListeners();
31
+ };
32
+ LiveQueryClient.prototype.subscribeChannel = function (key, onResult) {
33
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
34
+ var onUnsubscribe, client, q_1, _a, err_1, err_2;
35
+ var _this = this;
36
+ return tslib_1.__generator(this, function (_b) {
37
+ switch (_b.label) {
38
+ case 0:
39
+ onUnsubscribe = function () { };
40
+ return [4 /*yield*/, this.openIfNoOpened()];
41
+ case 1:
42
+ client = _b.sent();
43
+ _b.label = 2;
44
+ case 2:
45
+ _b.trys.push([2, 7, , 8]);
46
+ q_1 = this.channels.get(key);
47
+ if (!!q_1) return [3 /*break*/, 6];
48
+ this.channels.set(key, q_1 = new MessageChannel());
49
+ _b.label = 3;
50
+ case 3:
51
+ _b.trys.push([3, 5, , 6]);
52
+ _a = q_1;
53
+ return [4 /*yield*/, client.subscribe(key, function (value) { return _this.wrapMessageHandling(function () { return q_1.handle(value); }); }, function (err) {
54
+ onResult.error(err);
55
+ })];
56
+ case 4:
57
+ _a.unsubscribe = _b.sent();
58
+ return [3 /*break*/, 6];
59
+ case 5:
60
+ err_1 = _b.sent();
61
+ onResult.error(err_1);
62
+ throw err_1;
63
+ case 6:
64
+ q_1.listeners.push(onResult);
65
+ onUnsubscribe = function () {
66
+ q_1.listeners.splice(q_1.listeners.indexOf(onResult), 1);
67
+ if (q_1.listeners.length == 0) {
68
+ _this.channels.delete(key);
69
+ q_1.unsubscribe();
70
+ }
71
+ _this.closeIfNoListeners();
72
+ };
73
+ return [3 /*break*/, 8];
74
+ case 7:
75
+ err_2 = _b.sent();
76
+ onResult.error(err_2);
77
+ throw err_2;
78
+ case 8: return [2 /*return*/, function () {
79
+ onUnsubscribe();
80
+ onUnsubscribe = function () { };
81
+ }];
82
+ }
83
+ });
84
+ });
85
+ };
86
+ LiveQueryClient.prototype.closeIfNoListeners = function () {
87
+ if (this.client)
88
+ if (this.queries.size === 0 && this.channels.size === 0) {
89
+ this.runPromise(this.client.then(function (x) { return x.close(); }));
90
+ this.client = undefined;
91
+ clearInterval(this.interval);
92
+ this.interval = undefined;
93
+ }
94
+ };
95
+ LiveQueryClient.prototype.subscribe = function (repo, options, listener) {
96
+ var _this = this;
97
+ var alive = true;
98
+ var onUnsubscribe = function () { alive = false; };
99
+ this.runPromise(repo.buildEntityDataProviderFindOptions(options)
100
+ .then(function (opts) {
101
+ if (!alive)
102
+ return;
103
+ var _a = new rest_data_provider_1.RestDataProvider(_this.apiProvider).getEntityDataProvider(repo.metadata).buildFindRequest(opts), createKey = _a.createKey, subscribe = _a.subscribe;
104
+ var eventTypeKey = createKey();
105
+ var q = _this.queries.get(eventTypeKey);
106
+ if (!q) {
107
+ _this.queries.set(eventTypeKey, q = new SubscriptionChannel_1.LiveQuerySubscriber(repo, { entityKey: repo.metadata.key, orderBy: options.orderBy }, _this.getUserId()));
108
+ q.subscribeCode = function () {
109
+ if (q.unsubscribe) {
110
+ q.unsubscribe();
111
+ q.unsubscribe = function () { };
112
+ }
113
+ _this.runPromise(_this.subscribeChannel(q.queryChannel, {
114
+ next: function (value) { return _this.runPromise(q.handle(value)); },
115
+ complete: function () { },
116
+ error: function (er) {
117
+ q.listeners.forEach(function (l) { return l.error(er); });
118
+ }
119
+ }).then(function (unsubscribeToChannel) {
120
+ if (q.listeners.length == 0) {
121
+ unsubscribeToChannel();
122
+ return;
123
+ }
124
+ _this.runPromise(subscribe(q.id)
125
+ .then(function (r) {
126
+ if (q.listeners.length === 0) {
127
+ r.unsubscribe();
128
+ unsubscribeToChannel();
129
+ return;
130
+ }
131
+ _this.runPromise(q.setAllItems(r.result));
132
+ q.unsubscribe = function () {
133
+ q.unsubscribe = function () { };
134
+ unsubscribeToChannel();
135
+ _this.runPromise(r.unsubscribe());
136
+ };
137
+ })
138
+ .catch(function (err) {
139
+ listener.error(err);
140
+ }));
141
+ })).catch(function (err) {
142
+ q.listeners.forEach(function (l) { return l.error(err); });
143
+ });
144
+ };
145
+ q.subscribeCode();
146
+ }
147
+ else {
148
+ q.sendDefaultState(listener.next);
149
+ }
150
+ q.listeners.push(listener);
151
+ onUnsubscribe = function () {
152
+ q.listeners.splice(q.listeners.indexOf(listener), 1);
153
+ listener.complete();
154
+ if (q.listeners.length == 0) {
155
+ _this.queries.delete(eventTypeKey);
156
+ q.unsubscribe();
157
+ }
158
+ _this.closeIfNoListeners();
159
+ };
160
+ })
161
+ .catch(function (err) {
162
+ listener.error(err);
163
+ }));
164
+ return function () {
165
+ onUnsubscribe();
166
+ };
167
+ };
168
+ LiveQueryClient.prototype.openIfNoOpened = function () {
169
+ var _this = this;
170
+ if (!this.client) {
171
+ this.interval = setInterval(function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
172
+ var ids, _a, _b, q, p_1, actionInfo, invalidIds, _c, invalidIds_1, invalidIds_1_1, id, _d, _e, q;
173
+ var e_1, _f, e_2, _g, e_3, _h;
174
+ return tslib_1.__generator(this, function (_j) {
175
+ switch (_j.label) {
176
+ case 0:
177
+ ids = [];
178
+ try {
179
+ for (_a = tslib_1.__values(this.queries.values()), _b = _a.next(); !_b.done; _b = _a.next()) {
180
+ q = _b.value;
181
+ ids.push(q.queryChannel);
182
+ }
183
+ }
184
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
185
+ finally {
186
+ try {
187
+ if (_b && !_b.done && (_f = _a.return)) _f.call(_a);
188
+ }
189
+ finally { if (e_1) throw e_1.error; }
190
+ }
191
+ if (!(ids.length > 0)) return [3 /*break*/, 4];
192
+ p_1 = this.apiProvider();
193
+ return [4 /*yield*/, Promise.resolve().then(function () { return tslib_1.__importStar(require('../server-action')); })];
194
+ case 1:
195
+ actionInfo = (_j.sent()).actionInfo;
196
+ _c = this.runPromise;
197
+ return [4 /*yield*/, actionInfo.runActionWithoutBlockingUI(function () { return buildRestDataProvider_1.buildRestDataProvider(p_1.httpClient).post(p_1.url + '/' + SubscriptionChannel_1.liveQueryKeepAliveRoute, ids); })];
198
+ case 2: return [4 /*yield*/, _c.apply(this, [_j.sent()])];
199
+ case 3:
200
+ invalidIds = _j.sent();
201
+ try {
202
+ for (invalidIds_1 = tslib_1.__values(invalidIds), invalidIds_1_1 = invalidIds_1.next(); !invalidIds_1_1.done; invalidIds_1_1 = invalidIds_1.next()) {
203
+ id = invalidIds_1_1.value;
204
+ try {
205
+ for (_d = (e_3 = void 0, tslib_1.__values(this.queries.values())), _e = _d.next(); !_e.done; _e = _d.next()) {
206
+ q = _e.value;
207
+ if (q.queryChannel === id)
208
+ q.subscribeCode();
209
+ }
210
+ }
211
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
212
+ finally {
213
+ try {
214
+ if (_e && !_e.done && (_h = _d.return)) _h.call(_d);
215
+ }
216
+ finally { if (e_3) throw e_3.error; }
217
+ }
218
+ }
219
+ }
220
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
221
+ finally {
222
+ try {
223
+ if (invalidIds_1_1 && !invalidIds_1_1.done && (_g = invalidIds_1.return)) _g.call(invalidIds_1);
224
+ }
225
+ finally { if (e_2) throw e_2.error; }
226
+ }
227
+ _j.label = 4;
228
+ case 4: return [2 /*return*/];
229
+ }
230
+ });
231
+ }); }, 30000);
232
+ return this.runPromise(this.client =
233
+ this.apiProvider().subscriptionClient.openConnection(function () {
234
+ var e_4, _a;
235
+ try {
236
+ for (var _b = tslib_1.__values(_this.queries.values()), _c = _b.next(); !_c.done; _c = _b.next()) {
237
+ var q = _c.value;
238
+ q.subscribeCode();
239
+ }
240
+ }
241
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
242
+ finally {
243
+ try {
244
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
245
+ }
246
+ finally { if (e_4) throw e_4.error; }
247
+ }
248
+ }));
249
+ }
250
+ return this.client;
251
+ };
252
+ return LiveQueryClient;
253
+ }());
254
+ exports.LiveQueryClient = LiveQueryClient;
255
+ var MessageChannel = /** @class */ (function () {
256
+ function MessageChannel() {
257
+ this.unsubscribe = function () { };
258
+ this.listeners = [];
259
+ }
260
+ MessageChannel.prototype.handle = function (message) {
261
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
262
+ var _a, _b, l;
263
+ var e_5, _c;
264
+ return tslib_1.__generator(this, function (_d) {
265
+ try {
266
+ for (_a = tslib_1.__values(this.listeners), _b = _a.next(); !_b.done; _b = _a.next()) {
267
+ l = _b.value;
268
+ l.next(message);
269
+ }
270
+ }
271
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
272
+ finally {
273
+ try {
274
+ if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
275
+ }
276
+ finally { if (e_5) throw e_5.error; }
277
+ }
278
+ return [2 /*return*/];
279
+ });
280
+ });
281
+ };
282
+ return MessageChannel;
283
+ }());
@@ -0,0 +1,5 @@
1
+ import { SubscriptionClient, SubscriptionClientConnection } from "./SubscriptionChannel";
2
+ export declare class SseSubscriptionClient implements SubscriptionClient {
3
+ openConnection(onReconnect: VoidFunction): Promise<SubscriptionClientConnection>;
4
+ }
5
+ export declare const ConnectionNotFoundError = "client connection not found";
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConnectionNotFoundError = exports.SseSubscriptionClient = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var buildRestDataProvider_1 = require("../buildRestDataProvider");
6
+ var remult_proxy_1 = require("../remult-proxy");
7
+ var server_action_1 = require("../server-action");
8
+ var SubscriptionChannel_1 = require("./SubscriptionChannel");
9
+ var SseSubscriptionClient = /** @class */ (function () {
10
+ function SseSubscriptionClient() {
11
+ }
12
+ SseSubscriptionClient.prototype.openConnection = function (onReconnect) {
13
+ var connectionId;
14
+ var channels = new Map();
15
+ var provider = buildRestDataProvider_1.buildRestDataProvider(remult_proxy_1.remult.apiClient.httpClient);
16
+ var connected = false;
17
+ var source;
18
+ var client = {
19
+ close: function () {
20
+ source.close();
21
+ },
22
+ subscribe: function (channel, handler) {
23
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
24
+ var listeners;
25
+ return tslib_1.__generator(this, function (_a) {
26
+ switch (_a.label) {
27
+ case 0:
28
+ listeners = channels.get(channel);
29
+ if (!!listeners) return [3 /*break*/, 2];
30
+ channels.set(channel, listeners = []);
31
+ return [4 /*yield*/, subscribeToChannel(channel)];
32
+ case 1:
33
+ _a.sent();
34
+ _a.label = 2;
35
+ case 2:
36
+ listeners.push(handler);
37
+ return [2 /*return*/, function () {
38
+ listeners.splice(listeners.indexOf(handler, 1));
39
+ if (listeners.length == 0) {
40
+ server_action_1.actionInfo.runActionWithoutBlockingUI(function () { return provider.post(remult_proxy_1.remult.apiClient.url + '/' + SubscriptionChannel_1.streamUrl + '/unsubscribe', {
41
+ channel: channel,
42
+ clientId: connectionId
43
+ }); });
44
+ channels.delete(channel);
45
+ }
46
+ }];
47
+ }
48
+ });
49
+ });
50
+ },
51
+ };
52
+ var createConnectionPromise = function () { return new Promise(function (res) {
53
+ createConnection();
54
+ function createConnection() {
55
+ var _this = this;
56
+ if (source)
57
+ source.close();
58
+ source = new EventSource(remult_proxy_1.remult.apiClient.url + '/' + SubscriptionChannel_1.streamUrl, {
59
+ withCredentials: true
60
+ });
61
+ source.onmessage = function (e) {
62
+ var message = JSON.parse(e.data);
63
+ var listeners = channels.get(message.channel);
64
+ if (listeners)
65
+ listeners.forEach(function (x) { return x(message.data); });
66
+ };
67
+ source.onerror = function (e) {
68
+ console.error("Live Query Event Source Error", e);
69
+ source.close();
70
+ setTimeout(function () {
71
+ createConnection();
72
+ }, 500);
73
+ };
74
+ source.addEventListener("connectionId", function (e) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
75
+ var _a, _b, channel, e_1_1;
76
+ var e_1, _c;
77
+ return tslib_1.__generator(this, function (_d) {
78
+ switch (_d.label) {
79
+ case 0:
80
+ //@ts-ignore
81
+ connectionId = e.data;
82
+ if (!connected) return [3 /*break*/, 9];
83
+ _d.label = 1;
84
+ case 1:
85
+ _d.trys.push([1, 6, 7, 8]);
86
+ _a = tslib_1.__values(channels.keys()), _b = _a.next();
87
+ _d.label = 2;
88
+ case 2:
89
+ if (!!_b.done) return [3 /*break*/, 5];
90
+ channel = _b.value;
91
+ return [4 /*yield*/, subscribeToChannel(channel)];
92
+ case 3:
93
+ _d.sent();
94
+ _d.label = 4;
95
+ case 4:
96
+ _b = _a.next();
97
+ return [3 /*break*/, 2];
98
+ case 5: return [3 /*break*/, 8];
99
+ case 6:
100
+ e_1_1 = _d.sent();
101
+ e_1 = { error: e_1_1 };
102
+ return [3 /*break*/, 8];
103
+ case 7:
104
+ try {
105
+ if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
106
+ }
107
+ finally { if (e_1) throw e_1.error; }
108
+ return [7 /*endfinally*/];
109
+ case 8:
110
+ onReconnect();
111
+ return [3 /*break*/, 10];
112
+ case 9:
113
+ connected = true;
114
+ res(client);
115
+ _d.label = 10;
116
+ case 10: return [2 /*return*/];
117
+ }
118
+ });
119
+ }); });
120
+ }
121
+ }); };
122
+ return createConnectionPromise();
123
+ function subscribeToChannel(channel) {
124
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
125
+ var result;
126
+ return tslib_1.__generator(this, function (_a) {
127
+ switch (_a.label) {
128
+ case 0: return [4 /*yield*/, server_action_1.actionInfo.runActionWithoutBlockingUI(function () {
129
+ return provider.post(remult_proxy_1.remult.apiClient.url + '/' + SubscriptionChannel_1.streamUrl + '/subscribe', {
130
+ channel: channel,
131
+ clientId: connectionId
132
+ });
133
+ })];
134
+ case 1:
135
+ result = _a.sent();
136
+ if (!(result === exports.ConnectionNotFoundError)) return [3 /*break*/, 3];
137
+ return [4 /*yield*/, createConnectionPromise()];
138
+ case 2:
139
+ _a.sent();
140
+ _a.label = 3;
141
+ case 3: return [2 /*return*/];
142
+ }
143
+ });
144
+ });
145
+ }
146
+ };
147
+ return SseSubscriptionClient;
148
+ }());
149
+ exports.SseSubscriptionClient = SseSubscriptionClient;
150
+ exports.ConnectionNotFoundError = "client connection not found";
@@ -0,0 +1,41 @@
1
+ import { Remult } from '../../index';
2
+ export declare const streamUrl = "stream";
3
+ export interface SubscriptionListener<type> {
4
+ next(message: type): void;
5
+ error(err: any): void;
6
+ complete(): void;
7
+ }
8
+ export declare type Unsubscribe = VoidFunction;
9
+ export interface SubscriptionClientConnection {
10
+ subscribe(channel: string, onMessage: (message: any) => void, onError: (err: any) => void): Promise<Unsubscribe>;
11
+ close(): void;
12
+ }
13
+ export interface SubscriptionClient {
14
+ openConnection(onReconnect: VoidFunction): Promise<SubscriptionClientConnection>;
15
+ }
16
+ export declare const liveQueryKeepAliveRoute = "_liveQueryKeepAlive";
17
+ export declare type LiveQueryChange = {
18
+ type: "all";
19
+ data: any[];
20
+ } | {
21
+ type: "add";
22
+ data: any;
23
+ } | {
24
+ type: 'replace';
25
+ data: {
26
+ oldId: any;
27
+ item: any;
28
+ };
29
+ } | {
30
+ type: "remove";
31
+ data: {
32
+ id: any;
33
+ };
34
+ };
35
+ export declare class SubscriptionChannel<messageType> {
36
+ channelKey: string;
37
+ constructor(channelKey: string);
38
+ publish(message: messageType, remult?: Remult): void;
39
+ subscribe(next: (message: messageType) => void, remult?: Remult): any;
40
+ subscribe(listener: Partial<SubscriptionListener<messageType>>): any;
41
+ }