remult 0.17.3 → 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 (163) 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/index.d.ts +7 -4
  10. package/esm/index.js +4 -2
  11. package/esm/live-query/data-provider-live-query-storage.d.ts +23 -0
  12. package/esm/live-query/data-provider-live-query-storage.js +78 -0
  13. package/esm/myLog.d.ts +1 -0
  14. package/esm/myLog.js +5 -0
  15. package/esm/postgres/postgres-data-provider.d.ts +4 -2
  16. package/esm/postgres/postgres-data-provider.js +18 -6
  17. package/esm/postgres/schema-builder.d.ts +2 -1
  18. package/esm/postgres/schema-builder.js +49 -29
  19. package/esm/remult-knex/index.d.ts +10 -32
  20. package/esm/remult-knex/index.js +75 -51
  21. package/esm/remult-mongo.d.ts +9 -2
  22. package/esm/remult-mongo.js +24 -8
  23. package/esm/remult-next.d.ts +11 -0
  24. package/esm/remult-next.js +27 -0
  25. package/esm/server/core.d.ts +2 -0
  26. package/esm/server/core.js +2 -0
  27. package/esm/server/expressBridge.d.ts +19 -7
  28. package/esm/server/expressBridge.js +135 -31
  29. package/esm/server/index.d.ts +2 -1
  30. package/esm/server/index.js +2 -1
  31. package/esm/server/initDataProvider.d.ts +2 -0
  32. package/esm/server/initDataProvider.js +14 -0
  33. package/esm/src/buildRestDataProvider.d.ts +31 -0
  34. package/esm/src/buildRestDataProvider.js +110 -0
  35. package/esm/src/column-interfaces.d.ts +44 -8
  36. package/esm/src/column.d.ts +3 -3
  37. package/esm/src/context.d.ts +39 -36
  38. package/esm/src/context.js +87 -117
  39. package/esm/src/data-api.d.ts +9 -3
  40. package/esm/src/data-api.js +130 -63
  41. package/esm/src/data-interfaces.d.ts +5 -1
  42. package/esm/src/data-providers/array-entity-data-provider.d.ts +1 -1
  43. package/esm/src/data-providers/array-entity-data-provider.js +2 -17
  44. package/esm/src/data-providers/rest-data-provider.d.ts +4 -3
  45. package/esm/src/data-providers/rest-data-provider.js +64 -23
  46. package/esm/src/data-providers/sql-database.d.ts +7 -3
  47. package/esm/src/data-providers/sql-database.js +60 -17
  48. package/esm/src/data-providers/web-sql-data-provider.d.ts +3 -0
  49. package/esm/src/data-providers/web-sql-data-provider.js +23 -9
  50. package/esm/src/entity.d.ts +2 -2
  51. package/esm/src/filter/filter-consumer-bridge-to-sql-request.d.ts +16 -16
  52. package/esm/src/filter/filter-consumer-bridge-to-sql-request.js +29 -21
  53. package/esm/src/filter/filter-interfaces.d.ts +5 -5
  54. package/esm/src/filter/filter-interfaces.js +31 -26
  55. package/esm/src/live-query/LiveQueryClient.d.ts +1 -0
  56. package/esm/src/live-query/LiveQueryClient.js +184 -0
  57. package/esm/src/live-query/SseSubscriptionClient.d.ts +5 -0
  58. package/esm/src/live-query/SseSubscriptionClient.js +86 -0
  59. package/esm/src/live-query/SubscriptionChannel.d.ts +41 -0
  60. package/esm/src/live-query/SubscriptionChannel.js +121 -0
  61. package/esm/src/live-query/SubscriptionServer.d.ts +38 -0
  62. package/esm/src/live-query/SubscriptionServer.js +108 -0
  63. package/esm/src/remult-proxy.d.ts +1 -1
  64. package/esm/src/remult-proxy.js +52 -7
  65. package/esm/src/remult3/RepositoryImplementation.d.ts +14 -5
  66. package/esm/src/remult3/RepositoryImplementation.js +124 -44
  67. package/esm/src/remult3/getId.d.ts +2 -0
  68. package/esm/src/remult3/getId.js +7 -0
  69. package/esm/src/remult3/remult3.d.ts +67 -10
  70. package/esm/src/remult3/remult3.js +1 -0
  71. package/esm/src/server-action.d.ts +5 -1
  72. package/esm/src/server-action.js +11 -12
  73. package/esm/src/shared-tests/db-tests-setup.d.ts +12 -5
  74. package/esm/src/shared-tests/db-tests-setup.js +14 -6
  75. package/esm/src/shared-tests/db-tests.db-tests.js +71 -10
  76. package/esm/src/sort.d.ts +1 -0
  77. package/esm/src/sort.js +18 -0
  78. package/esm/src/sql-command.d.ts +5 -2
  79. package/esm/src/tests/entityForCustomFilter.d.ts +6 -6
  80. package/esm/src/tests/entityForCustomFilter.js +20 -21
  81. package/esm/src/tests/frontend-database-tests-setup.spec.js +3 -4
  82. package/esm/src/tests/testHelper.spec.d.ts +3 -1
  83. package/esm/src/tests/testHelper.spec.js +63 -60
  84. package/esm/src/valueConverters.js +15 -7
  85. package/index.d.ts +7 -4
  86. package/index.js +7 -3
  87. package/live-query/data-provider-live-query-storage.d.ts +23 -0
  88. package/live-query/data-provider-live-query-storage.js +236 -0
  89. package/myLog.d.ts +1 -0
  90. package/myLog.js +20 -0
  91. package/package.json +18 -1
  92. package/postgres/postgres-data-provider.d.ts +4 -2
  93. package/postgres/postgres-data-provider.js +54 -39
  94. package/postgres/schema-builder.d.ts +2 -1
  95. package/postgres/schema-builder.js +118 -70
  96. package/remult-express.js +1 -1
  97. package/remult-knex/index.d.ts +10 -32
  98. package/remult-knex/index.js +134 -87
  99. package/remult-mongo.d.ts +9 -2
  100. package/remult-mongo.js +39 -7
  101. package/remult-next.d.ts +11 -0
  102. package/remult-next.js +73 -0
  103. package/server/JsonEntityFileStorage.js +2 -2
  104. package/server/core.d.ts +2 -0
  105. package/server/core.js +5 -1
  106. package/server/expressBridge.d.ts +19 -7
  107. package/server/expressBridge.js +283 -69
  108. package/server/index.d.ts +2 -1
  109. package/server/index.js +3 -1
  110. package/server/initDataProvider.d.ts +2 -0
  111. package/server/initDataProvider.js +26 -0
  112. package/src/buildRestDataProvider.d.ts +31 -0
  113. package/src/buildRestDataProvider.js +162 -0
  114. package/src/column-interfaces.d.ts +44 -8
  115. package/src/column.d.ts +3 -3
  116. package/src/context.d.ts +39 -36
  117. package/src/context.js +171 -166
  118. package/src/data-api.d.ts +9 -3
  119. package/src/data-api.js +233 -88
  120. package/src/data-interfaces.d.ts +5 -1
  121. package/src/data-providers/array-entity-data-provider.d.ts +1 -1
  122. package/src/data-providers/array-entity-data-provider.js +2 -17
  123. package/src/data-providers/rest-data-provider.d.ts +4 -3
  124. package/src/data-providers/rest-data-provider.js +105 -39
  125. package/src/data-providers/sql-database.d.ts +7 -3
  126. package/src/data-providers/sql-database.js +89 -16
  127. package/src/data-providers/web-sql-data-provider.d.ts +3 -0
  128. package/src/data-providers/web-sql-data-provider.js +56 -11
  129. package/src/entity.d.ts +2 -2
  130. package/src/filter/filter-consumer-bridge-to-sql-request.d.ts +16 -16
  131. package/src/filter/filter-consumer-bridge-to-sql-request.js +59 -50
  132. package/src/filter/filter-interfaces.d.ts +5 -5
  133. package/src/filter/filter-interfaces.js +31 -26
  134. package/src/live-query/LiveQueryClient.d.ts +1 -0
  135. package/src/live-query/LiveQueryClient.js +283 -0
  136. package/src/live-query/SseSubscriptionClient.d.ts +5 -0
  137. package/src/live-query/SseSubscriptionClient.js +150 -0
  138. package/src/live-query/SubscriptionChannel.d.ts +41 -0
  139. package/src/live-query/SubscriptionChannel.js +209 -0
  140. package/src/live-query/SubscriptionServer.d.ts +38 -0
  141. package/src/live-query/SubscriptionServer.js +258 -0
  142. package/src/remult-proxy.d.ts +1 -1
  143. package/src/remult-proxy.js +153 -8
  144. package/src/remult3/RepositoryImplementation.d.ts +14 -5
  145. package/src/remult3/RepositoryImplementation.js +200 -85
  146. package/src/remult3/getId.d.ts +2 -0
  147. package/src/remult3/getId.js +11 -0
  148. package/src/remult3/remult3.d.ts +67 -10
  149. package/src/remult3/remult3.js +1 -0
  150. package/src/server-action.d.ts +5 -1
  151. package/src/server-action.js +11 -11
  152. package/src/shared-tests/db-tests-setup.d.ts +12 -5
  153. package/src/shared-tests/db-tests-setup.js +17 -8
  154. package/src/shared-tests/db-tests.db-tests.js +140 -8
  155. package/src/sort.d.ts +1 -0
  156. package/src/sort.js +18 -0
  157. package/src/sql-command.d.ts +5 -2
  158. package/src/tests/entityForCustomFilter.d.ts +6 -6
  159. package/src/tests/entityForCustomFilter.js +30 -31
  160. package/src/tests/frontend-database-tests-setup.spec.js +5 -6
  161. package/src/tests/testHelper.spec.d.ts +3 -1
  162. package/src/tests/testHelper.spec.js +104 -100
  163. package/src/valueConverters.js +15 -7
