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
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.JobsInQueueEntity = exports.EntityQueueStorage = exports.RemultAsyncLocalStorage = exports.createRemultServerCore = void 0;
3
+ exports.JobsInQueueEntity = exports.EntityQueueStorage = exports.RemultServerImplementation = exports.RemultAsyncLocalStorage = exports.createRemultServerCore = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  var server_action_1 = require("../src/server-action");
6
6
  var data_api_1 = require("../src/data-api");
@@ -8,12 +8,19 @@ var context_1 = require("../src/context");
8
8
  var remult3_1 = require("../src/remult3");
9
9
  var id_entity_1 = require("../src/id-entity");
10
10
  var remult_proxy_1 = require("../src/remult-proxy");
11
+ var SubscriptionServer_1 = require("../src/live-query/SubscriptionServer");
12
+ var SubscriptionChannel_1 = require("../src/live-query/SubscriptionChannel");
13
+ var initDataProvider_1 = require("./initDataProvider");
14
+ var SseSubscriptionServer_1 = require("../SseSubscriptionServer");
11
15
  ;
12
16
  function createRemultServerCore(options) {
13
17
  var _this = this;
14
18
  if (!options) {
15
19
  options = {};
16
20
  }
21
+ if (!options.subscriptionServer) {
22
+ options.subscriptionServer = new SseSubscriptionServer_1.SseSubscriptionServer();
23
+ }
17
24
  if (options.logApiEndPoints === undefined)
18
25
  options.logApiEndPoints = true;
19
26
  server_action_1.actionInfo.runningOnServer = true;
@@ -23,51 +30,116 @@ function createRemultServerCore(options) {
23
30
  if (!options.queueStorage) {
24
31
  options.queueStorage = new InMemoryQueueStorage();
25
32
  }
26
- var dataProvider;
27
- if (typeof options.dataProvider === "function") {
28
- dataProvider = options.dataProvider();
29
- }
30
- else
31
- dataProvider = Promise.resolve(options.dataProvider);
33
+ var dataProvider = initDataProvider_1.initDataProvider(options.dataProvider);
34
+ if (options.ensureSchema === undefined)
35
+ options.ensureSchema = true;
36
+ RemultAsyncLocalStorage.enable();
32
37
  dataProvider = dataProvider.then(function (dp) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
38
+ var remult;
39
+ var _this = this;
33
40
  return tslib_1.__generator(this, function (_a) {
34
41
  switch (_a.label) {
35
42
  case 0:
36
- if (dp)
37
- return [2 /*return*/, dp];
38
- return [4 /*yield*/, Promise.resolve().then(function () { return require('./JsonEntityFileStorage'); })];
39
- case 1: return [2 /*return*/, new (_a.sent()).JsonFileDataProvider('./db')];
43
+ remult = new context_1.Remult(dp);
44
+ return [4 /*yield*/, new Promise(function (res) {
45
+ RemultAsyncLocalStorage.instance.run(remult, function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
46
+ var started_1, startConsoleLog, entitiesMetadata, _a, _b, item, e_1_1;
47
+ var e_1, _c;
48
+ return tslib_1.__generator(this, function (_d) {
49
+ switch (_d.label) {
50
+ case 0:
51
+ if (!options.ensureSchema) return [3 /*break*/, 10];
52
+ started_1 = false;
53
+ startConsoleLog = function () {
54
+ if (started_1)
55
+ return;
56
+ started_1 = true;
57
+ console.time("Ensure Schema");
58
+ };
59
+ if (!dp.ensureSchema) return [3 /*break*/, 2];
60
+ startConsoleLog();
61
+ entitiesMetadata = options.entities.map(function (e) { return remult.repo(e).metadata; });
62
+ return [4 /*yield*/, dp.ensureSchema(entitiesMetadata)];
63
+ case 1:
64
+ _d.sent();
65
+ _d.label = 2;
66
+ case 2:
67
+ _d.trys.push([2, 7, 8, 9]);
68
+ _a = tslib_1.__values([options.liveQueryStorage, options.queueStorage]), _b = _a.next();
69
+ _d.label = 3;
70
+ case 3:
71
+ if (!!_b.done) return [3 /*break*/, 6];
72
+ item = _b.value;
73
+ if (!(item === null || item === void 0 ? void 0 : item.ensureSchema)) return [3 /*break*/, 5];
74
+ startConsoleLog();
75
+ return [4 /*yield*/, item.ensureSchema()];
76
+ case 4:
77
+ _d.sent();
78
+ _d.label = 5;
79
+ case 5:
80
+ _b = _a.next();
81
+ return [3 /*break*/, 3];
82
+ case 6: return [3 /*break*/, 9];
83
+ case 7:
84
+ e_1_1 = _d.sent();
85
+ e_1 = { error: e_1_1 };
86
+ return [3 /*break*/, 9];
87
+ case 8:
88
+ try {
89
+ if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
90
+ }
91
+ finally { if (e_1) throw e_1.error; }
92
+ return [7 /*endfinally*/];
93
+ case 9:
94
+ if (started_1)
95
+ console.timeEnd("Ensure Schema");
96
+ _d.label = 10;
97
+ case 10:
98
+ if (!options.initApi) return [3 /*break*/, 12];
99
+ return [4 /*yield*/, options.initApi(remult)];
100
+ case 11:
101
+ _d.sent();
102
+ _d.label = 12;
103
+ case 12:
104
+ res({});
105
+ return [2 /*return*/];
106
+ }
107
+ });
108
+ }); });
109
+ })];
110
+ case 1:
111
+ _a.sent();
112
+ return [2 /*return*/, dp];
40
113
  }
41
114
  });
