@budibase/backend-core 2.18.2 → 2.19.1

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/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@budibase/backend-core",
3
- "version": "2.18.2",
3
+ "version": "2.19.1",
4
4
  "description": "Budibase backend core libraries used in server and worker",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/src/index.d.ts",
@@ -23,8 +23,8 @@
23
23
  "dependencies": {
24
24
  "@budibase/nano": "10.1.5",
25
25
  "@budibase/pouchdb-replication-stream": "1.2.10",
26
- "@budibase/shared-core": "2.18.2",
27
- "@budibase/types": "2.18.2",
26
+ "@budibase/shared-core": "2.19.1",
27
+ "@budibase/types": "2.19.1",
28
28
  "@govtechsg/passport-openidconnect": "^1.0.2",
29
29
  "aws-cloudfront-sign": "3.0.2",
30
30
  "aws-sdk": "2.1030.0",
@@ -96,5 +96,5 @@
96
96
  }
97
97
  }
98
98
  },
99
- "gitHead": "f1ef059bfb3d19dead719f2289b8fff429fda2a9"
99
+ "gitHead": "c72844aa4b9349faaaab28df3740fad952dfff82"
100
100
  }
@@ -1,4 +1,5 @@
1
1
  import { IdentityContext, VM } from "@budibase/types";
2
+ import { ExecutionTimeTracker } from "../timers";
2
3
  export type ContextMap = {
3
4
  tenantId?: string;
4
5
  appId?: string;
@@ -7,5 +8,6 @@ export type ContextMap = {
7
8
  isScim?: boolean;
8
9
  automationId?: string;
9
10
  isMigrating?: boolean;
11
+ jsExecutionTracker?: ExecutionTimeTracker;
10
12
  vm?: VM;
11
13
  };
@@ -2,3 +2,15 @@
2
2
  export declare function set(callback: () => any, period: number): NodeJS.Timeout;
3
3
  export declare function clear(interval: NodeJS.Timeout): void;
4
4
  export declare function cleanup(): void;
5
+ export declare class ExecutionTimeoutError extends Error {
6
+ readonly name = "ExecutionTimeoutError";
7
+ }
8
+ export declare class ExecutionTimeTracker {
9
+ readonly limitMs: number;
10
+ static withLimit(limitMs: number): ExecutionTimeTracker;
11
+ constructor(limitMs: number);
12
+ private totalTimeMs;
13
+ track<T>(f: () => T): T;
14
+ get elapsedMS(): number;
15
+ checkLimit(): void;
16
+ }
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.cleanup = exports.clear = exports.set = void 0;
3
+ exports.ExecutionTimeTracker = exports.ExecutionTimeoutError = exports.cleanup = exports.clear = exports.set = void 0;
4
4
  let intervals = [];
5
5
  function set(callback, period) {
6
6
  const interval = setInterval(callback, period);
@@ -23,4 +23,41 @@ function cleanup() {
23
23
  intervals = [];
24
24
  }
25
25
  exports.cleanup = cleanup;
26
+ class ExecutionTimeoutError extends Error {
27
+ constructor() {
28
+ super(...arguments);
29
+ this.name = "ExecutionTimeoutError";
30
+ }
31
+ }
32
+ exports.ExecutionTimeoutError = ExecutionTimeoutError;
33
+ class ExecutionTimeTracker {
34
+ static withLimit(limitMs) {
35
+ return new ExecutionTimeTracker(limitMs);
36
+ }
37
+ constructor(limitMs) {
38
+ this.limitMs = limitMs;
39
+ this.totalTimeMs = 0;
40
+ }
41
+ track(f) {
42
+ this.checkLimit();
43
+ const start = process.hrtime.bigint();
44
+ try {
45
+ return f();
46
+ }
47
+ finally {
48
+ const end = process.hrtime.bigint();
49
+ this.totalTimeMs += Number(end - start) / 1e6;
50
+ this.checkLimit();
51
+ }
52
+ }
53
+ get elapsedMS() {
54
+ return this.totalTimeMs;
55
+ }
56
+ checkLimit() {
57
+ if (this.totalTimeMs > this.limitMs) {
58
+ throw new ExecutionTimeoutError(`Execution time limit of ${this.limitMs}ms exceeded: ${this.totalTimeMs}ms`);
59
+ }
60
+ }
61
+ }
62
+ exports.ExecutionTimeTracker = ExecutionTimeTracker;
26
63
  //# sourceMappingURL=timers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"timers.js","sourceRoot":"","sources":["../../../src/timers/timers.ts"],"names":[],"mappings":";;;AAAA,IAAI,SAAS,GAAqB,EAAE,CAAA;AAEpC,SAAgB,GAAG,CAAC,QAAmB,EAAE,MAAc;IACrD,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IAC9C,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACxB,OAAO,QAAQ,CAAA;AACjB,CAAC;AAJD,kBAIC;AAED,SAAgB,KAAK,CAAC,QAAwB;IAC5C,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IACvC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE;QACd,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;KACzB;IACD,aAAa,CAAC,QAAQ,CAAC,CAAA;AACzB,CAAC;AAND,sBAMC;AAED,SAAgB,OAAO;IACrB,KAAK,IAAI,QAAQ,IAAI,SAAS,EAAE;QAC9B,aAAa,CAAC,QAAQ,CAAC,CAAA;KACxB;IACD,SAAS,GAAG,EAAE,CAAA;AAChB,CAAC;AALD,0BAKC"}
1
+ {"version":3,"file":"timers.js","sourceRoot":"","sources":["../../../src/timers/timers.ts"],"names":[],"mappings":";;;AAAA,IAAI,SAAS,GAAqB,EAAE,CAAA;AAEpC,SAAgB,GAAG,CAAC,QAAmB,EAAE,MAAc;IACrD,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IAC9C,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACxB,OAAO,QAAQ,CAAA;AACjB,CAAC;AAJD,kBAIC;AAED,SAAgB,KAAK,CAAC,QAAwB;IAC5C,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IACvC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE;QACd,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;KACzB;IACD,aAAa,CAAC,QAAQ,CAAC,CAAA;AACzB,CAAC;AAND,sBAMC;AAED,SAAgB,OAAO;IACrB,KAAK,IAAI,QAAQ,IAAI,SAAS,EAAE;QAC9B,aAAa,CAAC,QAAQ,CAAC,CAAA;KACxB;IACD,SAAS,GAAG,EAAE,CAAA;AAChB,CAAC;AALD,0BAKC;AAED,MAAa,qBAAsB,SAAQ,KAAK;IAAhD;;QACkB,SAAI,GAAG,uBAAuB,CAAA;IAChD,CAAC;CAAA;AAFD,sDAEC;AAED,MAAa,oBAAoB;IAC/B,MAAM,CAAC,SAAS,CAAC,OAAe;QAC9B,OAAO,IAAI,oBAAoB,CAAC,OAAO,CAAC,CAAA;IAC1C,CAAC;IAED,YAAqB,OAAe;QAAf,YAAO,GAAP,OAAO,CAAQ;QAE5B,gBAAW,GAAG,CAAC,CAAA;IAFgB,CAAC;IAIxC,KAAK,CAAI,CAAU;QACjB,IAAI,CAAC,UAAU,EAAE,CAAA;QACjB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAA;QACrC,IAAI;YACF,OAAO,CAAC,EAAE,CAAA;SACX;gBAAS;YACR,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAA;YACnC,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,GAAG,CAAA;YAC7C,IAAI,CAAC,UAAU,EAAE,CAAA;SAClB;IACH,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,WAAW,CAAA;IACzB,CAAC;IAED,UAAU;QACR,IAAI,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE;YACnC,MAAM,IAAI,qBAAqB,CAC7B,2BAA2B,IAAI,CAAC,OAAO,gBAAgB,IAAI,CAAC,WAAW,IAAI,CAC5E,CAAA;SACF;IACH,CAAC;CACF;AAhCD,oDAgCC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@budibase/backend-core",
3
- "version": "2.18.2",
3
+ "version": "2.19.1",
4
4
  "description": "Budibase backend core libraries used in server and worker",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/src/index.d.ts",
@@ -23,8 +23,8 @@
23
23
  "dependencies": {
24
24
  "@budibase/nano": "10.1.5",
25
25
  "@budibase/pouchdb-replication-stream": "1.2.10",
26
- "@budibase/shared-core": "2.18.2",
27
- "@budibase/types": "2.18.2",
26
+ "@budibase/shared-core": "2.19.1",
27
+ "@budibase/types": "2.19.1",
28
28
  "@govtechsg/passport-openidconnect": "^1.0.2",
29
29
  "aws-cloudfront-sign": "3.0.2",
30
30
  "aws-sdk": "2.1030.0",
@@ -96,5 +96,5 @@
96
96
  }
97
97
  }
98
98
  },
99
- "gitHead": "f1ef059bfb3d19dead719f2289b8fff429fda2a9"
99
+ "gitHead": "c72844aa4b9349faaaab28df3740fad952dfff82"
100
100
  }
