@sentio/runtime 2.39.7-rc.18 → 2.39.7-rc.19

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.
@@ -1,5 +1,5 @@
1
1
  import { Subject } from 'rxjs';
2
- import { DBRequest, DBResponse, DeepPartial, ProcessStreamResponse } from '@sentio/protos';
2
+ import { DBRequest, DBRequest_DBUpsert, DBResponse, DeepPartial, ProcessStreamResponse } from '@sentio/protos';
3
3
  type Request = Omit<DBRequest, 'opId'>;
4
4
  export declare const timeoutError: unique symbol;
5
5
  export declare class StoreContext {
@@ -13,6 +13,9 @@ export declare class StoreContext {
13
13
  result(dbResult: DBResponse): void;
14
14
  error(processId: number, e: any): void;
15
15
  close(): void;
16
+ queuedUpsert: DBRequest_DBUpsert | undefined;
17
+ queuedUpsertPromise: Promise<DBResponse> | undefined;
18
+ private sendUpsert;
16
19
  }
17
20
  export {};
18
21
  //# sourceMappingURL=db-context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"db-context.d.ts","sourceRoot":"","sources":["../src/db-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAC9B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAiB,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AAEzG,KAAK,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;AACtC,eAAO,MAAM,YAAY,eAAW,CAAA;AAEpC,qBAAa,YAAY;IAMrB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC;IAC7D,QAAQ,CAAC,SAAS,EAAE,MAAM;IAN5B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAK;IAE7B,OAAO,CAAC,MAAM,CAAuF;gBAG1F,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC,EACpD,SAAS,EAAE,MAAM;IAG5B,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM;IAM1B,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAwCrF,MAAM,CAAC,QAAQ,EAAE,UAAU;IAc3B,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG;IAa/B,KAAK;CAON"}
1
+ {"version":3,"file":"db-context.d.ts","sourceRoot":"","sources":["../src/db-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAC9B,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,UAAU,EACV,WAAW,EAEX,qBAAqB,EACtB,MAAM,gBAAgB,CAAA;AAEvB,KAAK,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;AACtC,eAAO,MAAM,YAAY,eAAW,CAAA;AAEpC,qBAAa,YAAY;IAMrB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC;IAC7D,QAAQ,CAAC,SAAS,EAAE,MAAM;IAN5B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAK;IAE7B,OAAO,CAAC,MAAM,CAAuF;gBAG1F,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC,EACpD,SAAS,EAAE,MAAM;IAG5B,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM;IAM1B,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IA6CrF,MAAM,CAAC,QAAQ,EAAE,UAAU;IAc3B,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG;IAa/B,KAAK;IAQL,YAAY,EAAE,kBAAkB,GAAG,SAAS,CAAA;IAC5C,mBAAmB,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,SAAS,CAAA;YAEtC,UAAU;CA4BzB"}
package/lib/db-context.js CHANGED
@@ -15,6 +15,10 @@ export class StoreContext {
15
15
  });
16
16
  }
17
17
  sendRequest(request, timeoutSecs) {
18
+ if (request.upsert) {
19
+ // batch upsert if possible
20
+ return this.sendUpsert(request.upsert);
21
+ }
18
22
  const opId = StoreContext.opCounter++;
19
23
  const promise = this.newPromise(opId);
20
24
  const start = Date.now();
@@ -83,5 +87,38 @@ export class StoreContext {
83
87
  }
84
88
  this.defers.clear();
85
89
  }
90
+ queuedUpsert;
91
+ queuedUpsertPromise;
92
+ async sendUpsert(req, batchIdleMs = 1) {
93
+ if (this.queuedUpsert && this.queuedUpsertPromise) {
94
+ // merge the upserts
95
+ req.entity = this.queuedUpsert.entity.concat(req.entity);
96
+ req.entityData = this.queuedUpsert.entityData.concat(req.entityData);
97
+ req.id = this.queuedUpsert.id.concat(req.id);
98
+ req.data = this.queuedUpsert.data.concat(req.data);
99
+ return this.queuedUpsertPromise;
100
+ }
101
+ else {
102
+ this.queuedUpsert = req;
103
+ const opId = StoreContext.opCounter++;
104
+ const promise = this.newPromise(opId);
105
+ this.queuedUpsertPromise = promise;
106
+ await delay(batchIdleMs);
107
+ this.queuedUpsertPromise = undefined;
108
+ this.queuedUpsert = undefined;
109
+ console.log('sending upsert', opId, 'batch size', req.entity.length);
110
+ this.subject.next({
111
+ dbRequest: {
112
+ upsert: req,
113
+ opId
114
+ },
115
+ processId: this.processId
116
+ });
117
+ return promise;
118
+ }
119
+ }
120
+ }
121
+ function delay(ms) {
122
+ return new Promise((resolve) => setTimeout(resolve, ms));
86
123
  }