package/src/context.js CHANGED
@@ -1,143 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EventSource = exports.queryConfig = exports.Allow = exports.setControllerSettings = exports.buildRestDataProvider = exports.ClassHelper = exports.classHelpers = exports.allEntities = exports.Remult = exports.isBackend = exports.processHttpException = exports.toPromise = exports.retry = exports.HttpProviderBridgeToRestDataProviderHttpProvider = void 0;
3
+ exports.doTransaction = exports.EventSource = exports.queryConfig = exports.Allow = exports.setControllerSettings = exports.ClassHelper = exports.classHelpers = exports.allEntities = exports.Remult = exports.isBackend = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  var server_action_1 = require("./server-action");
6
6
  var rest_data_provider_1 = require("./data-providers/rest-data-provider");
7
7
  var RepositoryImplementation_1 = require("./remult3/RepositoryImplementation");
8
- var HttpProviderBridgeToRestDataProviderHttpProvider = /** @class */ (function () {
9
- function HttpProviderBridgeToRestDataProviderHttpProvider(http) {
10
- this.http = http;
11
- }
12
- HttpProviderBridgeToRestDataProviderHttpProvider.prototype.post = function (url, data) {
13
- return tslib_1.__awaiter(this, void 0, void 0, function () {
14
- var _this = this;
15
- return tslib_1.__generator(this, function (_a) {
16
- switch (_a.label) {
17
- case 0: return [4 /*yield*/, retry(function () { return toPromise(_this.http.post(url, data)); })];
18
- case 1: return [2 /*return*/, _a.sent()];
19
- }
20
- });
21
- });
22
- };
23
- HttpProviderBridgeToRestDataProviderHttpProvider.prototype.delete = function (url) {
24
- return toPromise(this.http.delete(url));
25
- };
26
- HttpProviderBridgeToRestDataProviderHttpProvider.prototype.put = function (url, data) {
27
- return toPromise(this.http.put(url, data));
28
- };
29
- HttpProviderBridgeToRestDataProviderHttpProvider.prototype.get = function (url) {
30
- return tslib_1.__awaiter(this, void 0, void 0, function () {
31
- var _this = this;
32
- return tslib_1.__generator(this, function (_a) {
33
- switch (_a.label) {
34
- case 0: return [4 /*yield*/, retry(function () { return toPromise(_this.http.get(url)); })];
35
- case 1: return [2 /*return*/, _a.sent()];
36
- }
37
- });
38
- });
39
- };
40
- return HttpProviderBridgeToRestDataProviderHttpProvider;
41
- }());
42
- exports.HttpProviderBridgeToRestDataProviderHttpProvider = HttpProviderBridgeToRestDataProviderHttpProvider;
43
- function retry(what) {
44
- var _a, _b, _c, _d;
45
- return tslib_1.__awaiter(this, void 0, void 0, function () {
46
- var err_1;
47
- return tslib_1.__generator(this, function (_e) {
48
- switch (_e.label) {
49
- case 0:
50
- if (!true) return [3 /*break*/, 7];
51
- _e.label = 1;
52
- case 1:
53
- _e.trys.push([1, 3, , 6]);
54
- return [4 /*yield*/, what()];
55
- case 2: return [2 /*return*/, _e.sent()];
56
- case 3:
57
- err_1 = _e.sent();
58
- if (!(((_a = err_1.message) === null || _a === void 0 ? void 0 : _a.startsWith("Error occurred while trying to proxy")) || ((_b = err_1.message) === null || _b === void 0 ? void 0 : _b.startsWith("Error occured while trying to proxy")) || ((_c = err_1.message) === null || _c === void 0 ? void 0 : _c.includes("http proxy error")) || ((_d = err_1.message) === null || _d === void 0 ? void 0 : _d.startsWith("Gateway Timeout")))) return [3 /*break*/, 5];
59
- return [4 /*yield*/, new Promise(function (res, req) {
60
- setTimeout(function () {
61
- res({});
62
- }, 250);
63
- })];
64
- case 4:
65
- _e.sent();
66
- return [3 /*break*/, 0];
67
- case 5: throw err_1;
68
- case 6: return [3 /*break*/, 0];
69
- case 7: return [2 /*return*/];
70
- }
71
- });
72
- });
73
- }
74
- exports.retry = retry;
75
- function toPromise(p) {
76
- var _this = this;
77
- var r;
78
- if (p["toPromise"] !== undefined) {
79
- r = p["toPromise"]();
80
- }
81
- //@ts-ignore
82
- else
83
- r = p;
84
- return r.then(function (x) {
85
- if (x && (x.status == 200 || x.status == 201) && x.headers && x.request && x.data) //for axios
86
- return x.data;
87
- return x;
88
- }).catch(function (ex) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
89
- return tslib_1.__generator(this, function (_a) {
90
- switch (_a.label) {
91
- case 0: return [4 /*yield*/, processHttpException(ex)];
92
- case 1: throw _a.sent();
93
- }
94
- });
95
- }); });
96
- }
97
- exports.toPromise = toPromise;
98
- function processHttpException(ex) {
99
- var _a, _b, _c;
100
- return tslib_1.__awaiter(this, void 0, void 0, function () {
101
- var z, error, httpStatusCode, result;
102
- return tslib_1.__generator(this, function (_d) {
103
- switch (_d.label) {
104
- case 0: return [4 /*yield*/, ex];
105
- case 1:
106
- z = _d.sent();
107
- if (z.error)
108
- error = z.error;
109
- else if (z.isAxiosError) {
110
- if (typeof ((_a = z.response) === null || _a === void 0 ? void 0 : _a.data) === "string")
111
- error = z.response.data;
112
- else
113
- error = (_b = z === null || z === void 0 ? void 0 : z.response) === null || _b === void 0 ? void 0 : _b.data;
114
- }
115
- if (!error)
116
- error = z.message;
117
- if (z.status == 0 && z.error.isTrusted)
118
- error = "Network Error";
119
- if (typeof error === 'string') {
120
- error = {
121
- message: error,
122
- };
123
- }
124
- if (z.modelState)
125
- error.modelState = z.modelState;
126
- httpStatusCode = z.status;
127
- if (httpStatusCode === undefined)
128
- httpStatusCode = (_c = z.response) === null || _c === void 0 ? void 0 : _c.status;
129
- if (httpStatusCode !== undefined && httpStatusCode !== null) {
130
- error.httpStatusCode = httpStatusCode;
131
- }
132
- result = Object.assign(error, {
133
- // exception: ex disabled for now because JSON.stringify crashed with this
134
- });
135
- return [2 /*return*/, result];
136
- }
137
- });
138
- });
139
- }
140
- exports.processHttpException = processHttpException;
8
+ var LiveQueryClient_1 = require("./live-query/LiveQueryClient");
9
+ var SseSubscriptionClient_1 = require("./live-query/SseSubscriptionClient");
10
+ var remult_proxy_1 = require("./remult-proxy");
11
+ var buildRestDataProvider_1 = require("./buildRestDataProvider");
141
12
  function isBackend() {
142
13
  return server_action_1.actionInfo.runningOnServer;
143
14
  }
