remult 0.17.0-exp.1 → 0.17.0-exp.2
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/remult-express.js +2 -2
- package/esm/server/expressBridge.d.ts +2 -2
- package/esm/server/initAsyncHooks.js +0 -1
- package/esm/src/live-query/EventSourceLiveQueryProvider.js +2 -2
- package/esm/src/live-query/LiveQuery.d.ts +0 -1
- package/esm/src/live-query/LiveQuery.js +19 -22
- package/esm/src/live-query/LiveQueryManager.d.ts +1 -2
- package/esm/src/live-query/LiveQueryManager.js +18 -16
- package/esm/src/remult3/RepositoryImplementation.js +6 -10
- package/esm/src/remult3/getId.d.ts +2 -0
- package/esm/src/remult3/getId.js +7 -0
- package/esm/src/tests/testHelper.spec.d.ts +2 -0
- package/esm/src/tests/testHelper.spec.js +60 -57
- package/package.json +1 -1
- package/remult-express.js +1 -1
- package/server/expressBridge.d.ts +2 -2
- package/server/initAsyncHooks.js +0 -1
- package/src/live-query/EventSourceLiveQueryProvider.js +2 -2
- package/src/live-query/LiveQuery.d.ts +0 -1
- package/src/live-query/LiveQuery.js +28 -31
- package/src/live-query/LiveQueryManager.d.ts +1 -2
- package/src/live-query/LiveQueryManager.js +64 -62
- package/src/remult3/RepositoryImplementation.js +6 -10
- package/src/remult3/getId.d.ts +2 -0
- package/src/remult3/getId.js +11 -0
- package/src/tests/testHelper.spec.d.ts +2 -0
- package/src/tests/testHelper.spec.js +99 -95
package/esm/remult-express.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as express from 'express';
|
|
2
2
|
import { createRemultServer } from './server/expressBridge';
|
|
3
3
|
import { streamUrl } from './src/live-query/LiveQuery';
|
|
4
|
-
import {
|
|
4
|
+
import { LiveQueryPublisher } from './src/live-query/LiveQueryManager';
|
|
5
5
|
import { remult } from './src/remult-proxy';
|
|
6
6
|
export function remultExpress(options) {
|
|
7
7
|
let app = express.Router();
|
|
@@ -18,7 +18,7 @@ export function remultExpress(options) {
|
|
|
18
18
|
const server = createRemultServer(options);
|
|
19
19
|
server.registerRouter(app);
|
|
20
20
|
let httpServerEvents = new ServerEventsController(options.messageChannels);
|
|
21
|
-
server.liveQueryManager = new
|
|
21
|
+
server.liveQueryManager = new LiveQueryPublisher(httpServerEvents);
|
|
22
22
|
const streamPath = options.rootPath + '/' + streamUrl;
|
|
23
23
|
app.get(streamPath, (req, res) => {
|
|
24
24
|
httpServerEvents.openHttpServerStream(req, res);
|
|
@@ -5,7 +5,7 @@ import { AllowedForInstance, Remult, UserInfo } from '../src/context';
|
|
|
5
5
|
import { ClassType } from '../classType';
|
|
6
6
|
import { Repository } from '../src/remult3';
|
|
7
7
|
import { IdEntity } from '../src/id-entity';
|
|
8
|
-
import {
|
|
8
|
+
import { LiveQueryPublisher } from '../src/live-query/LiveQueryManager';
|
|
9
9
|
export interface RemultServerOptions<RequestType extends GenericRequest> {
|
|
10
10
|
/** Sets a database connection for Remult.
|
|
11
11
|
*
|
|
@@ -64,7 +64,7 @@ export declare class RemultServerImplementation implements RemultServer {
|
|
|
64
64
|
options: RemultServerOptions<GenericRequest>;
|
|
65
65
|
dataProvider: DataProvider | Promise<DataProvider>;
|
|
66
66
|
constructor(queue: inProcessQueueHandler, options: RemultServerOptions<GenericRequest>, dataProvider: DataProvider | Promise<DataProvider>);
|
|
67
|
-
liveQueryManager:
|
|
67
|
+
liveQueryManager: LiveQueryPublisher;
|
|
68
68
|
withRemult<T>(req: GenericRequest, res: GenericResponse, next: VoidFunction): void;
|
|
69
69
|
routeImpl: RouteImplementation;
|
|
70
70
|
handle(req: GenericRequest, gRes?: GenericResponse): Promise<ServerHandleResponse>;
|
|
@@ -3,8 +3,8 @@ import { streamUrl } from "./LiveQuery";
|
|
|
3
3
|
export class EventSourceLiveQueryProvider {
|
|
4
4
|
constructor(wrapMessage) {
|
|
5
5
|
this.wrapMessage = wrapMessage;
|
|
6
|
-
if (!wrapMessage)
|
|
7
|
-
wrapMessage = x => x();
|
|
6
|
+
if (!this.wrapMessage)
|
|
7
|
+
this.wrapMessage = x => x();
|
|
8
8
|
}
|
|
9
9
|
openStreamAndReturnCloseFunction(clientId, onMessage) {
|
|
10
10
|
const source = new EventSource(remult.apiClient.url + '/' + streamUrl + "?id=" + clientId, {
|
|
@@ -23,7 +23,6 @@ export declare class LiveQueryClient {
|
|
|
23
23
|
subscribe<entityType>(repo: Repository<entityType>, options: FindOptions<entityType>, onResult: (reducer: (prevState: entityType[]) => entityType[]) => void): () => void;
|
|
24
24
|
closeListener: Promise<VoidFunction>;
|
|
25
25
|
private openIfNoOpened;
|
|
26
|
-
private openListener;
|
|
27
26
|
}
|
|
28
27
|
export declare type listener = (message: any) => void;
|
|
29
28
|
export interface SubscribeToQueryArgs<entityType = any> {
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { remult as defaultRemult, Sort } from '../../index';
|
|
2
2
|
import { v4 as uuid } from 'uuid';
|
|
3
3
|
import { RestEntityDataProvider } from '../data-providers/rest-data-provider';
|
|
4
4
|
import { buildRestDataProvider } from '../context';
|
|
5
|
+
import { getId } from '../remult3/getId';
|
|
5
6
|
export const streamUrl = 'stream1';
|
|
6
7
|
class LiveQueryOnFrontEnd {
|
|
7
8
|
constructor(repo, query) {
|
|
8
9
|
this.repo = repo;
|
|
9
10
|
this.query = query;
|
|
10
|
-
this.
|
|
11
|
+
this.defaultQueryState = [];
|
|
11
12
|
this.listeners = [];
|
|
12
13
|
}
|
|
13
14
|
async setAllItems(result) {
|
|
@@ -19,6 +20,7 @@ class LiveQueryOnFrontEnd {
|
|
|
19
20
|
});
|
|
20
21
|
}
|
|
21
22
|
forListeners(what) {
|
|
23
|
+
// what(x => this.defaultQueryState = x(this.defaultQueryState));
|
|
22
24
|
for (const l of this.listeners) {
|
|
23
25
|
what(l);
|
|
24
26
|
}
|
|
@@ -41,7 +43,7 @@ class LiveQueryOnFrontEnd {
|
|
|
41
43
|
listener(items => {
|
|
42
44
|
if (!items)
|
|
43
45
|
items = [];
|
|
44
|
-
return sort(items.map(x => this.repo.
|
|
46
|
+
return sort(items.map(x => getId(this.repo.metadata, x) === message.data.oldId ? item : x));
|
|
45
47
|
});
|
|
46
48
|
});
|
|
47
49
|
break;
|
|
@@ -61,7 +63,7 @@ class LiveQueryOnFrontEnd {
|
|
|
61
63
|
this.forListeners(listener => listener(items => {
|
|
62
64
|
if (!items)
|
|
63
65
|
items = [];
|
|
64
|
-
return
|
|
66
|
+
return items.filter(x => getId(this.repo.metadata, x) !== message.data.id);
|
|
65
67
|
}));
|
|
66
68
|
break;
|
|
67
69
|
}
|
|
@@ -130,7 +132,7 @@ export class LiveQueryClient {
|
|
|
130
132
|
subscribe(repo, options, onResult) {
|
|
131
133
|
let alive = true;
|
|
132
134
|
let onUnsubscribe = () => { };
|
|
133
|
-
this.runPromise(this.
|
|
135
|
+
this.runPromise(this.openIfNoOpened().then(() => repo.buildEntityDataProviderFindOptions(options)
|
|
134
136
|
.then(opts => {
|
|
135
137
|
if (!alive)
|
|
136
138
|
return;
|
|
@@ -152,7 +154,7 @@ export class LiveQueryClient {
|
|
|
152
154
|
this.runPromise(this.provider.get(url.url).then(thenResult));
|
|
153
155
|
}
|
|
154
156
|
else {
|
|
155
|
-
onResult(x => q.
|
|
157
|
+
onResult(x => [...q.defaultQueryState]);
|
|
156
158
|
}
|
|
157
159
|
q.listeners.push(onResult);
|
|
158
160
|
onUnsubscribe = () => {
|
|
@@ -173,23 +175,18 @@ export class LiveQueryClient {
|
|
|
173
175
|
this.provider = buildRestDataProvider(defaultRemult.apiClient.httpClient);
|
|
174
176
|
}
|
|
175
177
|
if (!this.closeListener)
|
|
176
|
-
return this.
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
return this.closeListener;
|
|
182
|
-
return this.runPromise(this.closeListener = this.lqp.openStreamAndReturnCloseFunction(this.clientId, message => {
|
|
183
|
-
for (const q of this.queries.values()) {
|
|
184
|
-
if (q.id === message.event) {
|
|
185
|
-
this.runPromise(q.handle(message.data));
|
|
178
|
+
return this.runPromise(this.closeListener = this.lqp.openStreamAndReturnCloseFunction(this.clientId, message => {
|
|
179
|
+
for (const q of this.queries.values()) {
|
|
180
|
+
if (q.id === message.event) {
|
|
181
|
+
this.runPromise(q.handle(message.data));
|
|
182
|
+
}
|
|
186
183
|
}
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
}
|
|
192
|
-
|
|
184
|
+
const channel = this.channels.get(message.event);
|
|
185
|
+
if (channel) {
|
|
186
|
+
channel.handle(message.data);
|
|
187
|
+
}
|
|
188
|
+
}));
|
|
189
|
+
return this.closeListener;
|
|
193
190
|
}
|
|
194
191
|
}
|
|
195
192
|
export class AMessageChannel {
|
|
@@ -2,12 +2,11 @@ import { Remult } from '../..';
|
|
|
2
2
|
import { Repository, EntityRef, FindOptions } from '../remult3';
|
|
3
3
|
import { LiveQueryProvider } from '../data-api';
|
|
4
4
|
import { liveQueryMessage } from './LiveQuery';
|
|
5
|
-
export declare class
|
|
5
|
+
export declare class LiveQueryPublisher implements LiveQueryProvider {
|
|
6
6
|
private dispatcher;
|
|
7
7
|
constructor(dispatcher: ServerEventDispatcher);
|
|
8
8
|
subscribe(repo: Repository<any>, clientId: string, findOptions: FindOptions<any>, remult: Remult, ids: any[]): string;
|
|
9
9
|
clients: clientInfo[];
|
|
10
|
-
sendMessage(key: string, message: liveQueryMessage): void;
|
|
11
10
|
hasListeners(ref: EntityRef<any>): boolean;
|
|
12
11
|
runPromise(p: Promise<any>): void;
|
|
13
12
|
saved(ref: EntityRef<any>): void;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { v4 as uuid } from 'uuid';
|
|
2
|
-
export class
|
|
2
|
+
export class LiveQueryPublisher {
|
|
3
3
|
constructor(dispatcher) {
|
|
4
4
|
this.dispatcher = dispatcher;
|
|
5
5
|
this.clients = [];
|
|
@@ -19,15 +19,6 @@ export class LiveQueryManager {
|
|
|
19
19
|
});
|
|
20
20
|
return id;
|
|
21
21
|
}
|
|
22
|
-
sendMessage(key, message) {
|
|
23
|
-
for (const c of this.clients) {
|
|
24
|
-
for (const q of c.queries) {
|
|
25
|
-
if (q.repo.metadata.key === key) {
|
|
26
|
-
this.dispatcher.sendQueryMessage({ clientId: c.clientId, queryId: q.id, message });
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
22
|
hasListeners(ref) {
|
|
32
23
|
for (const c of this.clients) {
|
|
33
24
|
for (const q of c.queries) {
|
|
@@ -87,11 +78,22 @@ export class LiveQueryManager {
|
|
|
87
78
|
}
|
|
88
79
|
}
|
|
89
80
|
deleted(ref) {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
81
|
+
const id = ref.getOriginalId();
|
|
82
|
+
for (const c of this.clients) {
|
|
83
|
+
for (const q of c.queries) {
|
|
84
|
+
if (q.repo.metadata.key === ref.metadata.key) {
|
|
85
|
+
if (q.ids.includes(id)) {
|
|
86
|
+
this.dispatcher.sendQueryMessage({
|
|
87
|
+
clientId: c.clientId, queryId: q.id, message: {
|
|
88
|
+
type: "remove",
|
|
89
|
+
data: {
|
|
90
|
+
id: id
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
96
98
|
}
|
|
97
99
|
}
|
|
@@ -7,6 +7,7 @@ import { ValueConverters } from "../valueConverters";
|
|
|
7
7
|
import { filterHelper } from "../filter/filter-interfaces";
|
|
8
8
|
import { assign } from "../../assign";
|
|
9
9
|
import { remult as defaultRemult } from "../remult-proxy";
|
|
10
|
+
import { getId } from "./getId";
|
|
10
11
|
//import { remult } from "../remult-proxy";
|
|
11
12
|
let classValidatorValidate = undefined;
|
|
12
13
|
// import("class-validator".toString())
|
|
@@ -166,8 +167,10 @@ export class RepositoryImplementation {
|
|
|
166
167
|
instance[field.key] = entity[field.key];
|
|
167
168
|
}
|
|
168
169
|
let row = new rowHelperImplementation(this._info, instance, this, this.edp, this.remult, false);
|
|
169
|
-
if (id)
|
|
170
|
+
if (id) {
|
|
170
171
|
row.id = id;
|
|
172
|
+
row.originalId = id;
|
|
173
|
+
}
|
|
171
174
|
else
|
|
172
175
|
row.id = row.getId();
|
|
173
176
|
ref = row;
|
|
@@ -719,10 +722,7 @@ export class rowHelperImplementation extends rowHelperBase {
|
|
|
719
722
|
get apiDeleteAllowed() { return this.remult.isAllowedForInstance(this.instance, this.metadata.options.allowApiDelete); }
|
|
720
723
|
get apiInsertAllowed() { return this.remult.isAllowedForInstance(this.instance, this.metadata.options.allowApiInsert); }
|
|
721
724
|
getId() {
|
|
722
|
-
|
|
723
|
-
return this.info.idMetadata.field.getId(this.instance);
|
|
724
|
-
else
|
|
725
|
-
return this.instance[this.info.idMetadata.field.key];
|
|
725
|
+
return getId(this.info, this.instance);
|
|
726
726
|
}
|
|
727
727
|
saveMoreOriginalData() {
|
|
728
728
|
this.originalId = this.getId();
|
|
@@ -874,11 +874,7 @@ export class rowHelperImplementation extends rowHelperBase {
|
|
|
874
874
|
this.instance[col.key] = data[col.key];
|
|
875
875
|
}
|
|
876
876
|
await this.calcServerExpression();
|
|
877
|
-
|
|
878
|
-
this.id = this.repository.metadata.idMetadata.field.getId(this.instance);
|
|
879
|
-
}
|
|
880
|
-
else
|
|
881
|
-
this.id = data[this.repository.metadata.idMetadata.field.key];
|
|
877
|
+
this.id = getId(this.info, this.instance);
|
|
882
878
|
}
|
|
883
879
|
getOriginalId() {
|
|
884
880
|
return this.originalId;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import './frontend-database-tests-setup.spec';
|
|
2
2
|
import { Remult } from "../context";
|
|
3
|
+
import { DataApi } from "../data-api";
|
|
3
4
|
import { DataProvider, EntityDataProvider } from "../data-interfaces";
|
|
4
5
|
import { InMemoryDataProvider } from "../data-providers/in-memory-database";
|
|
5
6
|
import { EntityMetadata } from "../remult3";
|
|
@@ -32,3 +33,4 @@ export declare class MockRestDataProvider implements DataProvider {
|
|
|
32
33
|
transaction(action: (dataProvider: DataProvider) => Promise<void>): Promise<void>;
|
|
33
34
|
supportsCustomFilter: boolean;
|
|
34
35
|
}
|
|
36
|
+
export declare function createMockHttpDataProvider(dataApi: DataApi<any>): import("c:/Repos/radweb/projects/core/src/data-interfaces").RestDataProviderHttpProvider;
|
|
@@ -158,65 +158,68 @@ export class MockRestDataProvider {
|
|
|
158
158
|
}
|
|
159
159
|
getEntityDataProvider(metadata) {
|
|
160
160
|
let dataApi = new DataApi(this.remult.repo(metadata.entityType), this.remult);
|
|
161
|
-
return new RestEntityDataProvider(() => "", () =>
|
|
162
|
-
delete: async (url) => {
|
|
163
|
-
let urlSplit = url.split('/');
|
|
164
|
-
let r = new TestDataApiResponse();
|
|
165
|
-
let result;
|
|
166
|
-
r.deleted = () => { };
|
|
167
|
-
try {
|
|
168
|
-
testConfiguration.restDbRunningOnServer = true;
|
|
169
|
-
await dataApi.delete(r, urlSplit[urlSplit.length - 1]);
|
|
170
|
-
}
|
|
171
|
-
finally {
|
|
172
|
-
testConfiguration.restDbRunningOnServer = false;
|
|
173
|
-
}
|
|
174
|
-
return result;
|
|
175
|
-
},
|
|
176
|
-
get: async (url) => {
|
|
177
|
-
let r = new TestDataApiResponse();
|
|
178
|
-
let result;
|
|
179
|
-
r.success = data => { result = data; };
|
|
180
|
-
try {
|
|
181
|
-
testConfiguration.restDbRunningOnServer = true;
|
|
182
|
-
await dataApi.httpGet(r, urlToReq(url));
|
|
183
|
-
}
|
|
184
|
-
finally {
|
|
185
|
-
testConfiguration.restDbRunningOnServer = false;
|
|
186
|
-
}
|
|
187
|
-
return result;
|
|
188
|
-
},
|
|
189
|
-
post: async (url, data) => {
|
|
190
|
-
let r = new TestDataApiResponse();
|
|
191
|
-
let result;
|
|
192
|
-
r.created = data => { result = data; };
|
|
193
|
-
r.success = data => { result = data; };
|
|
194
|
-
try {
|
|
195
|
-
testConfiguration.restDbRunningOnServer = true;
|
|
196
|
-
await dataApi.httpPost(r, urlToReq(url), data);
|
|
197
|
-
}
|
|
198
|
-
finally {
|
|
199
|
-
testConfiguration.restDbRunningOnServer = false;
|
|
200
|
-
}
|
|
201
|
-
return result;
|
|
202
|
-
},
|
|
203
|
-
put: async (url, data) => {
|
|
204
|
-
let urlSplit = url.split('/');
|
|
205
|
-
let r = new TestDataApiResponse();
|
|
206
|
-
let result;
|
|
207
|
-
r.success = data => { result = data; };
|
|
208
|
-
try {
|
|
209
|
-
testConfiguration.restDbRunningOnServer = true;
|
|
210
|
-
await dataApi.put(r, urlSplit[urlSplit.length - 1], data);
|
|
211
|
-
}
|
|
212
|
-
finally {
|
|
213
|
-
testConfiguration.restDbRunningOnServer = false;
|
|
214
|
-
}
|
|
215
|
-
return result;
|
|
216
|
-
}
|
|
217
|
-
}), metadata);
|
|
161
|
+
return new RestEntityDataProvider(() => "", () => createMockHttpDataProvider(dataApi), metadata);
|
|
218
162
|
}
|
|
219
163
|
transaction(action) {
|
|
220
164
|
throw new Error('Method not implemented.');
|
|
221
165
|
}
|
|
222
166
|
}
|
|
167
|
+
export function createMockHttpDataProvider(dataApi) {
|
|
168
|
+
return new HttpProviderBridgeToRestDataProviderHttpProvider({
|
|
169
|
+
delete: async (url) => {
|
|
170
|
+
let urlSplit = url.split('/');
|
|
171
|
+
let r = new TestDataApiResponse();
|
|
172
|
+
let result;
|
|
173
|
+
r.deleted = () => { };
|
|
174
|
+
try {
|
|
175
|
+
testConfiguration.restDbRunningOnServer = true;
|
|
176
|
+
await dataApi.delete(r, urlSplit[urlSplit.length - 1]);
|
|
177
|
+
}
|
|
178
|
+
finally {
|
|
179
|
+
testConfiguration.restDbRunningOnServer = false;
|
|
180
|
+
}
|
|
181
|
+
return result;
|
|
182
|
+
},
|
|
183
|
+
get: async (url) => {
|
|
184
|
+
let r = new TestDataApiResponse();
|
|
185
|
+
let result;
|
|
186
|
+
r.success = data => { result = data; };
|
|
187
|
+
try {
|
|
188
|
+
testConfiguration.restDbRunningOnServer = true;
|
|
189
|
+
await dataApi.httpGet(r, urlToReq(url));
|
|
190
|
+
}
|
|
191
|
+
finally {
|
|
192
|
+
testConfiguration.restDbRunningOnServer = false;
|
|
193
|
+
}
|
|
194
|
+
return result;
|
|
195
|
+
},
|
|
196
|
+
post: async (url, data) => {
|
|
197
|
+
let r = new TestDataApiResponse();
|
|
198
|
+
let result;
|
|
199
|
+
r.created = data => { result = data; };
|
|
200
|
+
r.success = data => { result = data; };
|
|
201
|
+
try {
|
|
202
|
+
testConfiguration.restDbRunningOnServer = true;
|
|
203
|
+
await dataApi.httpPost(r, urlToReq(url), data);
|
|
204
|
+
}
|
|
205
|
+
finally {
|
|
206
|
+
testConfiguration.restDbRunningOnServer = false;
|
|
207
|
+
}
|
|
208
|
+
return result;
|
|
209
|
+
},
|
|
210
|
+
put: async (url, data) => {
|
|
211
|
+
let urlSplit = url.split('/');
|
|
212
|
+
let r = new TestDataApiResponse();
|
|
213
|
+
let result;
|
|
214
|
+
r.success = data => { result = data; };
|
|
215
|
+
try {
|
|
216
|
+
testConfiguration.restDbRunningOnServer = true;
|
|
217
|
+
await dataApi.put(r, urlSplit[urlSplit.length - 1], data);
|
|
218
|
+
}
|
|
219
|
+
finally {
|
|
220
|
+
testConfiguration.restDbRunningOnServer = false;
|
|
221
|
+
}
|
|
222
|
+
return result;
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
}
|
package/package.json
CHANGED
package/remult-express.js
CHANGED
|
@@ -22,7 +22,7 @@ function remultExpress(options) {
|
|
|
22
22
|
var server = expressBridge_1.createRemultServer(options);
|
|
23
23
|
server.registerRouter(app);
|
|
24
24
|
var httpServerEvents = new ServerEventsController(options.messageChannels);
|
|
25
|
-
server.liveQueryManager = new LiveQueryManager_1.
|
|
25
|
+
server.liveQueryManager = new LiveQueryManager_1.LiveQueryPublisher(httpServerEvents);
|
|
26
26
|
var streamPath = options.rootPath + '/' + LiveQuery_1.streamUrl;
|
|
27
27
|
app.get(streamPath, function (req, res) {
|
|
28
28
|
httpServerEvents.openHttpServerStream(req, res);
|
|
@@ -5,7 +5,7 @@ import { AllowedForInstance, Remult, UserInfo } from '../src/context';
|
|
|
5
5
|
import { ClassType } from '../classType';
|
|
6
6
|
import { Repository } from '../src/remult3';
|
|
7
7
|
import { IdEntity } from '../src/id-entity';
|
|
8
|
-
import {
|
|
8
|
+
import { LiveQueryPublisher } from '../src/live-query/LiveQueryManager';
|
|
9
9
|
export interface RemultServerOptions<RequestType extends GenericRequest> {
|
|
10
10
|
/** Sets a database connection for Remult.
|
|
11
11
|
*
|
|
@@ -64,7 +64,7 @@ export declare class RemultServerImplementation implements RemultServer {
|
|
|
64
64
|
options: RemultServerOptions<GenericRequest>;
|
|
65
65
|
dataProvider: DataProvider | Promise<DataProvider>;
|
|
66
66
|
constructor(queue: inProcessQueueHandler, options: RemultServerOptions<GenericRequest>, dataProvider: DataProvider | Promise<DataProvider>);
|
|
67
|
-
liveQueryManager:
|
|
67
|
+
liveQueryManager: LiveQueryPublisher;
|
|
68
68
|
withRemult<T>(req: GenericRequest, res: GenericResponse, next: VoidFunction): void;
|
|
69
69
|
routeImpl: RouteImplementation;
|
|
70
70
|
handle(req: GenericRequest, gRes?: GenericResponse): Promise<ServerHandleResponse>;
|
package/server/initAsyncHooks.js
CHANGED
|
@@ -6,8 +6,8 @@ var LiveQuery_1 = require("./LiveQuery");
|
|
|
6
6
|
var EventSourceLiveQueryProvider = /** @class */ (function () {
|
|
7
7
|
function EventSourceLiveQueryProvider(wrapMessage) {
|
|
8
8
|
this.wrapMessage = wrapMessage;
|
|
9
|
-
if (!wrapMessage)
|
|
10
|
-
wrapMessage = function (x) { return x(); };
|
|
9
|
+
if (!this.wrapMessage)
|
|
10
|
+
this.wrapMessage = function (x) { return x(); };
|
|
11
11
|
}
|
|
12
12
|
EventSourceLiveQueryProvider.prototype.openStreamAndReturnCloseFunction = function (clientId, onMessage) {
|
|
13
13
|
var _this = this;
|
|
@@ -23,7 +23,6 @@ export declare class LiveQueryClient {
|
|
|
23
23
|
subscribe<entityType>(repo: Repository<entityType>, options: FindOptions<entityType>, onResult: (reducer: (prevState: entityType[]) => entityType[]) => void): () => void;
|
|
24
24
|
closeListener: Promise<VoidFunction>;
|
|
25
25
|
private openIfNoOpened;
|
|
26
|
-
private openListener;
|
|
27
26
|
}
|
|
28
27
|
export declare type listener = (message: any) => void;
|
|
29
28
|
export interface SubscribeToQueryArgs<entityType = any> {
|
|
@@ -6,12 +6,13 @@ var index_1 = require("../../index");
|
|
|
6
6
|
var uuid_1 = require("uuid");
|
|
7
7
|
var rest_data_provider_1 = require("../data-providers/rest-data-provider");
|
|
8
8
|
var context_1 = require("../context");
|
|
9
|
+
var getId_1 = require("../remult3/getId");
|
|
9
10
|
exports.streamUrl = 'stream1';
|
|
10
11
|
var LiveQueryOnFrontEnd = /** @class */ (function () {
|
|
11
12
|
function LiveQueryOnFrontEnd(repo, query) {
|
|
12
13
|
this.repo = repo;
|
|
13
14
|
this.query = query;
|
|
14
|
-
this.
|
|
15
|
+
this.defaultQueryState = [];
|
|
15
16
|
this.listeners = [];
|
|
16
17
|
}
|
|
17
18
|
LiveQueryOnFrontEnd.prototype.setAllItems = function (result) {
|
|
@@ -36,6 +37,7 @@ var LiveQueryOnFrontEnd = /** @class */ (function () {
|
|
|
36
37
|
LiveQueryOnFrontEnd.prototype.forListeners = function (what) {
|
|
37
38
|
var e_1, _a;
|
|
38
39
|
try {
|
|
40
|
+
// what(x => this.defaultQueryState = x(this.defaultQueryState));
|
|
39
41
|
for (var _b = tslib_1.__values(this.listeners), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
40
42
|
var l = _c.value;
|
|
41
43
|
what(l);
|
|
@@ -81,7 +83,7 @@ var LiveQueryOnFrontEnd = /** @class */ (function () {
|
|
|
81
83
|
listener(function (items) {
|
|
82
84
|
if (!items)
|
|
83
85
|
items = [];
|
|
84
|
-
return sort(items.map(function (x) { return _this.repo.
|
|
86
|
+
return sort(items.map(function (x) { return getId_1.getId(_this.repo.metadata, x) === message.data.oldId ? item_1 : x; }));
|
|
85
87
|
});
|
|
86
88
|
});
|
|
87
89
|
return [3 /*break*/, 7];
|
|
@@ -102,7 +104,7 @@ var LiveQueryOnFrontEnd = /** @class */ (function () {
|
|
|
102
104
|
return listener(function (items) {
|
|
103
105
|
if (!items)
|
|
104
106
|
items = [];
|
|
105
|
-
return
|
|
107
|
+
return items.filter(function (x) { return getId_1.getId(_this.repo.metadata, x) !== message.data.id; });
|
|
106
108
|
});
|
|
107
109
|
});
|
|
108
110
|
return [3 /*break*/, 7];
|
|
@@ -197,7 +199,7 @@ var LiveQueryClient = /** @class */ (function () {
|
|
|
197
199
|
var _this = this;
|
|
198
200
|
var alive = true;
|
|
199
201
|
var onUnsubscribe = function () { };
|
|
200
|
-
this.runPromise(this.
|
|
202
|
+
this.runPromise(this.openIfNoOpened().then(function () { return repo.buildEntityDataProviderFindOptions(options)
|
|
201
203
|
.then(function (opts) {
|
|
202
204
|
if (!alive)
|
|
203
205
|
return;
|
|
@@ -219,7 +221,7 @@ var LiveQueryClient = /** @class */ (function () {
|
|
|
219
221
|
_this.runPromise(_this.provider.get(url.url).then(thenResult));
|
|
220
222
|
}
|
|
221
223
|
else {
|
|
222
|
-
onResult(function (x) { return q.
|
|
224
|
+
onResult(function (x) { return tslib_1.__spread(q.defaultQueryState); });
|
|
223
225
|
}
|
|
224
226
|
q.listeners.push(onResult);
|
|
225
227
|
onUnsubscribe = function () {
|
|
@@ -236,39 +238,34 @@ var LiveQueryClient = /** @class */ (function () {
|
|
|
236
238
|
};
|
|
237
239
|
};
|
|
238
240
|
LiveQueryClient.prototype.openIfNoOpened = function () {
|
|
241
|
+
var _this = this;
|
|
239
242
|
if (!this.provider) {
|
|
240
243
|
this.provider = context_1.buildRestDataProvider(index_1.remult.apiClient.httpClient);
|
|
241
244
|
}
|
|
242
245
|
if (!this.closeListener)
|
|
243
|
-
return this.
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
var e_3, _a;
|
|
252
|
-
try {
|
|
253
|
-
for (var _b = tslib_1.__values(_this.queries.values()), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
254
|
-
var q = _c.value;
|
|
255
|
-
if (q.id === message.event) {
|
|
256
|
-
_this.runPromise(q.handle(message.data));
|
|
246
|
+
return this.runPromise(this.closeListener = this.lqp.openStreamAndReturnCloseFunction(this.clientId, function (message) {
|
|
247
|
+
var e_3, _a;
|
|
248
|
+
try {
|
|
249
|
+
for (var _b = tslib_1.__values(_this.queries.values()), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
250
|
+
var q = _c.value;
|
|
251
|
+
if (q.id === message.event) {
|
|
252
|
+
_this.runPromise(q.handle(message.data));
|
|
253
|
+
}
|
|
257
254
|
}
|
|
258
255
|
}
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
256
|
+
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
257
|
+
finally {
|
|
258
|
+
try {
|
|
259
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
260
|
+
}
|
|
261
|
+
finally { if (e_3) throw e_3.error; }
|
|
264
262
|
}
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
}));
|
|
263
|
+
var channel = _this.channels.get(message.event);
|
|
264
|
+
if (channel) {
|
|
265
|
+
channel.handle(message.data);
|
|
266
|
+
}
|
|
267
|
+
}));
|
|
268
|
+
return this.closeListener;
|
|
272
269
|
};
|
|
273
270
|
return LiveQueryClient;
|
|
274
271
|
}());
|
|
@@ -2,12 +2,11 @@ import { Remult } from '../..';
|
|
|
2
2
|
import { Repository, EntityRef, FindOptions } from '../remult3';
|
|
3
3
|
import { LiveQueryProvider } from '../data-api';
|
|
4
4
|
import { liveQueryMessage } from './LiveQuery';
|
|
5
|
-
export declare class
|
|
5
|
+
export declare class LiveQueryPublisher implements LiveQueryProvider {
|
|
6
6
|
private dispatcher;
|
|
7
7
|
constructor(dispatcher: ServerEventDispatcher);
|
|
8
8
|
subscribe(repo: Repository<any>, clientId: string, findOptions: FindOptions<any>, remult: Remult, ids: any[]): string;
|
|
9
9
|
clients: clientInfo[];
|
|
10
|
-
sendMessage(key: string, message: liveQueryMessage): void;
|
|
11
10
|
hasListeners(ref: EntityRef<any>): boolean;
|
|
12
11
|
runPromise(p: Promise<any>): void;
|
|
13
12
|
saved(ref: EntityRef<any>): void;
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.LiveQueryPublisher = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
var uuid_1 = require("uuid");
|
|
6
|
-
var
|
|
7
|
-
function
|
|
6
|
+
var LiveQueryPublisher = /** @class */ (function () {
|
|
7
|
+
function LiveQueryPublisher(dispatcher) {
|
|
8
8
|
this.dispatcher = dispatcher;
|
|
9
9
|
this.clients = [];
|
|
10
10
|
}
|
|
11
|
-
|
|
11
|
+
LiveQueryPublisher.prototype.subscribe = function (repo, clientId, findOptions, remult, ids) {
|
|
12
12
|
var client = this.clients.find(function (c) { return c.clientId === clientId; });
|
|
13
13
|
if (!client) {
|
|
14
14
|
this.clients.push(client = { clientId: clientId, queries: [] });
|
|
@@ -23,7 +23,7 @@ var LiveQueryManager = /** @class */ (function () {
|
|
|
23
23
|
});
|
|
24
24
|
return id;
|
|
25
25
|
};
|
|
26
|
-
|
|
26
|
+
LiveQueryPublisher.prototype.hasListeners = function (ref) {
|
|
27
27
|
var e_1, _a, e_2, _b;
|
|
28
28
|
try {
|
|
29
29
|
for (var _c = tslib_1.__values(this.clients), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
@@ -31,9 +31,8 @@ var LiveQueryManager = /** @class */ (function () {
|
|
|
31
31
|
try {
|
|
32
32
|
for (var _e = (e_2 = void 0, tslib_1.__values(c.queries)), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
33
33
|
var q = _f.value;
|
|
34
|
-
if (q.repo.metadata.key === key)
|
|
35
|
-
|
|
36
|
-
}
|
|
34
|
+
if (q.repo.metadata.key === ref.metadata.key)
|
|
35
|
+
return true;
|
|
37
36
|
}
|
|
38
37
|
}
|
|
39
38
|
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
@@ -52,51 +51,22 @@ var LiveQueryManager = /** @class */ (function () {
|
|
|
52
51
|
}
|
|
53
52
|
finally { if (e_1) throw e_1.error; }
|
|
54
53
|
}
|
|
55
|
-
};
|
|
56
|
-
LiveQueryManager.prototype.hasListeners = function (ref) {
|
|
57
|
-
var e_3, _a, e_4, _b;
|
|
58
|
-
try {
|
|
59
|
-
for (var _c = tslib_1.__values(this.clients), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
60
|
-
var c = _d.value;
|
|
61
|
-
try {
|
|
62
|
-
for (var _e = (e_4 = void 0, tslib_1.__values(c.queries)), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
63
|
-
var q = _f.value;
|
|
64
|
-
if (q.repo.metadata.key === ref.metadata.key)
|
|
65
|
-
return true;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
69
|
-
finally {
|
|
70
|
-
try {
|
|
71
|
-
if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
|
|
72
|
-
}
|
|
73
|
-
finally { if (e_4) throw e_4.error; }
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
78
|
-
finally {
|
|
79
|
-
try {
|
|
80
|
-
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
81
|
-
}
|
|
82
|
-
finally { if (e_3) throw e_3.error; }
|
|
83
|
-
}
|
|
84
54
|
return false;
|
|
85
55
|
};
|
|
86
|
-
|
|
56
|
+
LiveQueryPublisher.prototype.runPromise = function (p) {
|
|
87
57
|
};
|
|
88
58
|
//TODO - reconsider usage of zone
|
|
89
|
-
|
|
90
|
-
var
|
|
59
|
+
LiveQueryPublisher.prototype.saved = function (ref) {
|
|
60
|
+
var e_3, _a;
|
|
91
61
|
var _this = this;
|
|
92
62
|
var isNew = ref.isNew();
|
|
93
63
|
var origId = isNew ? ref.getId() : ref.getOriginalId();
|
|
94
64
|
var _loop_1 = function (c) {
|
|
95
|
-
var
|
|
65
|
+
var e_4, _a;
|
|
96
66
|
var _loop_2 = function (q) {
|
|
97
67
|
if (q.repo.metadata.key === ref.metadata.key) {
|
|
98
68
|
this_1.runPromise(q.repo.find(q.findOptions).then(function (currentItems) {
|
|
99
|
-
var
|
|
69
|
+
var e_5, _a, e_6, _b;
|
|
100
70
|
var currentIds = currentItems.map(function (x) { return q.repo.getEntityRef(x).getId(); });
|
|
101
71
|
var sendMessage = function (message) {
|
|
102
72
|
console.log({ message: message.type });
|
|
@@ -104,7 +74,7 @@ var LiveQueryManager = /** @class */ (function () {
|
|
|
104
74
|
};
|
|
105
75
|
console.log({ ids: q.ids, currentIds: currentIds });
|
|
106
76
|
try {
|
|
107
|
-
for (var _c = (
|
|
77
|
+
for (var _c = (e_5 = void 0, tslib_1.__values(q.ids.filter(function (y) { return !currentIds.includes(y); }))), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
108
78
|
var id = _d.value;
|
|
109
79
|
if (id != origId || !currentIds.includes(ref.getId()))
|
|
110
80
|
sendMessage({
|
|
@@ -115,15 +85,15 @@ var LiveQueryManager = /** @class */ (function () {
|
|
|
115
85
|
});
|
|
116
86
|
}
|
|
117
87
|
}
|
|
118
|
-
catch (
|
|
88
|
+
catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
|
119
89
|
finally {
|
|
120
90
|
try {
|
|
121
91
|
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
122
92
|
}
|
|
123
|
-
finally { if (
|
|
93
|
+
finally { if (e_5) throw e_5.error; }
|
|
124
94
|
}
|
|
125
95
|
try {
|
|
126
|
-
for (var currentItems_1 = (
|
|
96
|
+
for (var currentItems_1 = (e_6 = void 0, tslib_1.__values(currentItems)), currentItems_1_1 = currentItems_1.next(); !currentItems_1_1.done; currentItems_1_1 = currentItems_1.next()) {
|
|
127
97
|
var item = currentItems_1_1.value;
|
|
128
98
|
var itemRef = q.repo.getEntityRef(item);
|
|
129
99
|
if (itemRef.getId() == ref.getId() && q.ids.includes(origId)) {
|
|
@@ -143,29 +113,29 @@ var LiveQueryManager = /** @class */ (function () {
|
|
|
143
113
|
}
|
|
144
114
|
}
|
|
145
115
|
}
|
|
146
|
-
catch (
|
|
116
|
+
catch (e_6_1) { e_6 = { error: e_6_1 }; }
|
|
147
117
|
finally {
|
|
148
118
|
try {
|
|
149
119
|
if (currentItems_1_1 && !currentItems_1_1.done && (_b = currentItems_1.return)) _b.call(currentItems_1);
|
|
150
120
|
}
|
|
151
|
-
finally { if (
|
|
121
|
+
finally { if (e_6) throw e_6.error; }
|
|
152
122
|
}
|
|
153
123
|
q.ids = currentIds;
|
|
154
124
|
}));
|
|
155
125
|
}
|
|
156
126
|
};
|
|
157
127
|
try {
|
|
158
|
-
for (var _b = (
|
|
128
|
+
for (var _b = (e_4 = void 0, tslib_1.__values(c.queries)), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
159
129
|
var q = _c.value;
|
|
160
130
|
_loop_2(q);
|
|
161
131
|
}
|
|
162
132
|
}
|
|
163
|
-
catch (
|
|
133
|
+
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
164
134
|
finally {
|
|
165
135
|
try {
|
|
166
136
|
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
167
137
|
}
|
|
168
|
-
finally { if (
|
|
138
|
+
finally { if (e_4) throw e_4.error; }
|
|
169
139
|
}
|
|
170
140
|
};
|
|
171
141
|
var this_1 = this;
|
|
@@ -175,22 +145,54 @@ var LiveQueryManager = /** @class */ (function () {
|
|
|
175
145
|
_loop_1(c);
|
|
176
146
|
}
|
|
177
147
|
}
|
|
178
|
-
catch (
|
|
148
|
+
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
179
149
|
finally {
|
|
180
150
|
try {
|
|
181
151
|
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
182
152
|
}
|
|
183
|
-
finally { if (
|
|
153
|
+
finally { if (e_3) throw e_3.error; }
|
|
184
154
|
}
|
|
185
155
|
};
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
156
|
+
LiveQueryPublisher.prototype.deleted = function (ref) {
|
|
157
|
+
var e_7, _a, e_8, _b;
|
|
158
|
+
var id = ref.getOriginalId();
|
|
159
|
+
try {
|
|
160
|
+
for (var _c = tslib_1.__values(this.clients), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
161
|
+
var c = _d.value;
|
|
162
|
+
try {
|
|
163
|
+
for (var _e = (e_8 = void 0, tslib_1.__values(c.queries)), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
164
|
+
var q = _f.value;
|
|
165
|
+
if (q.repo.metadata.key === ref.metadata.key) {
|
|
166
|
+
if (q.ids.includes(id)) {
|
|
167
|
+
this.dispatcher.sendQueryMessage({
|
|
168
|
+
clientId: c.clientId, queryId: q.id, message: {
|
|
169
|
+
type: "remove",
|
|
170
|
+
data: {
|
|
171
|
+
id: id
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
catch (e_8_1) { e_8 = { error: e_8_1 }; }
|
|
180
|
+
finally {
|
|
181
|
+
try {
|
|
182
|
+
if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
|
|
183
|
+
}
|
|
184
|
+
finally { if (e_8) throw e_8.error; }
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch (e_7_1) { e_7 = { error: e_7_1 }; }
|
|
189
|
+
finally {
|
|
190
|
+
try {
|
|
191
|
+
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
192
|
+
}
|
|
193
|
+
finally { if (e_7) throw e_7.error; }
|
|
194
|
+
}
|
|
193
195
|
};
|
|
194
|
-
return
|
|
196
|
+
return LiveQueryPublisher;
|
|
195
197
|
}());
|
|
196
|
-
exports.
|
|
198
|
+
exports.LiveQueryPublisher = LiveQueryPublisher;
|
|
@@ -11,6 +11,7 @@ var valueConverters_1 = require("../valueConverters");
|
|
|
11
11
|
var filter_interfaces_2 = require("../filter/filter-interfaces");
|
|
12
12
|
var assign_1 = require("../../assign");
|
|
13
13
|
var remult_proxy_1 = require("../remult-proxy");
|
|
14
|
+
var getId_1 = require("./getId");
|
|
14
15
|
//import { remult } from "../remult-proxy";
|
|
15
16
|
var classValidatorValidate = undefined;
|
|
16
17
|
// import("class-validator".toString())
|
|
@@ -282,8 +283,10 @@ var RepositoryImplementation = /** @class */ (function () {
|
|
|
282
283
|
finally { if (e_5) throw e_5.error; }
|
|
283
284
|
}
|
|
284
285
|
var row_1 = new rowHelperImplementation(this._info, instance, this, this.edp, this.remult, false);
|
|
285
|
-
if (id)
|
|
286
|
+
if (id) {
|
|
286
287
|
row_1.id = id;
|
|
288
|
+
row_1.originalId = id;
|
|
289
|
+
}
|
|
287
290
|
else
|
|
288
291
|
row_1.id = row_1.getId();
|
|
289
292
|
ref = row_1;
|
|
@@ -1218,10 +1221,7 @@ var rowHelperImplementation = /** @class */ (function (_super) {
|
|
|
1218
1221
|
configurable: true
|
|
1219
1222
|
});
|
|
1220
1223
|
rowHelperImplementation.prototype.getId = function () {
|
|
1221
|
-
|
|
1222
|
-
return this.info.idMetadata.field.getId(this.instance);
|
|
1223
|
-
else
|
|
1224
|
-
return this.instance[this.info.idMetadata.field.key];
|
|
1224
|
+
return getId_1.getId(this.info, this.instance);
|
|
1225
1225
|
};
|
|
1226
1226
|
rowHelperImplementation.prototype.saveMoreOriginalData = function () {
|
|
1227
1227
|
this.originalId = this.getId();
|
|
@@ -1551,11 +1551,7 @@ var rowHelperImplementation = /** @class */ (function (_super) {
|
|
|
1551
1551
|
case 12: return [4 /*yield*/, this.calcServerExpression()];
|
|
1552
1552
|
case 13:
|
|
1553
1553
|
_d.sent();
|
|
1554
|
-
|
|
1555
|
-
this.id = this.repository.metadata.idMetadata.field.getId(this.instance);
|
|
1556
|
-
}
|
|
1557
|
-
else
|
|
1558
|
-
this.id = data[this.repository.metadata.idMetadata.field.key];
|
|
1554
|
+
this.id = getId_1.getId(this.info, this.instance);
|
|
1559
1555
|
return [2 /*return*/];
|
|
1560
1556
|
}
|
|
1561
1557
|
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getId = void 0;
|
|
4
|
+
var column_1 = require("../column");
|
|
5
|
+
function getId(meta, instance) {
|
|
6
|
+
if (meta.idMetadata.field instanceof column_1.CompoundIdField)
|
|
7
|
+
return meta.idMetadata.field.getId(instance);
|
|
8
|
+
else
|
|
9
|
+
return instance[meta.idMetadata.field.key];
|
|
10
|
+
}
|
|
11
|
+
exports.getId = getId;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import './frontend-database-tests-setup.spec';
|
|
2
2
|
import { Remult } from "../context";
|
|
3
|
+
import { DataApi } from "../data-api";
|
|
3
4
|
import { DataProvider, EntityDataProvider } from "../data-interfaces";
|
|
4
5
|
import { InMemoryDataProvider } from "../data-providers/in-memory-database";
|
|
5
6
|
import { EntityMetadata } from "../remult3";
|
|
@@ -32,3 +33,4 @@ export declare class MockRestDataProvider implements DataProvider {
|
|
|
32
33
|
transaction(action: (dataProvider: DataProvider) => Promise<void>): Promise<void>;
|
|
33
34
|
supportsCustomFilter: boolean;
|
|
34
35
|
}
|
|
36
|
+
export declare function createMockHttpDataProvider(dataApi: DataApi<any>): import("c:/Repos/radweb/projects/core/src/data-interfaces").RestDataProviderHttpProvider;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MockRestDataProvider = exports.testAllDataProviders = exports.testRestDb = exports.testInMemoryDb = exports.testSql = exports.ActionTestConfig = exports.testAsIfOnBackend = exports.fitForEach = exports.itForEach = void 0;
|
|
3
|
+
exports.createMockHttpDataProvider = exports.MockRestDataProvider = exports.testAllDataProviders = exports.testRestDb = exports.testInMemoryDb = exports.testSql = exports.ActionTestConfig = exports.testAsIfOnBackend = exports.fitForEach = exports.itForEach = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
require("./frontend-database-tests-setup.spec");
|
|
6
6
|
var context_1 = require("../context");
|
|
@@ -270,101 +270,8 @@ var MockRestDataProvider = /** @class */ (function () {
|
|
|
270
270
|
this.supportsCustomFilter = true;
|
|
271
271
|
}
|
|
272
272
|
MockRestDataProvider.prototype.getEntityDataProvider = function (metadata) {
|
|
273
|
-
var _this = this;
|
|
274
273
|
var dataApi = new data_api_1.DataApi(this.remult.repo(metadata.entityType), this.remult);
|
|
275
|
-
return new rest_data_provider_1.RestEntityDataProvider(function () { return ""; }, function () { return
|
|
276
|
-
delete: function (url) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
277
|
-
var urlSplit, r, result;
|
|
278
|
-
return tslib_1.__generator(this, function (_a) {
|
|
279
|
-
switch (_a.label) {
|
|
280
|
-
case 0:
|
|
281
|
-
urlSplit = url.split('/');
|
|
282
|
-
r = new TestDataApiResponse_1.TestDataApiResponse();
|
|
283
|
-
r.deleted = function () { };
|
|
284
|
-
_a.label = 1;
|
|
285
|
-
case 1:
|
|
286
|
-
_a.trys.push([1, , 3, 4]);
|
|
287
|
-
entityWithValidations_1.testConfiguration.restDbRunningOnServer = true;
|
|
288
|
-
return [4 /*yield*/, dataApi.delete(r, urlSplit[urlSplit.length - 1])];
|
|
289
|
-
case 2:
|
|
290
|
-
_a.sent();
|
|
291
|
-
return [3 /*break*/, 4];
|
|
292
|
-
case 3:
|
|
293
|
-
entityWithValidations_1.testConfiguration.restDbRunningOnServer = false;
|
|
294
|
-
return [7 /*endfinally*/];
|
|
295
|
-
case 4: return [2 /*return*/, result];
|
|
296
|
-
}
|
|
297
|
-
});
|
|
298
|
-
}); },
|
|
299
|
-
get: function (url) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
300
|
-
var r, result;
|
|
301
|
-
return tslib_1.__generator(this, function (_a) {
|
|
302
|
-
switch (_a.label) {
|
|
303
|
-
case 0:
|
|
304
|
-
r = new TestDataApiResponse_1.TestDataApiResponse();
|
|
305
|
-
r.success = function (data) { result = data; };
|
|
306
|
-
_a.label = 1;
|
|
307
|
-
case 1:
|
|
308
|
-
_a.trys.push([1, , 3, 4]);
|
|
309
|
-
entityWithValidations_1.testConfiguration.restDbRunningOnServer = true;
|
|
310
|
-
return [4 /*yield*/, dataApi.httpGet(r, urlToReq(url))];
|
|
311
|
-
case 2:
|
|
312
|
-
_a.sent();
|
|
313
|
-
return [3 /*break*/, 4];
|
|
314
|
-
case 3:
|
|
315
|
-
entityWithValidations_1.testConfiguration.restDbRunningOnServer = false;
|
|
316
|
-
return [7 /*endfinally*/];
|
|
317
|
-
case 4: return [2 /*return*/, result];
|
|
318
|
-
}
|
|
319
|
-
});
|
|
320
|
-
}); },
|
|
321
|
-
post: function (url, data) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
322
|
-
var r, result;
|
|
323
|
-
return tslib_1.__generator(this, function (_a) {
|
|
324
|
-
switch (_a.label) {
|
|
325
|
-
case 0:
|
|
326
|
-
r = new TestDataApiResponse_1.TestDataApiResponse();
|
|
327
|
-
r.created = function (data) { result = data; };
|
|
328
|
-
r.success = function (data) { result = data; };
|
|
329
|
-
_a.label = 1;
|
|
330
|
-
case 1:
|
|
331
|
-
_a.trys.push([1, , 3, 4]);
|
|
332
|
-
entityWithValidations_1.testConfiguration.restDbRunningOnServer = true;
|
|
333
|
-
return [4 /*yield*/, dataApi.httpPost(r, urlToReq(url), data)];
|
|
334
|
-
case 2:
|
|
335
|
-
_a.sent();
|
|
336
|
-
return [3 /*break*/, 4];
|
|
337
|
-
case 3:
|
|
338
|
-
entityWithValidations_1.testConfiguration.restDbRunningOnServer = false;
|
|
339
|
-
return [7 /*endfinally*/];
|
|
340
|
-
case 4: return [2 /*return*/, result];
|
|
341
|
-
}
|
|
342
|
-
});
|
|
343
|
-
}); },
|
|
344
|
-
put: function (url, data) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
345
|
-
var urlSplit, r, result;
|
|
346
|
-
return tslib_1.__generator(this, function (_a) {
|
|
347
|
-
switch (_a.label) {
|
|
348
|
-
case 0:
|
|
349
|
-
urlSplit = url.split('/');
|
|
350
|
-
r = new TestDataApiResponse_1.TestDataApiResponse();
|
|
351
|
-
r.success = function (data) { result = data; };
|
|
352
|
-
_a.label = 1;
|
|
353
|
-
case 1:
|
|
354
|
-
_a.trys.push([1, , 3, 4]);
|
|
355
|
-
entityWithValidations_1.testConfiguration.restDbRunningOnServer = true;
|
|
356
|
-
return [4 /*yield*/, dataApi.put(r, urlSplit[urlSplit.length - 1], data)];
|
|
357
|
-
case 2:
|
|
358
|
-
_a.sent();
|
|
359
|
-
return [3 /*break*/, 4];
|
|
360
|
-
case 3:
|
|
361
|
-
entityWithValidations_1.testConfiguration.restDbRunningOnServer = false;
|
|
362
|
-
return [7 /*endfinally*/];
|
|
363
|
-
case 4: return [2 /*return*/, result];
|
|
364
|
-
}
|
|
365
|
-
});
|
|
366
|
-
}); }
|
|
367
|
-
}); }, metadata);
|
|
274
|
+
return new rest_data_provider_1.RestEntityDataProvider(function () { return ""; }, function () { return createMockHttpDataProvider(dataApi); }, metadata);
|
|
368
275
|
};
|
|
369
276
|
MockRestDataProvider.prototype.transaction = function (action) {
|
|
370
277
|
throw new Error('Method not implemented.');
|
|
@@ -372,3 +279,100 @@ var MockRestDataProvider = /** @class */ (function () {
|
|
|
372
279
|
return MockRestDataProvider;
|
|
373
280
|
}());
|
|
374
281
|
exports.MockRestDataProvider = MockRestDataProvider;
|
|
282
|
+
function createMockHttpDataProvider(dataApi) {
|
|
283
|
+
var _this = this;
|
|
284
|
+
return new context_1.HttpProviderBridgeToRestDataProviderHttpProvider({
|
|
285
|
+
delete: function (url) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
286
|
+
var urlSplit, r, result;
|
|
287
|
+
return tslib_1.__generator(this, function (_a) {
|
|
288
|
+
switch (_a.label) {
|
|
289
|
+
case 0:
|
|
290
|
+
urlSplit = url.split('/');
|
|
291
|
+
r = new TestDataApiResponse_1.TestDataApiResponse();
|
|
292
|
+
r.deleted = function () { };
|
|
293
|
+
_a.label = 1;
|
|
294
|
+
case 1:
|
|
295
|
+
_a.trys.push([1, , 3, 4]);
|
|
296
|
+
entityWithValidations_1.testConfiguration.restDbRunningOnServer = true;
|
|
297
|
+
return [4 /*yield*/, dataApi.delete(r, urlSplit[urlSplit.length - 1])];
|
|
298
|
+
case 2:
|
|
299
|
+
_a.sent();
|
|
300
|
+
return [3 /*break*/, 4];
|
|
301
|
+
case 3:
|
|
302
|
+
entityWithValidations_1.testConfiguration.restDbRunningOnServer = false;
|
|
303
|
+
return [7 /*endfinally*/];
|
|
304
|
+
case 4: return [2 /*return*/, result];
|
|
305
|
+
}
|
|
306
|
+
});
|
|
307
|
+
}); },
|
|
308
|
+
get: function (url) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
309
|
+
var r, result;
|
|
310
|
+
return tslib_1.__generator(this, function (_a) {
|
|
311
|
+
switch (_a.label) {
|
|
312
|
+
case 0:
|
|
313
|
+
r = new TestDataApiResponse_1.TestDataApiResponse();
|
|
314
|
+
r.success = function (data) { result = data; };
|
|
315
|
+
_a.label = 1;
|
|
316
|
+
case 1:
|
|
317
|
+
_a.trys.push([1, , 3, 4]);
|
|
318
|
+
entityWithValidations_1.testConfiguration.restDbRunningOnServer = true;
|
|
319
|
+
return [4 /*yield*/, dataApi.httpGet(r, urlToReq(url))];
|
|
320
|
+
case 2:
|
|
321
|
+
_a.sent();
|
|
322
|
+
return [3 /*break*/, 4];
|
|
323
|
+
case 3:
|
|
324
|
+
entityWithValidations_1.testConfiguration.restDbRunningOnServer = false;
|
|
325
|
+
return [7 /*endfinally*/];
|
|
326
|
+
case 4: return [2 /*return*/, result];
|
|
327
|
+
}
|
|
328
|
+
});
|
|
329
|
+
}); },
|
|
330
|
+
post: function (url, data) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
331
|
+
var r, result;
|
|
332
|
+
return tslib_1.__generator(this, function (_a) {
|
|
333
|
+
switch (_a.label) {
|
|
334
|
+
case 0:
|
|
335
|
+
r = new TestDataApiResponse_1.TestDataApiResponse();
|
|
336
|
+
r.created = function (data) { result = data; };
|
|
337
|
+
r.success = function (data) { result = data; };
|
|
338
|
+
_a.label = 1;
|
|
339
|
+
case 1:
|
|
340
|
+
_a.trys.push([1, , 3, 4]);
|
|
341
|
+
entityWithValidations_1.testConfiguration.restDbRunningOnServer = true;
|
|
342
|
+
return [4 /*yield*/, dataApi.httpPost(r, urlToReq(url), data)];
|
|
343
|
+
case 2:
|
|
344
|
+
_a.sent();
|
|
345
|
+
return [3 /*break*/, 4];
|
|
346
|
+
case 3:
|
|
347
|
+
entityWithValidations_1.testConfiguration.restDbRunningOnServer = false;
|
|
348
|
+
return [7 /*endfinally*/];
|
|
349
|
+
case 4: return [2 /*return*/, result];
|
|
350
|
+
}
|
|
351
|
+
});
|
|
352
|
+
}); },
|
|
353
|
+
put: function (url, data) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
354
|
+
var urlSplit, r, result;
|
|
355
|
+
return tslib_1.__generator(this, function (_a) {
|
|
356
|
+
switch (_a.label) {
|
|
357
|
+
case 0:
|
|
358
|
+
urlSplit = url.split('/');
|
|
359
|
+
r = new TestDataApiResponse_1.TestDataApiResponse();
|
|
360
|
+
r.success = function (data) { result = data; };
|
|
361
|
+
_a.label = 1;
|
|
362
|
+
case 1:
|
|
363
|
+
_a.trys.push([1, , 3, 4]);
|
|
364
|
+
entityWithValidations_1.testConfiguration.restDbRunningOnServer = true;
|
|
365
|
+
return [4 /*yield*/, dataApi.put(r, urlSplit[urlSplit.length - 1], data)];
|
|
366
|
+
case 2:
|
|
367
|
+
_a.sent();
|
|
368
|
+
return [3 /*break*/, 4];
|
|
369
|
+
case 3:
|
|
370
|
+
entityWithValidations_1.testConfiguration.restDbRunningOnServer = false;
|
|
371
|
+
return [7 /*endfinally*/];
|
|
372
|
+
case 4: return [2 /*return*/, result];
|
|
373
|
+
}
|
|
374
|
+
});
|
|
375
|
+
}); }
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
exports.createMockHttpDataProvider = createMockHttpDataProvider;
|