remult 0.18.1-exp.21 → 0.18.1-exp.23

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.
@@ -0,0 +1,21 @@
1
+ import { DataProvider } from "../src/data-interfaces";
2
+ import { LiveQueryStorage, StoredQuery } from "../src/live-query/SubscriptionServer";
3
+ import { Repository } from "../src/remult3";
4
+ export declare class DataProviderLiveQueryStorage implements LiveQueryStorage {
5
+ repo: Promise<Repository<LiveQueryStorageEntity>>;
6
+ constructor(dataProvider: DataProvider | Promise<DataProvider> | (() => Promise<DataProvider | undefined>));
7
+ add({ id, entityKey, data }: StoredQuery): void;
8
+ remove(queryId: string): void;
9
+ forEach(entityKey: string, callback: (args: {
10
+ query: StoredQuery;
11
+ setData(data: any): Promise<void>;
12
+ }) => Promise<void>): Promise<void>;
13
+ keepAliveAndReturnUnknownQueryIds(queryIds: string[]): Promise<string[]>;
14
+ }
15
+ declare class LiveQueryStorageEntity {
16
+ id: string;
17
+ entityKey: string;
18
+ data: any;
19
+ lastUsed: Date;
20
+ }
21
+ export {};
@@ -0,0 +1,71 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import { initDataProvider } from "../server/initDataProvider";
3
+ import { Remult } from "../src/context";
4
+ import { Entity, Fields } from "../src/remult3";
5
+ export class DataProviderLiveQueryStorage {
6
+ constructor(dataProvider) {
7
+ this.repo = initDataProvider(dataProvider).then(dp => new Remult(dp).repo(LiveQueryStorageEntity));
8
+ }
9
+ add({ id, entityKey, data }) {
10
+ this.repo.then(repo => repo.insert({
11
+ id, entityKey, data
12
+ }));
13
+ }
14
+ remove(queryId) {
15
+ this.repo.then(repo => repo.delete(queryId)).catch(() => { });
16
+ }
17
+ async forEach(entityKey, callback) {
18
+ const repo = await this.repo;
19
+ let d = new Date();
20
+ d.setMinutes(d.getMinutes() - 5);
21
+ for (const query of await repo.find({ where: { entityKey } })) {
22
+ if (query.lastUsed < d)
23
+ await repo.delete(query);
24
+ else {
25
+ await callback({
26
+ query, setData: async (data) => {
27
+ query.data = data;
28
+ await repo.save(query);
29
+ },
30
+ });
31
+ }
32
+ }
33
+ }
34
+ async keepAliveAndReturnUnknownQueryIds(queryIds) {
35
+ const repo = await this.repo;
36
+ for (const query of await repo.find({ where: { id: queryIds } })) {
37
+ query.lastUsed = new Date();
38
+ await repo.save(query);
39
+ queryIds = queryIds.filter(x => x !== query.id);
40
+ }
41
+ return queryIds;
42
+ }
43
+ }
44
+ let LiveQueryStorageEntity = class LiveQueryStorageEntity {
45
+ constructor() {
46
+ this.id = '';
47
+ this.entityKey = '';
48
+ this.lastUsed = new Date();
49
+ }
50
+ };
51
+ __decorate([
52
+ Fields.string(),
53
+ __metadata("design:type", Object)
54
+ ], LiveQueryStorageEntity.prototype, "id", void 0);
55
+ __decorate([
56
+ Fields.string(),
57
+ __metadata("design:type", Object)
58
+ ], LiveQueryStorageEntity.prototype, "entityKey", void 0);
59
+ __decorate([
60
+ Fields.object(),
61
+ __metadata("design:type", Object)
62
+ ], LiveQueryStorageEntity.prototype, "data", void 0);
63
+ __decorate([
64
+ Fields.date(),
65
+ __metadata("design:type", Object)
66
+ ], LiveQueryStorageEntity.prototype, "lastUsed", void 0);
67
+ LiveQueryStorageEntity = __decorate([
68
+ Entity(undefined, {
69
+ dbName: 'remult_live_query_storage'
70
+ })
71
+ ], LiveQueryStorageEntity);
@@ -3,7 +3,6 @@ import { createRemultServer } from './server/index';
3
3
  import { streamUrl } from './src/live-query/SubscriptionChannel';
4
4
  import { v4 as uuid } from 'uuid';
5
5
  import { remult } from './src/remult-proxy';