@@ -145,19 +16,30 @@ exports.isBackend = isBackend;
145
16
  var Remult = /** @class */ (function () {
146
17
  function Remult(provider) {
147
18
  var _this = this;
148
- /* @internal */
149
- this.repCache = new Map();
150
19
  /** The current data provider */
151
20
  this.dataProvider = new rest_data_provider_1.RestDataProvider(function () { return _this.apiClient; });
21
+ /* @internal */
22
+ this.repCache = new Map();
23
+ /* @internal*/
24
+ this.liveQueryPublisher = {
25
+ itemChanged: function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) {
26
+ return [2 /*return*/];
27
+ }); }); }
28
+ };
29
+ /* @internal*/
30
+ this.liveQuerySubscriber = new LiveQueryClient_1.LiveQueryClient(function () { return _this.apiClient; }, function () { var _a; return (_a = _this.user) === null || _a === void 0 ? void 0 : _a.id; });
31
+ /** context information that can be used to store custom information that will be disposed as part of the `remult` object */
152
32
  this.context = {};
33
+ /** The api client that will be used by `remult` to perform calls to the `api` */
153
34
  this.apiClient = {
154
- url: '/api'
35
+ url: '/api',
36
+ subscriptionClient: new SseSubscriptionClient_1.SseSubscriptionClient()
155
37
  };
