@prairielearn/named-locks 1.3.3 → 1.4.0
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/CHANGELOG.md +12 -0
- package/README.md +2 -2
- package/dist/index.d.ts +2 -3
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
- package/src/index.ts +8 -13
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @prairielearn/named-locks
|
|
2
2
|
|
|
3
|
+
## 1.4.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 297bbce5a: Allow `tryLockAsync` and `tryWithLock` to accept a timeout
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- 2b003b4d9: Upgrade all dependencies
|
|
12
|
+
- Updated dependencies [2b003b4d9]
|
|
13
|
+
- @prairielearn/postgres@1.7.2
|
|
14
|
+
|
|
3
15
|
## 1.3.3
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
package/README.md
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -27,7 +27,6 @@ interface LockOptions {
|
|
|
27
27
|
*/
|
|
28
28
|
autoRenew?: boolean;
|
|
29
29
|
}
|
|
30
|
-
type TryLockOptions = Omit<LockOptions, 'timeout'>;
|
|
31
30
|
export declare const pool: PostgresPool;
|
|
32
31
|
/**
|
|
33
32
|
* Initializes a new {@link PostgresPool} that will be used to acquire named locks.
|
|
@@ -45,7 +44,7 @@ export declare function close(): Promise<void>;
|
|
|
45
44
|
*
|
|
46
45
|
* @param name The name of the lock to acquire.
|
|
47
46
|
*/
|
|
48
|
-
export declare function tryLockAsync(name: string, options?:
|
|
47
|
+
export declare function tryLockAsync(name: string, options?: LockOptions): Promise<Lock | null>;
|
|
49
48
|
export declare const tryLock: (arg1: string, callback: (err: NodeJS.ErrnoException, result: Lock | null) => void) => void;
|
|
50
49
|
/**
|
|
51
50
|
* Wait until a lock can be successfully acquired.
|
|
@@ -72,5 +71,5 @@ export declare function doWithLock<T>(name: string, options: LockOptions, func:
|
|
|
72
71
|
* and releases the lock once the function has executed. If the lock cannot be acquired,
|
|
73
72
|
* the function is not executed and null is returned.
|
|
74
73
|
*/
|
|
75
|
-
export declare function tryWithLock<T>(name: string, options:
|
|
74
|
+
export declare function tryWithLock<T>(name: string, options: LockOptions, func: () => Promise<T>): Promise<T | null>;
|
|
76
75
|
export {};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AACxB,qDAAkE;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prairielearn/named-locks",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"main": "./dist/index.js",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -13,10 +13,10 @@
|
|
|
13
13
|
},
|
|
14
14
|
"devDependencies": {
|
|
15
15
|
"@prairielearn/tsconfig": "^0.0.0",
|
|
16
|
-
"@types/node": "^18.16.
|
|
17
|
-
"typescript": "^5.1.
|
|
16
|
+
"@types/node": "^18.16.19",
|
|
17
|
+
"typescript": "^5.1.6"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@prairielearn/postgres": "^1.7.
|
|
20
|
+
"@prairielearn/postgres": "^1.7.2"
|
|
21
21
|
}
|
|
22
22
|
}
|
package/src/index.ts
CHANGED
|
@@ -30,8 +30,6 @@ interface LockOptions {
|
|
|
30
30
|
autoRenew?: boolean;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
type TryLockOptions = Omit<LockOptions, 'timeout'>;
|
|
34
|
-
|
|
35
33
|
/*
|
|
36
34
|
* The functions here all identify locks by "name", which is a plain
|
|
37
35
|
* string. The locks use the named_locks DB table. Each lock name
|
|
@@ -84,13 +82,13 @@ let renewIntervalMs = 60_000;
|
|
|
84
82
|
export async function init(
|
|
85
83
|
pgConfig: PoolConfig,
|
|
86
84
|
idleErrorHandler: (error: Error, client: PoolClient) => void,
|
|
87
|
-
namedLocksConfig: NamedLocksConfig = {}
|
|
85
|
+
namedLocksConfig: NamedLocksConfig = {},
|
|
88
86
|
) {
|
|
89
87
|
renewIntervalMs = namedLocksConfig.renewIntervalMs ?? renewIntervalMs;
|
|
90
88
|
await pool.initAsync(pgConfig, idleErrorHandler);
|
|
91
89
|
await pool.queryAsync(
|
|
92
90
|
'CREATE TABLE IF NOT EXISTS named_locks (id bigserial PRIMARY KEY, name text NOT NULL UNIQUE);',
|
|
93
|
-
{}
|
|
91
|
+
{},
|
|
94
92
|
);
|
|
95
93
|
}
|
|
96
94
|
|
|
@@ -109,10 +107,7 @@ export async function close() {
|
|
|
109
107
|
*
|
|
110
108
|
* @param name The name of the lock to acquire.
|
|
111
109
|
*/
|
|
112
|
-
export async function tryLockAsync(
|
|
113
|
-
name: string,
|
|
114
|
-
options: TryLockOptions = {}
|
|
115
|
-
): Promise<Lock | null> {
|
|
110
|
+
export async function tryLockAsync(name: string, options: LockOptions = {}): Promise<Lock | null> {
|
|
116
111
|
return getLock(name, { timeout: 0, ...options });
|
|
117
112
|
}
|
|
118
113
|
|
|
@@ -152,7 +147,7 @@ export const releaseLock = util.callbackify(releaseLockAsync);
|
|
|
152
147
|
export async function doWithLock<T>(
|
|
153
148
|
name: string,
|
|
154
149
|
options: LockOptions,
|
|
155
|
-
func: () => Promise<T
|
|
150
|
+
func: () => Promise<T>,
|
|
156
151
|
): Promise<T> {
|
|
157
152
|
const lock = await waitLockAsync(name, options);
|
|
158
153
|
try {
|
|
@@ -169,8 +164,8 @@ export async function doWithLock<T>(
|
|
|
169
164
|
*/
|
|
170
165
|
export async function tryWithLock<T>(
|
|
171
166
|
name: string,
|
|
172
|
-
options:
|
|
173
|
-
func: () => Promise<T
|
|
167
|
+
options: LockOptions,
|
|
168
|
+
func: () => Promise<T>,
|
|
174
169
|
): Promise<T | null> {
|
|
175
170
|
const lock = await tryLockAsync(name, options);
|
|
176
171
|
if (lock == null) return null;
|
|
@@ -192,7 +187,7 @@ export async function tryWithLock<T>(
|
|
|
192
187
|
async function getLock(name: string, options: LockOptions) {
|
|
193
188
|
await pool.queryAsync(
|
|
194
189
|
'INSERT INTO named_locks (name) VALUES ($name) ON CONFLICT (name) DO NOTHING;',
|
|
195
|
-
{ name }
|
|
190
|
+
{ name },
|
|
196
191
|
);
|
|
197
192
|
|
|
198
193
|
const client = await pool.beginTransactionAsync();
|
|
@@ -206,7 +201,7 @@ async function getLock(name: string, options: LockOptions) {
|
|
|
206
201
|
await pool.queryWithClientAsync(
|
|
207
202
|
client,
|
|
208
203
|
`SET LOCAL lock_timeout = ${client.escapeLiteral(options.timeout.toString())}`,
|
|
209
|
-
{}
|
|
204
|
+
{},
|
|
210
205
|
);
|
|
211
206
|
}
|
|
212
207
|
|