42
115
  }); });
43
- RemultAsyncLocalStorage.enable();
44
- if (options.initApi) {
45
- dataProvider = dataProvider.then(function (dp) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
46
- var remult;
47
- var _this = this;
48
- return tslib_1.__generator(this, function (_a) {
49
- switch (_a.label) {
50
- case 0:
51
- remult = new context_1.Remult(dp);
52
- return [4 /*yield*/, new Promise(function (res) {
53
- RemultAsyncLocalStorage.instance.run(remult, function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
54
- return tslib_1.__generator(this, function (_a) {
55
- switch (_a.label) {
56
- case 0: return [4 /*yield*/, options.initApi(remult)];
57
- case 1:
58
- _a.sent();
59
- res({});
60
- return [2 /*return*/];
61
- }
62
- });
63
- }); });
64
- })];
65
- case 1:
66
- _a.sent();
67
- return [2 /*return*/, dp];
116
+ if (!options.requestSerializer) {
117
+ options.requestSerializer = {
118
+ toJson: function (x) {
119
+ var e_2, _a;
120
+ var r = {
121
+ url: x.url
122
+ };
123
+ try {
124
+ for (var _b = tslib_1.__values(['session', 'auth', 'user']), _c = _b.next(); !_c.done; _c = _b.next()) {
125
+ var key = _c.value;
126
+ if (x[key])
127
+ r[key] = x[key];
128
+ }
68
129
  }
69
- });
70
- }); });
130
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
131
+ finally {
132
+ try {
133
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
134
+ }
135
+ finally { if (e_2) throw e_2.error; }
136
+ }
137
+ return r;
138
+ },
139
+ fromJson: function (x) {
140
+ return x;
141
+ }
142
+ };
71
143
  }