156
38
  if (provider && provider.getEntityDataProvider) {
157
39
  this.dataProvider = provider;
158
40
  return;
159
41
  }
160
- if (isExternalHttpProvider(provider)) {
42
+ if (buildRestDataProvider_1.isExternalHttpProvider(provider)) {
161
43
  this.apiClient.httpClient = provider;
162
44
  }
163
45
  else if (typeof (provider) === "function")
@@ -168,13 +50,18 @@ var Remult = /** @class */ (function () {
168
50
  this.apiClient.httpClient = apiClient.httpClient;
169
51
  if (apiClient.url)
170
52
  this.apiClient.url = apiClient.url;
53
+ if (apiClient.subscriptionClient)
54
+ this.apiClient.subscriptionClient = apiClient.subscriptionClient;
55
+ if (apiClient.wrapMessageHandling)
56
+ this.apiClient.wrapMessageHandling = apiClient.wrapMessageHandling;
171
57
  }
172
58
  }
173
59
  /**Return's a `Repository` of the specific entity type
174
60
  * @example
175
61
  * const taskRepo = remult.repo(Task);
176
62
  * @see [Repository](https://remult.dev/docs/ref_repository.html)
177
- *
63
+ * @param entity - the entity to use
64
+ * @param dataProvider - an optional alternative data provider to use. Useful for writing to offline storage or an alternative data provider
178
65
  */
179
66
  Remult.prototype.repo = function (entity, dataProvider) {
180
67
  if (dataProvider === undefined)
@@ -188,7 +75,6 @@ var Remult = /** @class */ (function () {
188
75
  }
189
76
  return r;
190
77
  };
191
- /* delete me */
192
78
  /** Checks if a user was authenticated */
193
79
  Remult.prototype.authenticated = function () {
194
80
  var _a;
@@ -258,11 +144,19 @@ var Remult = /** @class */ (function () {
258
144
  }
259
145
  }
260
146
  else if (typeof (allowed) === "function") {
261
- return allowed(this, instance);
147
+ return allowed(instance, this);
262
148
  }
263
149
  else
264
150
  return this.isAllowed(allowed);
265
151
  };
152
+ //@ts-ignore // type error of typescript regarding args that doesn't appear in my normal development
153
+ /** Used to call a `backendMethod` using a specific `remult` object
154
+ * @example
155
+ * await remult.call(TasksController.setAll, undefined, true);
156
+ * @param backendMethod - the backend method to call
157
+ * @param classInstance - the class instance of the backend method, for static backend methods use undefined
158
+ * @param args - the arguments to send to the backend method
159
+ */
266
160
  Remult.prototype.call = function (backendMethod, classInstance) {
267
161
  var args = [];
268
162
  for (var _i = 2; _i < arguments.length; _i++) {
@@ -272,7 +166,7 @@ var Remult = /** @class */ (function () {
272
166
  if (!z.doWork)
273
167
  throw Error("The method received is not a valid backend method");
274
168
  //@ts-ignore
275
- return z.doWork(args, classInstance, this.apiClient.url, buildRestDataProvider(this.apiClient.httpClient));
169
+ return z.doWork(args, classInstance, this.apiClient.url, buildRestDataProvider_1.buildRestDataProvider(this.apiClient.httpClient));
276
170
  };
277
171
  Remult.prototype.clearAllCache = function () {
278
172
  this.repCache.clear();
@@ -282,6 +176,7 @@ var Remult = /** @class */ (function () {
282
176
  return Remult;
283
177
  }());
284
178
  exports.Remult = Remult;
179
+ remult_proxy_1.RemultProxy.defaultRemult = new Remult();
285
180
  ;
286
181
  exports.allEntities = [];
287
182
  exports.classHelpers = new Map();
@@ -292,29 +187,6 @@ var ClassHelper = /** @class */ (function () {
292
187
  return ClassHelper;
293
188
  }());
294
189
  exports.ClassHelper = ClassHelper;
295
- function isExternalHttpProvider(item) {
296
- var http = item;
297
- if (http && http.get && http.put && http.post && http.delete)
298
- return true;
299
- return false;
300
- }
301
- function buildRestDataProvider(provider) {
302
- if (!provider)
303
- return new rest_data_provider_1.RestDataProviderHttpProviderUsingFetch();
304
- var httpDataProvider;
305
- if (!httpDataProvider) {
306
- if (isExternalHttpProvider(provider)) {
307
- httpDataProvider = new HttpProviderBridgeToRestDataProviderHttpProvider(provider);
308
- }
309
- }
310
- if (!httpDataProvider) {
311
- if (typeof provider === "function") {
312
- httpDataProvider = new rest_data_provider_1.RestDataProviderHttpProviderUsingFetch(provider);
313
- }
314
- }
315
- return httpDataProvider;
316
- }
317
- exports.buildRestDataProvider = buildRestDataProvider;
318
190
  function setControllerSettings(target, options) {
319
191
  var r = target;
320
192
  while (true) {
@@ -333,7 +205,20 @@ var Allow = /** @class */ (function () {
333
205
  function Allow() {
334
206
  }
335
207
  Allow.everyone = function () { return true; };
336
- Allow.authenticated = function (remult) { return remult.authenticated(); };
208
+ Allow.authenticated = function () {
209
+ var args = [];
210
+ for (var _i = 0; _i < arguments.length; _i++) {
211
+ args[_i] = arguments[_i];
212
+ }
213
+ if (args.length > 1) {
214
+ return args[1].authenticated();
215
+ }
216
+ else if (args.length == 1) {
217
+ if (args[0].authenticated)
218
+ return args[0].authenticated();
219
+ }
220
+ return remult_proxy_1.RemultProxy.defaultRemult.authenticated();
221
+ };
337
222
  return Allow;
338
223
  }());
339
224
  exports.Allow = Allow;
@@ -401,3 +286,123 @@ var EventSource = /** @class */ (function () {
401
286
  return EventSource;
402
287
  }());
403
288
  exports.EventSource = EventSource;
289
+ function doTransaction(remult, what) {
290
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
291
+ var trans, ok, result;
292
+ var _this = this;
293
+ return tslib_1.__generator(this, function (_a) {
294
+ switch (_a.label) {
295
+ case 0:
296
+ trans = new transactionLiveQueryPublisher(remult.liveQueryPublisher);
297
+ ok = true;
298
+ return [4 /*yield*/, remult.dataProvider.transaction(function (ds) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
299
+ return tslib_1.__generator(this, function (_a) {
300
+ switch (_a.label) {
301
+ case 0:
302
+ remult.dataProvider = (ds);
303
+ remult.liveQueryPublisher = trans;
304
+ return [4 /*yield*/, what()];
305
+ case 1:
306
+ _a.sent();
307
+ ok = true;
308
+ return [2 /*return*/];
309
+ }
310
+ });
311
+ }); })];
312
+ case 1:
313
+ result = _a.sent();
314
+ if (!ok) return [3 /*break*/, 3];
315
+ return [4 /*yield*/, trans.flush()];
316
+ case 2:
317
+ _a.sent();
318
+ _a.label = 3;
319
+ case 3: return [2 /*return*/];
320
+ }
321
+ });
322
+ });
323
+ }
324
+ exports.doTransaction = doTransaction;
325
+ var transactionLiveQueryPublisher = /** @class */ (function () {
326
+ function transactionLiveQueryPublisher(orig) {
327
+ this.orig = orig;
328
+ this.transactionItems = new Map();
329
+ }
330
+ transactionLiveQueryPublisher.prototype.itemChanged = function (entityKey, changes) {
331
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
332
+ var items, _loop_1, changes_1, changes_1_1, c;
333
+ var e_4, _a;
334
+ return tslib_1.__generator(this, function (_b) {
335
+ items = this.transactionItems.get(entityKey);
336
+ if (!items) {
337
+ this.transactionItems.set(entityKey, items = []);
338
+ }
339
+ _loop_1 = function (c) {
340
+ if (c.oldId !== undefined) {
341
+ var item = items.find(function (y) { return y.id === c.oldId; });
342
+ if (item !== undefined) {
343
+ if (c.deleted)
344
+ item.deleted = true;
345
+ if (c.id != item.id)
346
+ item.id = c.id;
347
+ }
348
+ else
349
+ items.push(c);
350
+ }
351
+ else
352
+ items.push(c);
353
+ };
354
+ try {
355
+ for (changes_1 = tslib_1.__values(changes), changes_1_1 = changes_1.next(); !changes_1_1.done; changes_1_1 = changes_1.next()) {
356
+ c = changes_1_1.value;
357
+ _loop_1(c);
358
+ }
359
+ }
360
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
361
+ finally {
362
+ try {
363
+ if (changes_1_1 && !changes_1_1.done && (_a = changes_1.return)) _a.call(changes_1);
364
+ }
365
+ finally { if (e_4) throw e_4.error; }
366
+ }
367
+ return [2 /*return*/];
368
+ });
369
+ });
370
+ };
371
+ transactionLiveQueryPublisher.prototype.flush = function () {
372
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
373
+ var _a, _b, key, e_5_1;
374
+ var e_5, _c;
375
+ return tslib_1.__generator(this, function (_d) {
376
+ switch (_d.label) {
377
+ case 0:
378
+ _d.trys.push([0, 5, 6, 7]);
379
+ _a = tslib_1.__values(this.transactionItems.keys()), _b = _a.next();
380
+ _d.label = 1;
381
+ case 1:
382
+ if (!!_b.done) return [3 /*break*/, 4];
383
+ key = _b.value;
384
+ return [4 /*yield*/, this.orig.itemChanged(key, this.transactionItems.get(key))];
385
+ case 2:
386
+ _d.sent();
387
+ _d.label = 3;
388
+ case 3:
389
+ _b = _a.next();
390
+ return [3 /*break*/, 1];
391
+ case 4: return [3 /*break*/, 7];
392
+ case 5:
393
+ e_5_1 = _d.sent();
394
+ e_5 = { error: e_5_1 };
395
+ return [3 /*break*/, 7];
396
+ case 6:
397
+ try {
398
+ if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
399
+ }
400
+ finally { if (e_5) throw e_5.error; }
401
+ return [7 /*endfinally*/];
402
+ case 7: return [2 /*return*/];
403
+ }
404
+ });
405
+ });
406
+ };
407
+ return transactionLiveQueryPublisher;
408
+ }());
package/src/data-api.d.ts CHANGED
@@ -1,16 +1,21 @@
1
1
  import { Remult } from './context';
