@budibase/backend-core 2.6.19-alpha.31 → 2.6.19-alpha.35
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 +3 -3
- package/dist/src/redis/redlockImpl.d.ts +3 -1
- package/dist/src/redis/redlockImpl.js +79 -63
- package/dist/src/redis/redlockImpl.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/src/cache/tests/writethrough.spec.ts +1 -5
- package/src/redis/redlockImpl.ts +24 -15
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@budibase/backend-core",
|
|
3
|
-
"version": "2.6.19-alpha.
|
|
3
|
+
"version": "2.6.19-alpha.35",
|
|
4
4
|
"description": "Budibase backend core libraries used in server and worker",
|
|
5
5
|
"main": "dist/src/index.js",
|
|
6
6
|
"types": "dist/src/index.d.ts",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"dependencies": {
|
|
23
23
|
"@budibase/nano": "10.1.2",
|
|
24
24
|
"@budibase/pouchdb-replication-stream": "1.2.10",
|
|
25
|
-
"@budibase/types": "2.6.19-alpha.
|
|
25
|
+
"@budibase/types": "2.6.19-alpha.35",
|
|
26
26
|
"@shopify/jest-koa-mocks": "5.0.1",
|
|
27
27
|
"@techpass/passport-openidconnect": "0.3.2",
|
|
28
28
|
"aws-cloudfront-sign": "2.2.0",
|
|
@@ -102,5 +102,5 @@
|
|
|
102
102
|
}
|
|
103
103
|
}
|
|
104
104
|
},
|
|
105
|
-
"gitHead": "
|
|
105
|
+
"gitHead": "2e6bc8435cb14649a8cc000a76d661fc121f21d1"
|
|
106
106
|
}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import Redlock from "redlock";
|
|
1
2
|
import { LockOptions } from "@budibase/types";
|
|
3
|
+
export declare function newRedlock(opts?: Redlock.Options): Promise<Redlock>;
|
|
2
4
|
declare type SuccessfulRedlockExecution<T> = {
|
|
3
5
|
executed: true;
|
|
4
6
|
result: T;
|
|
@@ -7,5 +9,5 @@ declare type UnsuccessfulRedlockExecution = {
|
|
|
7
9
|
executed: false;
|
|
8
10
|
};
|
|
9
11
|
declare type RedlockExecution<T> = SuccessfulRedlockExecution<T> | UnsuccessfulRedlockExecution;
|
|
10
|
-
export declare
|
|
12
|
+
export declare function doWithLock<T>(opts: LockOptions, task: () => Promise<T>): Promise<RedlockExecution<T>>;
|
|
11
13
|
export {};
|
|
@@ -35,39 +35,47 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
35
35
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
36
36
|
};
|
|
37
37
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
-
exports.doWithLock = void 0;
|
|
38
|
+
exports.doWithLock = exports.newRedlock = void 0;
|
|
39
39
|
const redlock_1 = __importDefault(require("redlock"));
|
|
40
40
|
const init_1 = require("./init");
|
|
41
41
|
const types_1 = require("@budibase/types");
|
|
42
42
|
const context = __importStar(require("../context"));
|
|
43
43
|
const environment_1 = __importDefault(require("../environment"));
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
if (environment_1.default.isTest() && type !== types_1.LockType.TRY_ONCE) {
|
|
49
|
-
return newRedlock(OPTIONS.TEST);
|
|
50
|
-
}
|
|
51
|
-
switch (type) {
|
|
52
|
-
case types_1.LockType.TRY_ONCE: {
|
|
53
|
-
return newRedlock(OPTIONS.TRY_ONCE);
|
|
54
|
-
}
|
|
55
|
-
case types_1.LockType.DEFAULT: {
|
|
56
|
-
return newRedlock(OPTIONS.DEFAULT);
|
|
44
|
+
function getClient(type, opts) {
|
|
45
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
46
|
+
if (type === types_1.LockType.CUSTOM) {
|
|
47
|
+
return newRedlock(opts);
|
|
57
48
|
}
|
|
58
|
-
|
|
59
|
-
return newRedlock(OPTIONS.
|
|
49
|
+
if (environment_1.default.isTest() && type !== types_1.LockType.TRY_ONCE) {
|
|
50
|
+
return newRedlock(OPTIONS.TEST);
|
|
60
51
|
}
|
|
61
|
-
|
|
62
|
-
|
|
52
|
+
switch (type) {
|
|
53
|
+
case types_1.LockType.TRY_ONCE: {
|
|
54
|
+
return newRedlock(OPTIONS.TRY_ONCE);
|
|
55
|
+
}
|
|
56
|
+
case types_1.LockType.TRY_TWICE: {
|
|
57
|
+
return newRedlock(OPTIONS.TRY_TWICE);
|
|
58
|
+
}
|
|
59
|
+
case types_1.LockType.DEFAULT: {
|
|
60
|
+
return newRedlock(OPTIONS.DEFAULT);
|
|
61
|
+
}
|
|
62
|
+
case types_1.LockType.DELAY_500: {
|
|
63
|
+
return newRedlock(OPTIONS.DELAY_500);
|
|
64
|
+
}
|
|
65
|
+
default: {
|
|
66
|
+
throw new Error(`Could not get redlock client: ${type}`);
|
|
67
|
+
}
|
|
63
68
|
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
66
71
|
const OPTIONS = {
|
|
67
72
|
TRY_ONCE: {
|
|
68
73
|
// immediately throws an error if the lock is already held
|
|
69
74
|
retryCount: 0,
|
|
70
75
|
},
|
|
76
|
+
TRY_TWICE: {
|
|
77
|
+
retryCount: 1,
|
|
78
|
+
},
|
|
71
79
|
TEST: {
|
|
72
80
|
// higher retry count in unit tests
|
|
73
81
|
// due to high contention.
|
|
@@ -91,56 +99,64 @@ const OPTIONS = {
|
|
|
91
99
|
retryDelay: 500,
|
|
92
100
|
},
|
|
93
101
|
};
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
}
|
|
112
|
-
// create the lock
|
|
113
|
-
lock = yield redlock.lock(name, opts.ttl);
|
|
114
|
-
// perform locked task
|
|
115
|
-
// need to await to ensure completion before unlocking
|
|
116
|
-
const result = yield task();
|
|
117
|
-
return { executed: true, result };
|
|
102
|
+
function newRedlock(opts = {}) {
|
|
103
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
104
|
+
let options = Object.assign(Object.assign({}, OPTIONS.DEFAULT), opts);
|
|
105
|
+
const redisWrapper = yield (0, init_1.getLockClient)();
|
|
106
|
+
const client = redisWrapper.getClient();
|
|
107
|
+
return new redlock_1.default([client], options);
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
exports.newRedlock = newRedlock;
|
|
111
|
+
function getLockName(opts) {
|
|
112
|
+
// determine lock name
|
|
113
|
+
// by default use the tenantId for uniqueness, unless using a system lock
|
|
114
|
+
const prefix = opts.systemLock ? "system" : context.getTenantId();
|
|
115
|
+
let name = `lock:${prefix}_${opts.name}`;
|
|
116
|
+
// add additional unique name if required
|
|
117
|
+
if (opts.resource) {
|
|
118
|
+
name = name + `_${opts.resource}`;
|
|
118
119
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
120
|
+
return name;
|
|
121
|
+
}
|
|
122
|
+
function doWithLock(opts, task) {
|
|
123
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
124
|
+
const redlock = yield getClient(opts.type, opts.customOptions);
|
|
125
|
+
let lock;
|
|
126
|
+
try {
|
|
127
|
+
const name = getLockName(opts);
|
|
128
|
+
// create the lock
|
|
129
|
+
lock = yield redlock.lock(name, opts.ttl);
|
|
130
|
+
// perform locked task
|
|
131
|
+
// need to await to ensure completion before unlocking
|
|
132
|
+
const result = yield task();
|
|
133
|
+
return { executed: true, result };
|
|
134
|
+
}
|
|
135
|
+
catch (e) {
|
|
136
|
+
console.warn("lock error");
|
|
137
|
+
// lock limit exceeded
|
|
138
|
+
if (e.name === "LockError") {
|
|
139
|
+
if (opts.type === types_1.LockType.TRY_ONCE) {
|
|
140
|
+
// don't throw for try-once locks, they will always error
|
|
141
|
+
// due to retry count (0) exceeded
|
|
142
|
+
return { executed: false };
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
console.error(e);
|
|
146
|
+
throw e;
|
|
147
|
+
}
|
|
128
148
|
}
|
|
129
149
|
else {
|
|
130
150
|
console.error(e);
|
|
131
151
|
throw e;
|
|
132
152
|
}
|
|
133
153
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
}
|
|
139
|
-
finally {
|
|
140
|
-
if (lock) {
|
|
141
|
-
yield lock.unlock();
|
|
154
|
+
finally {
|
|
155
|
+
if (lock) {
|
|
156
|
+
yield lock.unlock();
|
|
157
|
+
}
|
|
142
158
|
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
159
|
+
});
|
|
160
|
+
}
|
|
145
161
|
exports.doWithLock = doWithLock;
|
|
146
162
|
//# sourceMappingURL=redlockImpl.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redlockImpl.js","sourceRoot":"","sources":["../../../src/redis/redlockImpl.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sDAA6B;AAC7B,iCAAsC;AACtC,2CAAuD;AACvD,oDAAqC;AACrC,iEAAgC;AAEhC,
|
|
1
|
+
{"version":3,"file":"redlockImpl.js","sourceRoot":"","sources":["../../../src/redis/redlockImpl.ts"],"names":[],"mappings":"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"}
|