6
- import { getEntityKey } from './src/remult3';
7
6
  export function remultExpress(options) {
8
7
  let app = express.Router();
9
8
  if (!options) {
@@ -25,21 +24,6 @@ export function remultExpress(options) {
25
24
  if (canRegisterRoute.registerRoutes) {
26
25
  canRegisterRoute.registerRoutes(app, options.rootPath, server);
27
26
  }
28
- server.runWithRequest = async (req, entityKey, what) => {
29
- for (const e of options.entities) {
30
- let key = getEntityKey(e);
31
- if (key === entityKey) {
32
- await new Promise((result) => {
33
- server.withRemult(options.requestSerializer.fromJson(req), undefined, async () => {
34
- await what(remult.repo(e));
35
- result({});
36
- });
37
- });
38
- return;
39
- }
40
- }
41
- throw new Error("Couldn't find entity " + entityKey);
42
- };
43
27
  return Object.assign(app, {
44
28
  getRemult: (req) => server.getRemult(req),
45
29
  openApiDoc: (options) => server.openApiDoc(options),
@@ -7,6 +7,7 @@ import { IdEntity } from '../src/id-entity';
7
7
  import { remult } from '../src/remult-proxy';
8
8
  import { LiveQueryPublisher, InMemoryLiveQueryStorage } from '../src/live-query/SubscriptionServer';
9
9
  import { liveQueryKeepAliveRoute } from '../src/live-query/SubscriptionChannel';
10
+ import { initDataProvider } from './initDataProvider';
10
11
  ;
11
12
  export function createRemultServerCore(options) {
12
13
  if (!options) {
@@ -21,17 +22,7 @@ export function createRemultServerCore(options) {
21
22
  if (!options.queueStorage) {
22
23
  options.queueStorage = new InMemoryQueueStorage();
23
24
  }
24
- let dataProvider;
25
- if (typeof options.dataProvider === "function") {
26
- dataProvider = options.dataProvider();
27
- }
28
- else
29
- dataProvider = Promise.resolve(options.dataProvider);
30
- dataProvider = dataProvider.then(async (dp) => {
31
- if (dp)
32
- return dp;
33
- return new (await import('./JsonEntityFileStorage')).JsonFileDataProvider('./db');
34
- });
25
+ let dataProvider = initDataProvider(options.dataProvider);
35
26
  RemultAsyncLocalStorage.enable();
36
27
  if (options.initApi) {
37
28
  dataProvider = dataProvider.then(async (dp) => {
@@ -116,6 +107,21 @@ export class RemultServerImplementation {
116
107
  this.options = options;
117
108
  this.dataProvider = dataProvider;
118
109
  this.liveQueryStorage = new InMemoryLiveQueryStorage();
110
+ this.runWithRequest = async (req, entityKey, what) => {
111
+ for (const e of this.options.entities) {
112
+ let key = getEntityKey(e);
113
+ if (key === entityKey) {
114
+ await new Promise((result) => {
115
+ this.withRemult(this.options.requestSerializer.fromJson(req), undefined, async () => {
116
+ await what(remult.repo(e));
117
+ result({});
118
+ });
119
+ });
120
+ return;
121
+ }
122
+ }
123
+ throw new Error("Couldn't find entity " + entityKey);
124
+ };
119
125
  this.registeredRouter = false;
120
126
  this.hasQueue = false;
121
127
  /* internal */
@@ -125,6 +131,7 @@ export class RemultServerImplementation {
125
131
  if (options.subscriptionServer)
126
132
  this.subscriptionServer = options.subscriptionServer;
127
133
  }
134
+ ;
128
135
  withRemult(req, res, next) {
129
136
  this.process(async () => { next(); })(req, res);
130
137
  }
@@ -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,14 @@
1
+ export function initDataProvider(optionsDataProvider) {
2
+ let dataProvider;
3
+ if (typeof optionsDataProvider === "function") {
4
+ dataProvider = optionsDataProvider();
5
+ }
6
+ else
7
+ dataProvider = Promise.resolve(optionsDataProvider);
8
+ dataProvider = dataProvider.then(async (dp) => {
9
+ if (dp)
10
+ return dp;
11
+ return new (await import('./JsonEntityFileStorage')).JsonFileDataProvider('./db');
12
+ });
13
+ return dataProvider;
14
+ }
@@ -3,7 +3,7 @@ export interface SubscriptionServer {
3
3
  }
4
4
  export interface LiveQueryStorage {
5
5
  add(query: StoredQuery): void;
6
- remove(queryId: any): void;
6
+ remove(queryId: string): void;
7
7
  forEach(entityKey: string, callback: (args: {
8
8
  query: StoredQuery;
9
9
  setData(data: any): Promise<void>;
@@ -0,0 +1,21 @@
1
+ import { DataProvider } from "../src/data-interfaces";
2
+ import { LiveQueryStorage, StoredQuery } from "../src/live-query/SubscriptionServer";
3
+ import { Repository } from "../src/remult3";
4
+ export declare class DataProviderLiveQueryStorage implements LiveQueryStorage {
5
+ repo: Promise<Repository<LiveQueryStorageEntity>>;
6
+ constructor(dataProvider: DataProvider | Promise<DataProvider> | (() => Promise<DataProvider | undefined>));
7
+ add({ id, entityKey, data }: StoredQuery): void;
8
+ remove(queryId: string): void;
9
+ forEach(entityKey: string, callback: (args: {
10
+ query: StoredQuery;
11
+ setData(data: any): Promise<void>;
12
+ }) => Promise<void>): Promise<void>;
13
+ keepAliveAndReturnUnknownQueryIds(queryIds: string[]): Promise<string[]>;
14
+ }
15
+ declare class LiveQueryStorageEntity {
16
+ id: string;
17
+ entityKey: string;
18
+ data: any;
19
+ lastUsed: Date;
20
+ }
21
+ export {};
@@ -0,0 +1,184 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DataProviderLiveQueryStorage = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var initDataProvider_1 = require("../server/initDataProvider");
6
+ var context_1 = require("../src/context");
7
+ var remult3_1 = require("../src/remult3");
8
+ var DataProviderLiveQueryStorage = /** @class */ (function () {
9
+ function DataProviderLiveQueryStorage(dataProvider) {
10
+ this.repo = initDataProvider_1.initDataProvider(dataProvider).then(function (dp) {
11
+ return new context_1.Remult(dp).repo(LiveQueryStorageEntity);
12
+ });
13
+ }
14
+ DataProviderLiveQueryStorage.prototype.add = function (_a) {
15
+ var id = _a.id, entityKey = _a.entityKey, data = _a.data;
16
+ this.repo.then(function (repo) { return repo.insert({
17
+ id: id, entityKey: entityKey, data: data
18
+ }); });
19
+ };
20
+ DataProviderLiveQueryStorage.prototype.remove = function (queryId) {
21
+ this.repo.then(function (repo) { return repo.delete(queryId); }).catch(function () { });
22
+ };
23
+ DataProviderLiveQueryStorage.prototype.forEach = function (entityKey, callback) {
24
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
25
+ var repo, d, _loop_1, _a, _b, query, e_1_1;
26
+ var e_1, _c;
27
+ var _this = this;
28
+ return tslib_1.__generator(this, function (_d) {
29
+ switch (_d.label) {
30
+ case 0: return [4 /*yield*/, this.repo];
31
+ case 1:
32
+ repo = _d.sent();
33
+ d = new Date();
34
+ d.setMinutes(d.getMinutes() - 5);
35
+ _loop_1 = function (query) {
36
+ return tslib_1.__generator(this, function (_a) {
37
+ switch (_a.label) {
38
+ case 0:
39
+ if (!(query.lastUsed < d)) return [3 /*break*/, 2];
40
+ return [4 /*yield*/, repo.delete(query)];
41
+ case 1:
42
+ _a.sent();
43
+ return [3 /*break*/, 4];
44
+ case 2: return [4 /*yield*/, callback({
45
+ query: query, setData: function (data) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
46
+ return tslib_1.__generator(this, function (_a) {
47
+ switch (_a.label) {
48
+ case 0:
49
+ query.data = data;
50
+ return [4 /*yield*/, repo.save(query)];
51
+ case 1:
52
+ _a.sent();
53
+ return [2 /*return*/];
54
+ }
55
+ });
56
+ }); },
57
+ })];
58
+ case 3:
59
+ _a.sent();
60
+ _a.label = 4;
61
+ case 4: return [2 /*return*/];
62
+ }
63
+ });
64
+ };
65
+ _d.label = 2;
66
+ case 2:
67
+ _d.trys.push([2, 8, 9, 10]);
68
+ return [4 /*yield*/, repo.find({ where: { entityKey: entityKey } })];
69
+ case 3:
70
+ _a = tslib_1.__values.apply(void 0, [_d.sent()]), _b = _a.next();
71
+ _d.label = 4;
72
+ case 4:
73
+ if (!!_b.done) return [3 /*break*/, 7];
74
+ query = _b.value;
75
+ return [5 /*yield**/, _loop_1(query)];
76
+ case 5:
77
+ _d.sent();
78
+ _d.label = 6;
79
+ case 6:
80
+ _b = _a.next();
81
+ return [3 /*break*/, 4];
82
+ case 7: return [3 /*break*/, 10];
83
+ case 8:
84
+ e_1_1 = _d.sent();
85
+ e_1 = { error: e_1_1 };
86
+ return [3 /*break*/, 10];
87
+ case 9:
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 10: return [2 /*return*/];
94
+ }
95
+ });
96
+ });
97
+ };
98
+ DataProviderLiveQueryStorage.prototype.keepAliveAndReturnUnknownQueryIds = function (queryIds) {
99
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
100
+ var repo, _loop_2, _a, _b, query, e_2_1;
101
+ var e_2, _c;
102
+ return tslib_1.__generator(this, function (_d) {
103
+ switch (_d.label) {
104
+ case 0: return [4 /*yield*/, this.repo];
105
+ case 1:
106
+ repo = _d.sent();
107
+ _loop_2 = function (query) {
108
+ return tslib_1.__generator(this, function (_a) {
109
+ switch (_a.label) {
110
+ case 0:
111
+ query.lastUsed = new Date();
112
+ return [4 /*yield*/, repo.save(query)];
113
+ case 1:
114
+ _a.sent();
115
+ queryIds = queryIds.filter(function (x) { return x !== query.id; });
116
+ return [2 /*return*/];
117
+ }
118
+ });
119
+ };
120
+ _d.label = 2;
121
+ case 2:
122
+ _d.trys.push([2, 8, 9, 10]);
123
+ return [4 /*yield*/, repo.find({ where: { id: queryIds } })];
124
+ case 3:
125
+ _a = tslib_1.__values.apply(void 0, [_d.sent()]), _b = _a.next();
126
+ _d.label = 4;
127
+ case 4:
128
+ if (!!_b.done) return [3 /*break*/, 7];
129
+ query = _b.value;
130
+ return [5 /*yield**/, _loop_2(query)];
131
+ case 5:
132
+ _d.sent();
133
+ _d.label = 6;
134
+ case 6:
135
+ _b = _a.next();
136
+ return [3 /*break*/, 4];
137
+ case 7: return [3 /*break*/, 10];
138
+ case 8:
139
+ e_2_1 = _d.sent();
140
+ e_2 = { error: e_2_1 };
141
+ return [3 /*break*/, 10];
142
+ case 9:
143
+ try {
144
+ if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
145
+ }
146
+ finally { if (e_2) throw e_2.error; }
147
+ return [7 /*endfinally*/];
148
+ case 10: return [2 /*return*/, queryIds];
149
+ }
150
+ });
151
+ });
152
+ };
153
+ return DataProviderLiveQueryStorage;
154
+ }());
155
+ exports.DataProviderLiveQueryStorage = DataProviderLiveQueryStorage;
156
+ var LiveQueryStorageEntity = /** @class */ (function () {
157
+ function LiveQueryStorageEntity() {
158
+ this.id = '';
159
+ this.entityKey = '';
160
+ this.lastUsed = new Date();
161
+ }
162
+ tslib_1.__decorate([
163
+ remult3_1.Fields.string(),
164
+ tslib_1.__metadata("design:type", Object)
165
+ ], LiveQueryStorageEntity.prototype, "id", void 0);
166
+ tslib_1.__decorate([
167
+ remult3_1.Fields.string(),
168
+ tslib_1.__metadata("design:type", Object)
169
+ ], LiveQueryStorageEntity.prototype, "entityKey", void 0);
170
+ tslib_1.__decorate([
171
+ remult3_1.Fields.object(),
172
+ tslib_1.__metadata("design:type", Object)
173
+ ], LiveQueryStorageEntity.prototype, "data", void 0);
174
+ tslib_1.__decorate([
175
+ remult3_1.Fields.date(),
176
+ tslib_1.__metadata("design:type", Object)
177
+ ], LiveQueryStorageEntity.prototype, "lastUsed", void 0);
178
+ LiveQueryStorageEntity = tslib_1.__decorate([
179
+ remult3_1.Entity(undefined, {
180
+ dbName: 'remult_live_query_storage'
181
+ })
182
+ ], LiveQueryStorageEntity);
183
+ return LiveQueryStorageEntity;
184
+ }());
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "remult",
3
- "version": "0.18.1-exp.21",
3
+ "version": "0.18.1-exp.23",
4
4
  "description": "A CRUD framework for full-stack TypeScript",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -118,6 +118,14 @@
118
118
  },
119
119
  "import": "./esm/live-query/ably.js"
120
120
  },
121
+ "./live-query/data-provider-live-query-storage": {
122
+ "require": "./live-query/DataProviderLiveQueryStorage.js",
123
+ "node": {
124
+ "require": "./live-query/DataProviderLiveQueryStorage.js",
125
+ "import": "./live-query/DataProviderLiveQueryStorage.js"
126
+ },
127
+ "import": "./esm/live-query/DataProviderLiveQueryStorage.js"
128
+ },
121
129
  "./graphql": {
122
130
  "require": "./graphql.js",
123
131
  "node": {
package/remult-express.js CHANGED
@@ -7,9 +7,7 @@ var index_1 = require("./server/index");
7
7
  var SubscriptionChannel_1 = require("./src/live-query/SubscriptionChannel");
8
8
  var uuid_1 = require("uuid");
9
9
  var remult_proxy_1 = require("./src/remult-proxy");
10
- var remult3_1 = require("./src/remult3");
11
10
  function remultExpress(options) {
12
- var _this = this;
13
11
  var app = express.Router();
14
12
  if (!options) {
15
13
  options = {};
@@ -30,72 +28,6 @@ function remultExpress(options) {
30
28
  if (canRegisterRoute.registerRoutes) {
31
29
  canRegisterRoute.registerRoutes(app, options.rootPath, server);
32
30
  }
33
- server.runWithRequest = function (req, entityKey, what) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
34
- var _loop_1, _a, _b, e, state_1, e_1_1;
35
- var e_1, _c;
36
- var _this = this;
37
- return tslib_1.__generator(this, function (_d) {
38
- switch (_d.label) {
39
- case 0:
40
- _loop_1 = function (e) {
41
- var key;
42
- return tslib_1.__generator(this, function (_a) {
43
- switch (_a.label) {
44
- case 0:
45
- key = remult3_1.getEntityKey(e);
46
- if (!(key === entityKey)) return [3 /*break*/, 2];
47
- return [4 /*yield*/, new Promise(function (result) {
48
- server.withRemult(options.requestSerializer.fromJson(req), undefined, function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
49
- return tslib_1.__generator(this, function (_a) {
50
- switch (_a.label) {
51
- case 0: return [4 /*yield*/, what(remult_proxy_1.remult.repo(e))];
52
- case 1:
53
- _a.sent();
54
- result({});
55
- return [2 /*return*/];
56
- }
57
- });
58
- }); });
59
- })];
60
- case 1:
61
- _a.sent();
62
- return [2 /*return*/, { value: void 0 }];
63
- case 2: return [2 /*return*/];
64
- }
65
- });
66
- };
67
- _d.label = 1;
68
- case 1:
69
- _d.trys.push([1, 6, 7, 8]);
70
- _a = tslib_1.__values(options.entities), _b = _a.next();
71
- _d.label = 2;
72
- case 2:
73
- if (!!_b.done) return [3 /*break*/, 5];
74
- e = _b.value;
75
- return [5 /*yield**/, _loop_1(e)];
76
- case 3:
77
- state_1 = _d.sent();
78
- if (typeof state_1 === "object")
79
- return [2 /*return*/, state_1.value];
80
- _d.label = 4;
81
- case 4:
82
- _b = _a.next();
83
- return [3 /*break*/, 2];
84
- case 5: return [3 /*break*/, 8];
85
- case 6:
86
- e_1_1 = _d.sent();
87
- e_1 = { error: e_1_1 };
88
- return [3 /*break*/, 8];
89
- case 7:
90
- try {
91
- if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
92
- }
93
- finally { if (e_1) throw e_1.error; }
94
- return [7 /*endfinally*/];
95
- case 8: throw new Error("Couldn't find entity " + entityKey);
96
- }
97
- });
98
- }); };
99
31
  return Object.assign(app, {
100
32
  getRemult: function (req) { return server.getRemult(req); },
101
33
  openApiDoc: function (options) { return server.openApiDoc(options); },
@@ -125,7 +57,7 @@ var SseSubscriptionServer = /** @class */ (function () {
125
57
  }
126
58
  //@internal
127
59
  SseSubscriptionServer.prototype.subscribeToChannel = function (_a, res, remult, remove) {
128
- var e_2, _b;
60
+ var e_1, _b;
129
61
  var channel = _a.channel, clientId = _a.clientId;
130
62
  if (remove === void 0) { remove = false; }
131
63
  try {
@@ -149,17 +81,17 @@ var SseSubscriptionServer = /** @class */ (function () {
149
81
  }
150
82
  }
151
83
  }
152
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
84
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
153
85
  finally {
154
86
  try {
155
87
  if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
156
88
  }
157
- finally { if (e_2) throw e_2.error; }
89
+ finally { if (e_1) throw e_1.error; }
158
90
  }
159
91
  res.sendStatus(404);
160
92
  };
161
93
  SseSubscriptionServer.prototype.publishMessage = function (channel, message) {
162
- var e_3, _a;
94
+ var e_2, _a;
163
95
  var data = JSON.stringify({ channel: channel, data: message });
164
96
  try {
165
97
  for (var _b = tslib_1.__values(this.connections), _c = _b.next(); !_c.done; _c = _b.next()) {
@@ -170,12 +102,12 @@ var SseSubscriptionServer = /** @class */ (function () {
170
102
  }
171
103
  }
172
104
  }
173
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
105
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
174
106
  finally {
175
107
  try {
176
108
  if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
177
109
  }
178
- finally { if (e_3) throw e_3.error; }
110
+ finally { if (e_2) throw e_2.error; }
179
111
  }
180
112
  };
181
113
  //@internal
@@ -10,6 +10,7 @@ var id_entity_1 = require("../src/id-entity");
10
10
  var remult_proxy_1 = require("../src/remult-proxy");
11
11
  var SubscriptionServer_1 = require("../src/live-query/SubscriptionServer");
12
12
  var SubscriptionChannel_1 = require("../src/live-query/SubscriptionChannel");
13
+ var initDataProvider_1 = require("./initDataProvider");
13
14
  ;
14
15
  function createRemultServerCore(options) {
15
16
  var _this = this;
@@ -25,23 +26,7 @@ function createRemultServerCore(options) {
25
26
  if (!options.queueStorage) {
26
27
  options.queueStorage = new InMemoryQueueStorage();
27
28
  }
28
- var dataProvider;
29
- if (typeof options.dataProvider === "function") {
30
- dataProvider = options.dataProvider();
31
- }
32
- else
33
- dataProvider = Promise.resolve(options.dataProvider);
34
- dataProvider = dataProvider.then(function (dp) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
35
- return tslib_1.__generator(this, function (_a) {
36
- switch (_a.label) {
37
- case 0:
38
- if (dp)
39
- return [2 /*return*/, dp];
40
- return [4 /*yield*/, Promise.resolve().then(function () { return tslib_1.__importStar(require('./JsonEntityFileStorage')); })];
41
- case 1: return [2 /*return*/, new (_a.sent()).JsonFileDataProvider('./db')];
42
- }
43
- });
44
- }); });
29
+ var dataProvider = initDataProvider_1.initDataProvider(options.dataProvider);
45
30
  RemultAsyncLocalStorage.enable();
46
31
  if (options.initApi) {
47
32
  dataProvider = dataProvider.then(function (dp) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
@@ -152,10 +137,77 @@ exports.RemultAsyncLocalStorage = RemultAsyncLocalStorage;
152
137
  /* @internal*/
153
138
  var RemultServerImplementation = /** @class */ (function () {
154
139
  function RemultServerImplementation(queue, options, dataProvider) {
140
+ var _this = this;
155
141
  this.queue = queue;
156
142
  this.options = options;
157
143
  this.dataProvider = dataProvider;
158
144
  this.liveQueryStorage = new SubscriptionServer_1.InMemoryLiveQueryStorage();
145
+ this.runWithRequest = function (req, entityKey, what) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
146
+ var _loop_1, _a, _b, e, state_1, e_2_1;
147
+ var e_2, _c;
148
+ var _this = this;
149
+ return tslib_1.__generator(this, function (_d) {
150
+ switch (_d.label) {
151
+ case 0:
152
+ _loop_1 = function (e) {
153
+ var key;
154
+ return tslib_1.__generator(this, function (_a) {
155
+ switch (_a.label) {
156
+ case 0:
157
+ key = remult3_1.getEntityKey(e);
158
+ if (!(key === entityKey)) return [3 /*break*/, 2];
159
+ return [4 /*yield*/, new Promise(function (result) {
160
+ _this.withRemult(_this.options.requestSerializer.fromJson(req), undefined, function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
161
+ return tslib_1.__generator(this, function (_a) {
162
+ switch (_a.label) {
163
+ case 0: return [4 /*yield*/, what(remult_proxy_1.remult.repo(e))];
164
+ case 1:
165
+ _a.sent();
166
+ result({});
167
+ return [2 /*return*/];
168
+ }
169
+ });
170
+ }); });
171
+ })];
172
+ case 1:
173
+ _a.sent();
174
+ return [2 /*return*/, { value: void 0 }];
175
+ case 2: return [2 /*return*/];
176
+ }
177
+ });
178
+ };
179
+ _d.label = 1;
180
+ case 1:
181
+ _d.trys.push([1, 6, 7, 8]);
182
+ _a = tslib_1.__values(this.options.entities), _b = _a.next();
183
+ _d.label = 2;
184
+ case 2:
185
+ if (!!_b.done) return [3 /*break*/, 5];
186
+ e = _b.value;
187
+ return [5 /*yield**/, _loop_1(e)];
188
+ case 3:
189
+ state_1 = _d.sent();
190
+ if (typeof state_1 === "object")
191
+ return [2 /*return*/, state_1.value];
192
+ _d.label = 4;
193
+ case 4:
194
+ _b = _a.next();
195
+ return [3 /*break*/, 2];
196
+ case 5: return [3 /*break*/, 8];
197
+ case 6:
198
+ e_2_1 = _d.sent();
199
+ e_2 = { error: e_2_1 };
200
+ return [3 /*break*/, 8];
201
+ case 7:
202
+ try {
203
+ if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
204
+ }
205
+ finally { if (e_2) throw e_2.error; }
206
+ return [7 /*endfinally*/];
207
+ case 8: throw new Error("Couldn't find entity " + entityKey);
208
+ }
209
+ });
210
+ }); };
159
211
  this.registeredRouter = false;
160
212
  this.hasQueue = false;
161
213
  /* internal */
@@ -165,6 +217,7 @@ var RemultServerImplementation = /** @class */ (function () {
165
217
  if (options.subscriptionServer)
166
218
  this.subscriptionServer = options.subscriptionServer;
167
219
  }
220
+ ;
168
221
  RemultServerImplementation.prototype.withRemult = function (req, res, next) {
169
222
  var _this = this;
170
223
  this.process(function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) {
@@ -180,7 +233,7 @@ var RemultServerImplementation = /** @class */ (function () {
180
233
  return this.routeImpl.handle(req, gRes);
181
234
  };
182
235
  RemultServerImplementation.prototype.registerRouter = function (r) {
183
- var e_2, _a, e_3, _b;
236
+ var e_3, _a, e_4, _b;
184
237
  var _this = this;
185
238
  if (this.registeredRouter)
186
239
  throw "Router already registered";
@@ -192,7 +245,7 @@ var RemultServerImplementation = /** @class */ (function () {
192
245
  var z = c[server_action_1.classBackendMethodsArray];
193
246
  if (z)
194
247
  try {
195
- for (var z_1 = (e_3 = void 0, tslib_1.__values(z)), z_1_1 = z_1.next(); !z_1_1.done; z_1_1 = z_1.next()) {
248
+ for (var z_1 = (e_4 = void 0, tslib_1.__values(z)), z_1_1 = z_1.next(); !z_1_1.done; z_1_1 = z_1.next()) {
196
249
  var a = z_1_1.value;
197
250
  var x = a[server_action_1.serverActionField];
198
251
  if (!x) {
@@ -201,21 +254,21 @@ var RemultServerImplementation = /** @class */ (function () {
201
254
  this.addAction(x, r);
202
255
  }
203
256
  }
204
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
257
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
205
258
  finally {
206
259
  try {
207
260
  if (z_1_1 && !z_1_1.done && (_b = z_1.return)) _b.call(z_1);
208
261
  }
209
- finally { if (e_3) throw e_3.error; }
262
+ finally { if (e_4) throw e_4.error; }
210
263
  }
211
264
  }
212
265
  }
213
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
266
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
214
267
  finally {
215
268
  try {
216
269
  if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
217
270
  }
218
- finally { if (e_2) throw e_2.error; }
271
+ finally { if (e_3) throw e_3.error; }
219
272
  }
220
273
  if (this.hasQueue)
221
274
  this.addAction({
@@ -436,7 +489,7 @@ var RemultServerImplementation = /** @class */ (function () {
436
489
  });
437
490
  };
438
491
  RemultServerImplementation.prototype.openApiDoc = function (options) {
439
- var e_4, _a, e_5, _b;
492
+ var e_5, _a, e_6, _b;
440
493
  var r = new context_1.Remult();
441
494
  if (!options.version)
442
495
  options.version = "1.0.0";
@@ -486,15 +539,15 @@ var RemultServerImplementation = /** @class */ (function () {
486
539
  return item;
487
540
  }
488
541
  };
489
- var _loop_1 = function (e) {
490
- var e_6, _a;
542
+ var _loop_2 = function (e) {
543
+ var e_7, _a;
491
544
  var meta = r.repo(e).metadata;
492
545
  var key = remult3_1.getEntityKey(e);
493
546
  var parameters = [];
494
547
  if (key) {
495
548
  var properties = {};
496
549
  try {
497
- for (var _b = (e_6 = void 0, tslib_1.__values(meta.fields)), _c = _b.next(); !_c.done; _c = _b.next()) {
550
+ for (var _b = (e_7 = void 0, tslib_1.__values(meta.fields)), _c = _b.next(); !_c.done; _c = _b.next()) {
498
551
  var f = _c.value;
499
552
  var type = f.valueType == String ? "string" :
500
553
  f.valueType == Boolean ? "boolean" :
@@ -522,12 +575,12 @@ var RemultServerImplementation = /** @class */ (function () {
522
575
  });
523
576
  }
524
577
  }
525
- catch (e_6_1) { e_6 = { error: e_6_1 }; }
578
+ catch (e_7_1) { e_7 = { error: e_7_1 }; }
526
579
  finally {
527
580
  try {
528
581
  if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
529
582
  }
530
- finally { if (e_6) throw e_6.error; }
583
+ finally { if (e_7) throw e_7.error; }
531
584
  }
532
585
  spec.components.schemas[key] = {
533
586
  type: "object",
@@ -667,15 +720,15 @@ var RemultServerImplementation = /** @class */ (function () {
667
720
  try {
668
721
  for (var _c = tslib_1.__values(this.options.entities), _d = _c.next(); !_d.done; _d = _c.next()) {
669
722
  var e = _d.value;
670
- _loop_1(e);
723
+ _loop_2(e);
671
724
  }
672
725
  }
673
- catch (e_4_1) { e_4 = { error: e_4_1 }; }
726
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
674
727
  finally {
675
728
  try {
676
729
  if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
677
730
  }
678
- finally { if (e_4) throw e_4.error; }
731
+ finally { if (e_5) throw e_5.error; }
679
732
  }
680
733
  try {
681
734
  for (var _e = tslib_1.__values(this.backendMethodsOpenApi), _f = _e.next(); !_f.done; _f = _e.next()) {
@@ -718,12 +771,12 @@ var RemultServerImplementation = /** @class */ (function () {
718
771
  };
719
772
  }
720
773
  }
721
- catch (e_5_1) { e_5 = { error: e_5_1 }; }
774
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
722
775
  finally {
723
776
  try {
724
777
  if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
725
778
  }
726
- finally { if (e_5) throw e_5.error; }
779
+ finally { if (e_6) throw e_6.error; }
727
780
  }
728
781
  spec.components.schemas["InvalidResponse"] = {
729
782
  "type": "object",
@@ -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;
@@ -3,7 +3,7 @@ export interface SubscriptionServer {
3
3
  }
4
4
  export interface LiveQueryStorage {
5
5
  add(query: StoredQuery): void;
6
- remove(queryId: any): void;
6
+ remove(queryId: string): void;
7
7
  forEach(entityKey: string, callback: (args: {
8
8
  query: StoredQuery;
9
9
  setData(data: any): Promise<void>;