2
- import { Repository } from './remult3';
2
+ import { FindOptions, Repository } from './remult3';
3
3
  import { ErrorInfo } from './data-interfaces';
4
4
  export declare class DataApi<T = any> {
5
5
  private repository;
6
6
  private remult;
7
7
  constructor(repository: Repository<T>, remult: Remult);
8
- httpGet(res: DataApiResponse, req: DataApiRequest): Promise<void>;
9
- httpPost(res: DataApiResponse, req: DataApiRequest, body: any): Promise<void>;
8
+ httpGet(res: DataApiResponse, req: DataApiRequest, serializeRequest: () => any): Promise<void>;
9
+ httpPost(res: DataApiResponse, req: DataApiRequest, body: any, serializeRequest: () => any): Promise<void>;
10
10
  static defaultGetLimit: number;
11
11
  get(response: DataApiResponse, id: any): Promise<void>;
12
12
  count(response: DataApiResponse, request: DataApiRequest, filterBody?: any): Promise<void>;
13
+ getArrayImpl(response: DataApiResponse, request: DataApiRequest, filterBody: any): Promise<{
14
+ r: any[];
15
+ findOptions: FindOptions<T>;
16
+ }>;
13
17
  getArray(response: DataApiResponse, request: DataApiRequest, filterBody?: any): Promise<void>;
18
+ liveQuery(response: DataApiResponse, request: DataApiRequest, filterBody: any, serializeRequest: () => any, queryChannel: string): Promise<void>;
14
19
  private buildWhere;
15
20
  private doOnId;
16
21
  put(response: DataApiResponse, id: any, body: any): Promise<void>;
@@ -31,3 +36,4 @@ export interface DataApiRequest {
31
36
  }
32
37
  export declare function determineSort(sortUrlParm: string, dirUrlParam: string): any;
33
38
  export declare function serializeError(data: ErrorInfo): ErrorInfo<any>;
39
+ export declare function getLiveQueryChannel(queryId: string, userId: string): string;