72
144
  {
73
145
  var allControllers = [];
@@ -119,16 +191,90 @@ var RemultAsyncLocalStorage = /** @class */ (function () {
119
191
  return RemultAsyncLocalStorage;
120
192
  }());
121
193
  exports.RemultAsyncLocalStorage = RemultAsyncLocalStorage;
194
+ /* @internal*/
122
195
  var RemultServerImplementation = /** @class */ (function () {
123
196
  function RemultServerImplementation(queue, options, dataProvider) {
197
+ var _this = this;
124
198
  this.queue = queue;
125
199
  this.options = options;
126
200
  this.dataProvider = dataProvider;
201
+ this.liveQueryStorage = new SubscriptionServer_1.InMemoryLiveQueryStorage();
202
+ this.runWithRequest = function (req, entityKey, what) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
203
+ var _loop_1, _a, _b, e, state_1, e_3_1;
204
+ var e_3, _c;
205
+ var _this = this;
206
+ return tslib_1.__generator(this, function (_d) {
207
+ switch (_d.label) {
208
+ case 0:
209
+ _loop_1 = function (e) {
210
+ var key;
211
+ return tslib_1.__generator(this, function (_a) {
212
+ switch (_a.label) {
213
+ case 0:
214
+ key = remult3_1.getEntityKey(e);
215
+ if (!(key === entityKey)) return [3 /*break*/, 2];
216
+ return [4 /*yield*/, new Promise(function (result) {
217
+ _this.withRemult(_this.options.requestSerializer.fromJson(req), undefined, function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
218
+ return tslib_1.__generator(this, function (_a) {
219
+ switch (_a.label) {
220
+ case 0: return [4 /*yield*/, what(remult_proxy_1.remult.repo(e))];
221
+ case 1:
222
+ _a.sent();
223
+ result({});
224
+ return [2 /*return*/];
225
+ }
226
+ });
227
+ }); });
228
+ })];
229
+ case 1:
230
+ _a.sent();
231
+ return [2 /*return*/, { value: void 0 }];
232
+ case 2: return [2 /*return*/];
233
+ }
234
+ });
235
+ };
236
+ _d.label = 1;
237
+ case 1:
238
+ _d.trys.push([1, 6, 7, 8]);
239
+ _a = tslib_1.__values(this.options.entities), _b = _a.next();
240
+ _d.label = 2;
241
+ case 2:
242
+ if (!!_b.done) return [3 /*break*/, 5];
243
+ e = _b.value;
244
+ return [5 /*yield**/, _loop_1(e)];
245
+ case 3:
246
+ state_1 = _d.sent();
247
+ if (typeof state_1 === "object")
248
+ return [2 /*return*/, state_1.value];
249
+ _d.label = 4;
250
+ case 4:
251
+ _b = _a.next();
252
+ return [3 /*break*/, 2];
253
+ case 5: return [3 /*break*/, 8];
254
+ case 6:
255
+ e_3_1 = _d.sent();
256
+ e_3 = { error: e_3_1 };
257
+ return [3 /*break*/, 8];
258
+ case 7:
259
+ try {
260
+ if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
261
+ }
262
+ finally { if (e_3) throw e_3.error; }
263
+ return [7 /*endfinally*/];
264
+ case 8: throw new Error("Couldn't find entity " + entityKey);
265
+ }
266
+ });
267
+ }); };
127
268
  this.registeredRouter = false;
128
269
  this.hasQueue = false;
129
270
  /* internal */
130
271
  this.backendMethodsOpenApi = [];
272
+ if (options.liveQueryStorage)
273
+ this.liveQueryStorage = options.liveQueryStorage;
274
+ if (options.subscriptionServer)
275
+ this.subscriptionServer = options.subscriptionServer;
131
276
  }
277
+ ;
132
278
  RemultServerImplementation.prototype.withRemult = function (req, res, next) {
133
279
  var _this = this;
134
280
  this.process(function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) {
@@ -136,15 +282,18 @@ var RemultServerImplementation = /** @class */ (function () {
136
282
  return [2 /*return*/];
137
283
  }); }); })(req, res);
138
284
  };
