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.
- package/esm/live-query/DataProviderLiveQueryStorage.d.ts +21 -0
- package/esm/live-query/DataProviderLiveQueryStorage.js +71 -0
- package/esm/remult-express.js +0 -16
- package/esm/server/expressBridge.js +18 -11
- package/esm/server/initDataProvider.d.ts +2 -0
- package/esm/server/initDataProvider.js +14 -0
- package/esm/src/live-query/SubscriptionServer.d.ts +1 -1
- package/live-query/DataProviderLiveQueryStorage.d.ts +21 -0
- package/live-query/DataProviderLiveQueryStorage.js +184 -0
- package/package.json +9 -1
- package/remult-express.js +6 -74
- package/server/expressBridge.js +87 -34
- package/server/initDataProvider.d.ts +2 -0
- package/server/initDataProvider.js +26 -0
- package/src/live-query/SubscriptionServer.d.ts +1 -1
|
@@ -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);
|
package/esm/remult-express.js
CHANGED
|
@@ -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,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:
|
|
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.
|
|
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
|
|
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 (
|
|
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 (
|
|
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
|
|
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 (
|
|
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 (
|
|
110
|
+
finally { if (e_2) throw e_2.error; }
|
|
179
111
|
}
|
|
180
112
|
};
|
|
181
113
|
//@internal
|
package/server/expressBridge.js
CHANGED
|
@@ -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
|
|
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 = (
|
|
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 (
|
|
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 (
|
|
262
|
+
finally { if (e_4) throw e_4.error; }
|
|
210
263
|
}
|
|
211
264
|
}
|
|
212
265
|
}
|
|
213
|
-
catch (
|
|
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 (
|
|
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
|
|
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
|
|
490
|
-
var
|
|
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 = (
|
|
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 (
|
|
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 (
|
|
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
|
-
|
|
723
|
+
_loop_2(e);
|
|
671
724
|
}
|
|
672
725
|
}
|
|
673
|
-
catch (
|
|
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 (
|
|
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 (
|
|
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 (
|
|
779
|
+
finally { if (e_6) throw e_6.error; }
|
|
727
780
|
}
|
|
728
781
|
spec.components.schemas["InvalidResponse"] = {
|
|
729
782
|
"type": "object",
|
|
@@ -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:
|
|
6
|
+
remove(queryId: string): void;
|
|
7
7
|
forEach(entityKey: string, callback: (args: {
|
|
8
8
|
query: StoredQuery;
|
|
9
9
|
setData(data: any): Promise<void>;
|