pipework 0.118.0 → 0.119.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
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.119.0
|
|
4
|
+
|
|
5
|
+
- **Fixed: a test-harness savepoint could reset a tenant it did not set** (#605). On release, a `pipe.transaction` savepoint under the vitest harness put back every setting that differed from its start, including one sent on the shared test connection by another task while it was open. So a `withFlow({ tenant })` that ran while an earlier task held a savepoint lost `pipework.tenant_id` (read as `''`, refusing RLS writes) when that savepoint released. A release now puts back only the settings and role changed by statements sent from inside its own block. Test-only; requests and jobs were not affected.
|
|
6
|
+
|
|
3
7
|
## 0.118.0
|
|
4
8
|
|
|
5
9
|
- **Added: `awsCredentials()`, the default AWS credential provider** (#604). Environment keys (`AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_SESSION_TOKEN`), re-read on every call; else the ECS task role through the container credentials endpoint (`AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`, or `_FULL_URI` with `AWS_CONTAINER_AUTHORIZATION_TOKEN[_FILE]`); else EC2 instance metadata (IMDSv2; `AWS_EC2_METADATA_DISABLED=true` skips it). Endpoint credentials are cached until five minutes before `Expiration`, concurrent calls share one fetch, and a failed refresh keeps serving unexpired credentials. Every fetch has a timeout. Nothing found throws an error listing each source looked at; a configured container endpoint that fails is an error, not a fall-through. Profiles and SSO are not read.
|
|
@@ -8,9 +8,10 @@ import { type PostgresJsDatabase } from '../data/query/postgres-js/index.js';
|
|
|
8
8
|
* transaction.
|
|
9
9
|
*
|
|
10
10
|
* A savepoint inherits the outer transaction's isolation level, so the
|
|
11
|
-
* `config` argument is ignored. Settings changed
|
|
12
|
-
* `SET LOCAL`) and the role are put
|
|
13
|
-
*
|
|
11
|
+
* `config` argument is ignored. Settings changed by statements sent from inside
|
|
12
|
+
* the block (`set_config(..., true)`, `SET LOCAL`) and the role it set are put
|
|
13
|
+
* back to their values before the savepoint when it releases; statements sent
|
|
14
|
+
* on the connection from outside the block (another task) are not undone.
|
|
14
15
|
* Postgres cannot list custom settings (`pipework.*` is not in `pg_settings`),
|
|
15
16
|
* so the names are taken from the statements this connection sends.
|
|
16
17
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"savepoints.d.ts","sourceRoot":"","sources":["../../src/test/savepoints.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAA;AACpC,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,oCAAoC,CAAA;AAMnG
|
|
1
|
+
{"version":3,"file":"savepoints.d.ts","sourceRoot":"","sources":["../../src/test/savepoints.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAA;AACpC,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,oCAAoC,CAAA;AAMnG;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gCAAgC,CAAC,EAAE,EAAE,kBAAkB,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,GAAG,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CA8FlI"}
|
package/dist/test/savepoints.js
CHANGED
|
@@ -10,9 +10,10 @@ import { sql } from '../data/query/index.js';
|
|
|
10
10
|
* transaction.
|
|
11
11
|
*
|
|
12
12
|
* A savepoint inherits the outer transaction's isolation level, so the
|
|
13
|
-
* `config` argument is ignored. Settings changed
|
|
14
|
-
* `SET LOCAL`) and the role are put
|
|
15
|
-
*
|
|
13
|
+
* `config` argument is ignored. Settings changed by statements sent from inside
|
|
14
|
+
* the block (`set_config(..., true)`, `SET LOCAL`) and the role it set are put
|
|
15
|
+
* back to their values before the savepoint when it releases; statements sent
|
|
16
|
+
* on the connection from outside the block (another task) are not undone.
|
|
16
17
|
* Postgres cannot list custom settings (`pipework.*` is not in `pg_settings`),
|
|
17
18
|
* so the names are taken from the statements this connection sends.
|
|
18
19
|
*
|
|
@@ -24,8 +25,16 @@ export function collapseTransactionsToSavepoints(db, client) {
|
|
|
24
25
|
const known = new Set();
|
|
25
26
|
const unsafe = client.unsafe.bind(client);
|
|
26
27
|
client.unsafe = (query, params, ...rest) => {
|
|
27
|
-
|
|
28
|
+
const names = settingNames(query, params ?? []);
|
|
29
|
+
let owner = inBlock.getStore();
|
|
30
|
+
while (owner !== undefined && !owner.open)
|
|
31
|
+
owner = owner.parent;
|
|
32
|
+
for (const name of names) {
|
|
28
33
|
known.add(name);
|
|
34
|
+
owner?.touched.add(name);
|
|
35
|
+
}
|
|
36
|
+
if (owner !== undefined && ROLE_CHANGE.test(query))
|
|
37
|
+
owner.roleTouched = true;
|
|
29
38
|
return unsafe(query, params, ...rest);
|
|
30
39
|
};
|
|
31
40
|
// One connection runs one savepoint at a time among siblings, as drizzle's
|
|
@@ -47,7 +56,7 @@ export function collapseTransactionsToSavepoints(db, client) {
|
|
|
47
56
|
while (parent !== undefined && !parent.open)
|
|
48
57
|
parent = parent.parent;
|
|
49
58
|
const run = () => {
|
|
50
|
-
const block = { open: true, children: new Set(), parent, tail: Promise.resolve() };
|
|
59
|
+
const block = { open: true, children: new Set(), parent, tail: Promise.resolve(), touched: new Set(), roleTouched: false };
|
|
51
60
|
return throughErrorBoundary(client, () => inBlock.run(block, () => runSavepoint(fn, block, target)));
|
|
52
61
|
};
|
|
53
62
|
const queued = (parent?.tail ?? tail).then(run);
|
|
@@ -90,13 +99,14 @@ export function collapseTransactionsToSavepoints(db, client) {
|
|
|
90
99
|
}
|
|
91
100
|
await settleChildren(block);
|
|
92
101
|
await db.execute(sql.raw(`RELEASE SAVEPOINT ${name}`));
|
|
93
|
-
await restore(db, before,
|
|
102
|
+
await restore(db, before, block);
|
|
94
103
|
return result;
|
|
95
104
|
};
|
|
96
105
|
wrap(db);
|
|
97
106
|
// Another handle over the same connection joins this savepoint queue.
|
|
98
107
|
return wrap;
|
|
99
108
|
}
|
|
109
|
+
const ROLE_CHANGE = /^\s*(?:set\s+(?:local\s+|session\s+)?role\b|reset\s+role\b)/i;
|
|
100
110
|
const SETTING_NAME = /^[A-Za-z_][\w.]*$/;
|
|
101
111
|
/** Names of the settings a statement changes: `set_config(name, ...)` and `SET [LOCAL] name =`. */
|
|
102
112
|
function settingNames(query, params) {
|
|
@@ -122,15 +132,15 @@ async function snapshot(db, names) {
|
|
|
122
132
|
const [who] = await db.execute(sql `SELECT current_user AS role`);
|
|
123
133
|
return { settings, role: String(who?.['role']) };
|
|
124
134
|
}
|
|
125
|
-
async function restore(db, before,
|
|
126
|
-
const after = await snapshot(db,
|
|
135
|
+
async function restore(db, before, block) {
|
|
136
|
+
const after = await snapshot(db, block.touched);
|
|
127
137
|
for (const [name, value] of after.settings) {
|
|
128
138
|
// A setting first seen inside the savepoint was unset before it.
|
|
129
139
|
const was = before.settings.get(name) ?? '';
|
|
130
140
|
if ((value ?? '') !== was)
|
|
131
141
|
await db.execute(sql `SELECT set_config(${name}, ${was}, true)`);
|
|
132
142
|
}
|
|
133
|
-
if (after.role !== before.role) {
|
|
143
|
+
if (block.roleTouched && after.role !== before.role) {
|
|
134
144
|
await db.execute(sql.raw(`SET LOCAL ROLE "${before.role.replaceAll('"', '""')}"`));
|
|
135
145
|
}
|
|
136
146
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"savepoints.js","sourceRoot":"","sources":["../../src/test/savepoints.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEpD,OAAO,EAAE,qBAAqB,EAA2B,MAAM,oCAAoC,CAAA;AACnG,OAAO,EAAE,oBAAoB,EAAE,MAAM,oDAAoD,CAAA;AACzF,OAAO,EAAE,GAAG,EAAE,MAAM,wBAAwB,CAAA;AAI5C
|
|
1
|
+
{"version":3,"file":"savepoints.js","sourceRoot":"","sources":["../../src/test/savepoints.ts"],"names":[],"mappings":"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"}
|