@@ -1,4 +1,5 @@
1
1
  import { IdentityContext, VM } from "@budibase/types"
2
+ import { ExecutionTimeTracker } from "../timers"
2
3
 
3
4
  // keep this out of Budibase types, don't want to expose context info
4
5
  export type ContextMap = {
@@ -9,5 +10,6 @@ export type ContextMap = {
9
10
  isScim?: boolean
10
11
  automationId?: string
11
12
  isMigrating?: boolean
13
+ jsExecutionTracker?: ExecutionTimeTracker
12
14
  vm?: VM
13
15
  }
@@ -20,3 +20,41 @@ export function cleanup() {
20
20
  }
21
21
  intervals = []
22
22
  }
23
+
24
+ export class ExecutionTimeoutError extends Error {
25
+ public readonly name = "ExecutionTimeoutError"
26
+ }
27
+
28
+ export class ExecutionTimeTracker {
29
+ static withLimit(limitMs: number) {
30
+ return new ExecutionTimeTracker(limitMs)
31
+ }
32
+
33
+ constructor(readonly limitMs: number) {}
34
+
35
+ private totalTimeMs = 0
36
+
37
+ track<T>(f: () => T): T {
38
+ this.checkLimit()
39
+ const start = process.hrtime.bigint()
40
+ try {
41
+ return f()
42
+ } finally {
43
+ const end = process.hrtime.bigint()
44
+ this.totalTimeMs += Number(end - start) / 1e6
45
+ this.checkLimit()
46
+ }
47
+ }
48
+
49
+ get elapsedMS() {
50
+ return this.totalTimeMs
51
+ }
52
+
53
+ checkLimit() {
54
+ if (this.totalTimeMs > this.limitMs) {
55
+ throw new ExecutionTimeoutError(
56
+ `Execution time limit of ${this.limitMs}ms exceeded: ${this.totalTimeMs}ms`
57
+ )
58
+ }
59
+ }
60
+ }