@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/index.js +38 -0
- package/dist/index.js.map +3 -3
- package/dist/index.js.meta.json +1 -1
- package/dist/package.json +4 -4
- package/dist/src/context/types.d.ts +2 -0
- package/dist/src/timers/timers.d.ts +12 -0
- package/dist/src/timers/timers.js +38 -1
- package/dist/src/timers/timers.js.map +1 -1
- package/package.json +4 -4
- package/src/context/types.ts +2 -0
- package/src/timers/timers.ts +38 -0
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@budibase/backend-core",
|
|
3
|
-
"version": "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.
|
|
27
|
-
"@budibase/types": "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": "
|
|
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.
|
|
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.
|
|
27
|
-
"@budibase/types": "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": "
|
|
99
|
+
"gitHead": "c72844aa4b9349faaaab28df3740fad952dfff82"
|
|
100
100
|
}
|
package/src/context/types.ts
CHANGED
|
@@ -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
|
}
|
package/src/timers/timers.ts
CHANGED
|
@@ -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
|
+
}
|