139
- RemultServerImplementation.prototype.handle = function (req, gRes) {
285
+ RemultServerImplementation.prototype.getRouteImpl = function () {
140
286
  if (!this.routeImpl) {
141
287
  this.routeImpl = new RouteImplementation();
142
288
  this.registerRouter(this.routeImpl);
143
289
  }
144
- return this.routeImpl.handle(req, gRes);
290
+ return this.routeImpl;
291
+ };
292
+ RemultServerImplementation.prototype.handle = function (req, gRes) {
293
+ return this.getRouteImpl().handle(req, gRes);
145
294
  };
146
295
  RemultServerImplementation.prototype.registerRouter = function (r) {
147
- var e_1, _a, e_2, _b;
296
+ var e_4, _a, e_5, _b;
148
297
  var _this = this;
149
298
  if (this.registeredRouter)
150
299
  throw "Router already registered";
@@ -156,7 +305,7 @@ var RemultServerImplementation = /** @class */ (function () {
156
305
  var z = c[server_action_1.classBackendMethodsArray];
157
306
  if (z)
158
307
  try {
159
- for (var z_1 = (e_2 = void 0, tslib_1.__values(z)), z_1_1 = z_1.next(); !z_1_1.done; z_1_1 = z_1.next()) {
308
+ for (var z_1 = (e_5 = void 0, tslib_1.__values(z)), z_1_1 = z_1.next(); !z_1_1.done; z_1_1 = z_1.next()) {
160
309
  var a = z_1_1.value;
161
310
  var x = a[server_action_1.serverActionField];
162
311
  if (!x) {
@@ -165,21 +314,21 @@ var RemultServerImplementation = /** @class */ (function () {
165
314
  this.addAction(x, r);
166
315
  }
167
316
  }
168
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
317
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
169
318
  finally {
170
319
  try {
171
320
  if (z_1_1 && !z_1_1.done && (_b = z_1.return)) _b.call(z_1);
172
321
  }
173
- finally { if (e_2) throw e_2.error; }
322
+ finally { if (e_5) throw e_5.error; }
174
323
  }
175
324
  }
176
325
  }
177
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
326
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
178
327
  finally {
179
328
  try {
180
329
  if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
181
330
  }
182
- finally { if (e_1) throw e_1.error; }
331
+ finally { if (e_4) throw e_4.error; }
183
332
  }
184
333
  if (this.hasQueue)
185
334
  this.addAction({
@@ -207,6 +356,40 @@ var RemultServerImplementation = /** @class */ (function () {
207
356
  },
208
357
  doWork: undefined
209
358
  }, r);
359
+ if (this.options.subscriptionServer instanceof SseSubscriptionServer_1.SseSubscriptionServer) {
360
+ var streamPath = this.options.rootPath + '/' + SubscriptionChannel_1.streamUrl;
361
+ r.route(streamPath).get(this.process(function (remult, req, res, origReq, origRes) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
362
+ return tslib_1.__generator(this, function (_a) {
363
+ remult.subscriptionServer.openHttpServerStream(origReq, origRes);
364
+ return [2 /*return*/];
365
+ });
366
+ }); }));
367
+ r.route(streamPath + '/subscribe').post(this.process(function (remult, req, res, origReq, origRes) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
368
+ return tslib_1.__generator(this, function (_a) {
369
+ remult.subscriptionServer.subscribeToChannel(origReq.body, res, remult);
370
+ return [2 /*return*/];
371
+ });
372
+ }); }));
373
+ r.route(streamPath + '/unsubscribe').post(this.process(function (remult, req, res, origReq, origRes) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
374
+ return tslib_1.__generator(this, function (_a) {
375
+ remult.subscriptionServer.subscribeToChannel(origReq.body, res, remult, true);
376
+ return [2 /*return*/];
377
+ });
378
+ }); }));
379
+ }
380
+ r.route(this.options.rootPath + '/' + SubscriptionChannel_1.liveQueryKeepAliveRoute).post(this.process(function (remult, req, res, origReq, origRes) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
381
+ var _a, _b;
382
+ return tslib_1.__generator(this, function (_c) {
383
+ switch (_c.label) {
384
+ case 0:
385
+ _b = (_a = res).success;
386
+ return [4 /*yield*/, remult.liveQueryStorage.keepAliveAndReturnUnknownQueryIds(origReq.body)];
387
+ case 1:
388
+ _b.apply(_a, [_c.sent()]);
389
+ return [2 /*return*/];
390
+ }
391
+ });
392
+ }); }));
210
393
  }