87
124
  //# sourceMappingURL=db-context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"db-context.js","sourceRoot":"","sources":["../src/db-context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"db-context.js","sourceRoot":"","sources":["../src/db-context.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentio/runtime",
3
- "version": "2.39.7-rc.18",
3
+ "version": "2.39.7-rc.19",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "exports": {
@@ -35,7 +35,7 @@
35
35
  "rxjs": "^7.8.1",
36
36
  "utility-types": "^3.11.0",
37
37
  "winston": "^3.11.0",
38
- "@sentio/protos": "2.39.7-rc.18"
38
+ "@sentio/protos": "2.39.7-rc.19"
39
39
  },
40
40
  "devDependencies": {
41
41
  "@types/command-line-args": "^5.2.3",
package/src/db-context.ts CHANGED
@@ -1,5 +1,12 @@
1
1
  import { Subject } from 'rxjs'
2
- import { DBRequest, DBResponse, DeepPartial, ProcessResult, ProcessStreamResponse } from '@sentio/protos'
2
+ import {
3
+ DBRequest,
4
+ DBRequest_DBUpsert,
5
+ DBResponse,
6
+ DeepPartial,
7
+ ProcessResult,
8
+ ProcessStreamResponse
9
+ } from '@sentio/protos'
3
10
 
4
11
  type Request = Omit<DBRequest, 'opId'>
5
12
  export const timeoutError = Symbol()
@@ -21,6 +28,11 @@ export class StoreContext {
21
28
  }
22
29
 
23
30
  sendRequest(request: DeepPartial<Request>, timeoutSecs?: number): Promise<DBResponse> {
31
+ if (request.upsert) {
32
+ // batch upsert if possible
33
+ return this.sendUpsert(request.upsert as DBRequest_DBUpsert)
34
+ }
35
+
24
36
  const opId = StoreContext.opCounter++
25
37
  const promise = this.newPromise(opId)
26
38
 
@@ -94,4 +106,40 @@ export class StoreContext {
94
106
  }
95
107
  this.defers.clear()
96
108
  }
109
+
110
+ queuedUpsert: DBRequest_DBUpsert | undefined
111
+ queuedUpsertPromise: Promise<DBResponse> | undefined
112
+
113
+ private async sendUpsert(req: DBRequest_DBUpsert, batchIdleMs = 1): Promise<DBResponse> {
114
+ if (this.queuedUpsert && this.queuedUpsertPromise) {
115
+ // merge the upserts
116
+ req.entity = this.queuedUpsert.entity.concat(req.entity)
117
+ req.entityData = this.queuedUpsert.entityData.concat(req.entityData)
118
+ req.id = this.queuedUpsert.id.concat(req.id)
119
+ req.data = this.queuedUpsert.data.concat(req.data)
120
+ return this.queuedUpsertPromise
121
+ } else {
122
+ this.queuedUpsert = req
123
+ const opId = StoreContext.opCounter++
124
+ const promise = this.newPromise<DBResponse>(opId)
125
+ this.queuedUpsertPromise = promise
126
+ await delay(batchIdleMs)
127
+ this.queuedUpsertPromise = undefined
128
+ this.queuedUpsert = undefined
129
+ console.log('sending upsert', opId, 'batch size', req.entity.length)
130
+ this.subject.next({
131
+ dbRequest: {
132
+ upsert: req,
133
+ opId
134
+ },
135
+ processId: this.processId
136
+ })
137
+
138
+ return promise
139
+ }
140
+ }
141
+ }
142
+
143
+ function delay(ms: number) {
144
+ return new Promise((resolve) => setTimeout(resolve, ms))
97
145
  }