211
394
  this.options.entities.forEach(function (e) {
212
395
  var key = remult3_1.getEntityKey(e);
@@ -220,19 +403,22 @@ var RemultServerImplementation = /** @class */ (function () {
220
403
  var _this = this;
221
404
  var myRoute = this.options.rootPath + '/' + key;
222
405
  if (this.options.logApiEndPoints)
223
- console.log("[remult] " + myRoute);
406
+ console.info("[remult] " + myRoute);
224
407
  r.route(myRoute)
225
- .get(this.process(function (c, req, res) {
226
- return dataApiFactory(c).httpGet(res, req);
408
+ .get(this.process(function (c, req, res, orig) {
409
+ return dataApiFactory(c).httpGet(res, req, function () { return _this.options.requestSerializer.toJson(orig); });
227
410
  })).put(this.process(function (c, req, res, orig) { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) {
228
411
  return [2 /*return*/, dataApiFactory(c).put(res, '', orig.body)];
229
412
  }); }); }))
230
413
  .delete(this.process(function (c, req, res, orig) { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) {
231
414
  return [2 /*return*/, dataApiFactory(c).delete(res, '')];
232
415
  }); }); }))
233
- .post(this.process(function (c, req, res, orig) { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) {
234
- return [2 /*return*/, dataApiFactory(c).httpPost(res, req, orig.body)];
235
- }); }); }));
416
+ .post(this.process(function (c, req, res, orig) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
417
+ var _this = this;
418
+ return tslib_1.__generator(this, function (_a) {
419
+ return [2 /*return*/, dataApiFactory(c).httpPost(res, req, orig.body, function () { return _this.options.requestSerializer.toJson(orig); })];
420
+ });
421
+ }); }));
236
422
  r.route(myRoute + '/:id')
237
423
  //@ts-ignore
238
424
  .get(this.process(function (c, req, res, orig) { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) {
@@ -249,19 +435,22 @@ var RemultServerImplementation = /** @class */ (function () {
249
435
  };
250
436
  RemultServerImplementation.prototype.process = function (what) {
251
437
  var _this = this;
252
- return function (req, res) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
438
+ return function (req, origRes) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
253
439
  var myReq, myRes, remult, _a;
254
440
  var _this = this;
255
441
  return tslib_1.__generator(this, function (_b) {
256
442
  switch (_b.label) {
257
443
  case 0:
258
444
  myReq = new ExpressRequestBridgeToDataApiRequest(req);
259
- myRes = new ExpressResponseBridgeToDataApiResponse(res, req);
445
+ myRes = new ExpressResponseBridgeToDataApiResponse(origRes, req);
260
446
  remult = new context_1.Remult();
447
+ remult.liveQueryPublisher = new SubscriptionServer_1.LiveQueryPublisher(function () { return remult.subscriptionServer; }, function () { return remult.liveQueryStorage; }, this.runWithRequest);
261
448
  _a = remult;
262
449
  return [4 /*yield*/, this.dataProvider];
263
450
  case 1:
264
451
  _a.dataProvider = (_b.sent());
452
+ remult.subscriptionServer = this.subscriptionServer;
453
+ remult.liveQueryStorage = this.liveQueryStorage;
265
454
  return [4 /*yield*/, new Promise(function (res) {
266
455
  RemultAsyncLocalStorage.instance.run(remult, function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
267
456
  var user;
@@ -286,11 +475,19 @@ var RemultServerImplementation = /** @class */ (function () {
286
475
  _a.label = 4;
287
476
  case 4:
288
477
  if (!this.options.initRequest) return [3 /*break*/, 6];
289
- return [4 /*yield*/, this.options.initRequest(remult, req)];
478
+ return [4 /*yield*/, this.options.initRequest(req, {
479
+ remult: remult,
480
+ get liveQueryStorage() {
481
+ return remult.liveQueryStorage;
482
+ },
483
+ set liveQueryStorage(value) {
484
+ remult.liveQueryStorage = value;
485
+ }
486
+ })];
290
487
  case 5:
291
488
  _a.sent();
292
489
  _a.label = 6;
293
- case 6: return [4 /*yield*/, what(remult, myReq, myRes, req)];
490
+ case 6: return [4 /*yield*/, what(remult, myReq, myRes, req, origRes)];
294
491
  case 7:
295
492
  _a.sent();
296
493
  res({});
@@ -339,7 +536,7 @@ var RemultServerImplementation = /** @class */ (function () {
339
536
  })();
340
537
  _this.backendMethodsOpenApi.push({ path: myUrl, allowed: allowed, tag: tag });
341
538
  if (_this.options.logApiEndPoints)
342
- console.log("[remult] " + myUrl);
539
+ console.info("[remult] " + myUrl);
343
540
  if (queue) {
344
541
  _this.hasQueue = true;
345
542
  _this.queue.mapQueuedAction(myUrl, what);
@@ -366,7 +563,7 @@ var RemultServerImplementation = /** @class */ (function () {
366
563
  });
367
564
  };
368
565
  RemultServerImplementation.prototype.openApiDoc = function (options) {
369
- var e_3, _a, e_4, _b;
566
+ var e_6, _a, e_7, _b;
370
567
  var r = new context_1.Remult();
371
568
  if (!options.version)
372
569
  options.version = "1.0.0";
@@ -416,15 +613,15 @@ var RemultServerImplementation = /** @class */ (function () {
416
613
  return item;
417
614
  }
418
615
  };
419
- var _loop_1 = function (e) {
420
- var e_5, _a;
616
+ var _loop_2 = function (e) {
617
+ var e_8, _a;
421
618
  var meta = r.repo(e).metadata;
422
619
  var key = remult3_1.getEntityKey(e);
423
620
  var parameters = [];
424
621
  if (key) {
425
622
  var properties = {};
426
623
  try {
427
- for (var _b = (e_5 = void 0, tslib_1.__values(meta.fields)), _c = _b.next(); !_c.done; _c = _b.next()) {
624
+ for (var _b = (e_8 = void 0, tslib_1.__values(meta.fields)), _c = _b.next(); !_c.done; _c = _b.next()) {
428
625
  var f = _c.value;
429
626
  var type = f.valueType == String ? "string" :
430
627
  f.valueType == Boolean ? "boolean" :
@@ -452,12 +649,12 @@ var RemultServerImplementation = /** @class */ (function () {
452
649
  });
453
650
  }
454
651
  }
455
- catch (e_5_1) { e_5 = { error: e_5_1 }; }
652
+ catch (e_8_1) { e_8 = { error: e_8_1 }; }
456
653
  finally {
457
654
  try {
458
655
  if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
459
656
  }
460
- finally { if (e_5) throw e_5.error; }
657
+ finally { if (e_8) throw e_8.error; }
461
658
  }
462
659
  spec.components.schemas[key] = {
463
660
  type: "object",
@@ -597,15 +794,15 @@ var RemultServerImplementation = /** @class */ (function () {
597
794
  try {
598
795
  for (var _c = tslib_1.__values(this.options.entities), _d = _c.next(); !_d.done; _d = _c.next()) {
599
796
  var e = _d.value;
600
- _loop_1(e);
797
+ _loop_2(e);
601
798
  }
602
799
  }
603
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
800
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
604
801
  finally {
605
802
  try {
606
803
  if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
607
804
  }
608
- finally { if (e_3) throw e_3.error; }
805
+ finally { if (e_6) throw e_6.error; }
609
806
  }
610
807
  try {
611
808
  for (var _e = tslib_1.__values(this.backendMethodsOpenApi), _f = _e.next(); !_f.done; _f = _e.next()) {
@@ -648,12 +845,12 @@ var RemultServerImplementation = /** @class */ (function () {
648
845
  };
649
846
  }
650
847
  }
651
- catch (e_4_1) { e_4 = { error: e_4_1 }; }
848
+ catch (e_7_1) { e_7 = { error: e_7_1 }; }
652
849
  finally {
653
850
  try {
654
851
  if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
655
852
  }
656
- finally { if (e_4) throw e_4.error; }
853
+ finally { if (e_7) throw e_7.error; }
657
854
  }
658
855
  spec.components.schemas["InvalidResponse"] = {
659
856
  "type": "object",
@@ -670,6 +867,7 @@ var RemultServerImplementation = /** @class */ (function () {
670
867
  };
671
868
  return RemultServerImplementation;
672
869
  }());
870
+ exports.RemultServerImplementation = RemultServerImplementation;
673
871
  var ExpressRequestBridgeToDataApiRequest = /** @class */ (function () {
674
872
  function ExpressRequestBridgeToDataApiRequest(r) {
675
873
  this.r = r;
@@ -740,7 +938,11 @@ var inProcessQueueHandler = /** @class */ (function () {
740
938
  this.actions.get(url)(body, req, {
741
939
  error: function (error) { return job.setErrorResult(data_api_1.serializeError(error)); },
742
940
  success: function (result) { return job.setResult(result); },
743
- progress: function (progress) { return job.setProgress(progress); }
941
+ progress: function (progress) { return job.setProgress(progress); },
942
+ created: function () { throw Error("Created response not expected for queue"); },
943
+ deleted: function () { throw Error("deleted response not expected for queue"); },
944
+ notFound: function () { throw Error("notFound response not expected for queue"); },
945
+ forbidden: function () { return job.setErrorResult("Forbidden"); }
744
946
  });
745
947
  return [2 /*return*/, id];
746
948
  }
@@ -954,6 +1156,18 @@ var RouteImplementation = /** @class */ (function () {
954
1156
  function class_1() {
955
1157
  this.statusCode = 200;
956
1158
  }
1159
+ class_1.prototype.write = function (data) {
1160
+ gRes.write(data);
1161
+ };
1162
+ class_1.prototype.writeHead = function (statusCode, headers) {
1163
+ gRes.writeHead(statusCode, headers);
1164
+ this.statusCode = statusCode;
1165
+ res({ statusCode: statusCode });
1166
+ };
1167
+ class_1.prototype.flush = function () {
1168
+ if (gRes.flush)
1169
+ gRes.flush();
1170
+ };
957
1171
  class_1.prototype.json = function (data) {
958
1172
  if (gRes !== undefined)
959
1173
  gRes.json(data);
package/server/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { GenericRequest, RemultServer, RemultServerOptions } from './expressBridge';
2
- export { queuedJobInfo, QueueStorage, GenericRequest, GenericRequestHandler, GenericResponse, GenericRouter, RemultServerOptions, SpecificRoute, RemultServer } from './expressBridge';
2
+ export { queuedJobInfo, QueueStorage, GenericRequest, GenericRequestHandler, GenericResponse, GenericRouter, RemultServerOptions, SpecificRoute, RemultServer, InitRequestOptions } from './expressBridge';
3
3
  export { JsonEntityFileStorage, JsonFileDataProvider } from './JsonEntityFileStorage';
4
+ export { DataProviderLiveQueryStorage } from '../live-query/data-provider-live-query-storage';
4
5
  export declare function createRemultServer<RequestType extends GenericRequest = GenericRequest>(options?: RemultServerOptions<RequestType>): RemultServer;
package/server/index.js CHANGED
@@ -1,11 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createRemultServer = exports.JsonFileDataProvider = exports.JsonEntityFileStorage = void 0;
3
+ exports.createRemultServer = exports.DataProviderLiveQueryStorage = exports.JsonFileDataProvider = exports.JsonEntityFileStorage = void 0;
4
4
  var expressBridge_1 = require("./expressBridge");
5
5
  var initAsyncHooks_1 = require("./initAsyncHooks");
6
6
  var JsonEntityFileStorage_1 = require("./JsonEntityFileStorage");
7
7
  Object.defineProperty(exports, "JsonEntityFileStorage", { enumerable: true, get: function () { return JsonEntityFileStorage_1.JsonEntityFileStorage; } });
8
8
  Object.defineProperty(exports, "JsonFileDataProvider", { enumerable: true, get: function () { return JsonEntityFileStorage_1.JsonFileDataProvider; } });
9
+ var data_provider_live_query_storage_1 = require("../live-query/data-provider-live-query-storage");
10
+ Object.defineProperty(exports, "DataProviderLiveQueryStorage", { enumerable: true, get: function () { return data_provider_live_query_storage_1.DataProviderLiveQueryStorage; } });
9
11
  function createRemultServer(options) {
10
12
  initAsyncHooks_1.initAsyncHooks();
11
13
  return expressBridge_1.createRemultServerCore(options);
@@ -0,0 +1,2 @@
1
+ import { DataProvider } from '../src/data-interfaces';
2
+ export declare function initDataProvider(optionsDataProvider?: DataProvider | Promise<DataProvider> | (() => Promise<DataProvider | undefined>)): Promise<DataProvider>;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.initDataProvider = void 0;
4
+ var tslib_1 = require("tslib");
5
+ function initDataProvider(optionsDataProvider) {
6
+ var _this = this;
7
+ var dataProvider;
8
+ if (typeof optionsDataProvider === "function") {
9
+ dataProvider = optionsDataProvider();
10
+ }
11
+ else
12
+ dataProvider = Promise.resolve(optionsDataProvider);
13
+ dataProvider = dataProvider.then(function (dp) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
14
+ return tslib_1.__generator(this, function (_a) {
15
+ switch (_a.label) {
16
+ case 0:
17
+ if (dp)
18
+ return [2 /*return*/, dp];
19
+ return [4 /*yield*/, Promise.resolve().then(function () { return tslib_1.__importStar(require('./JsonEntityFileStorage')); })];
20
+ case 1: return [2 /*return*/, new (_a.sent()).JsonFileDataProvider('./db')];
21
+ }
22
+ });
23
+ }); });
24
+ return dataProvider;
25
+ }
26
+ exports.initDataProvider = initDataProvider;
@@ -0,0 +1,31 @@
1
+ import { RestDataProviderHttpProvider } from "./data-interfaces";
2
+ import { RestDataProviderHttpProviderUsingFetch } from './data-providers/rest-data-provider';
3
+ export declare function buildRestDataProvider(provider: ExternalHttpProvider | typeof fetch): RestDataProviderHttpProviderUsingFetch | RestDataProviderHttpProvider;
4
+ export declare function isExternalHttpProvider(item: any): boolean;
5
+ export declare class HttpProviderBridgeToRestDataProviderHttpProvider implements RestDataProviderHttpProvider {
6
+ private http;
7
+ constructor(http: ExternalHttpProvider);
8
+ post(url: string, data: any): Promise<any>;
9
+ delete(url: string): Promise<void>;
10
+ put(url: string, data: any): Promise<any>;
11
+ get(url: string): Promise<any>;
12
+ }
13
+ export declare function retry<T>(what: () => Promise<T>): Promise<T>;
14
+ export declare function toPromise<T>(p: Promise<T> | {
15
+ toPromise(): Promise<T>;
16
+ }): Promise<any>;
17
+ export declare function processHttpException(ex: any): Promise<any>;
18
+ export interface ExternalHttpProvider {
19
+ post(url: string, data: any): Promise<any> | {
20
+ toPromise(): Promise<any>;
21
+ };
22
+ delete(url: string): Promise<void> | {
23
+ toPromise(): Promise<void>;
24
+ };
25
+ put(url: string, data: any): Promise<any> | {
26
+ toPromise(): Promise<any>;
27
+ };
28
+ get(url: string): Promise<any> | {
29
+ toPromise(): Promise<any>;
30
+ };
31
+ }