@dbx-tools/postgres 0.9.95 → 0.9.105

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/README.md CHANGED
@@ -3,14 +3,25 @@
3
3
  Connection-correct PostgreSQL primitives for Node.js: advisory locks that hold the
4
4
  connection they lock, and a structured topic bus over `LISTEN`/`NOTIFY`.
5
5
 
6
- This package owns reusable PostgreSQL coordination behavior. Prefer its locks,
7
- topic bus, persistence, identity, and connection helpers over local SQL snippets
8
- or parallel message envelopes so Node and Python services remain compatible.
6
+ The package provides advisory locks, a typed topic bus, optional message
7
+ persistence, sender identity, and connection helpers for Node services.
9
8
 
10
9
  Both work against a plain `pg.Pool` or anything structurally compatible with one,
11
10
  including the pool AppKit's Lakebase plugin exports — so a Databricks App gets
12
11
  them without a second database client or connection pool.
13
12
 
13
+ ## Quick Start
14
+
15
+ Run protected work on the same PostgreSQL connection that holds the lock:
16
+
17
+ ```ts
18
+ import { withAdvisoryLock } from "@dbx-tools/postgres";
19
+
20
+ await withAdvisoryLock(pool, ["invoice", invoiceId], async (client) => {
21
+ await client.query("UPDATE invoices SET status = 'sent' WHERE id = $1", [invoiceId]);
22
+ });
23
+ ```
24
+
14
25
  ## Key Features
15
26
 
16
27
  - Converts an arbitrary structured key (string, array, object, `Date`, or an
@@ -59,7 +70,7 @@ service-principal and per-user OBO pools. Every login identity that can reach th
59
70
  pool must therefore be a member of the configured role, or otherwise have
60
71
  permission to `SET ROLE`, before the pool can connect successfully.
61
72
 
62
- ## Why Use This Over Native AppKit
73
+ ## Use With AppKit Lakebase
63
74
 
64
75
  Use AppKit `lakebase()` to obtain and refresh the PostgreSQL pool. This package
65
76
  does not replace that plugin. Add it when work needs connection-correct advisory
@@ -241,7 +252,7 @@ a listener can never be told about a row it cannot yet read.
241
252
 
242
253
  | Option | Default | Behavior |
243
254
  | ------------------ | ----------------- | -------------------------------------------------------------- |
244
- | `schema` | `dbx_message_bus` | Schema the package owns. |
255
+ | `schema` | `dbx_message_bus` | Schema used for message persistence. |
245
256
  | `scope` | `open` | Which tier's table publishes and history read by default. |
246
257
  | `tables` | `*_messages` | Override a tier's table name for a managed installation. |
247
258
  | `ttl` | `24 hours` | Per-message expiry. `false` keeps messages until deleted. |
@@ -314,18 +325,17 @@ shared `dbx_tools_topic_bus` channel.
314
325
  `identity.channelName(parts)` exposes the derivation without constructing a bus,
315
326
  which is useful for configuration checks and cross-runtime contract tests.
316
327
 
317
- ## Why A Separate Package?
328
+ ## Connection Lifecycles
318
329
 
319
330
  Advisory locks are connection-scoped, and that is easy to get wrong invisibly:
320
331
  taking the lock with `pool.query()` and doing the protected work with another
321
332
  `pool.query()` can use two different connections, so the lock protects nothing and
322
333
  the code looks correct. The same applies to `LISTEN`, which is session state a
323
- pooled query cannot hold. This package owns both lifecycles once, with no
324
- dependency beyond `pg`, so a consumer that only needs a lock does not pull in a
325
- message bus, an AppKit runtime, or a queue extension.
334
+ pooled query cannot hold. These helpers keep both lifecycles on dedicated
335
+ connections and depend only on `pg`.
326
336
 
327
- AppKit exposes Lakebase but has no lock helper and no message bus, so there is no
328
- native surface to prefer here.
337
+ AppKit supplies the Lakebase pool; these helpers add locks and cross-instance
338
+ message delivery on top of it.
329
339
 
330
340
  ## Module Map
331
341
 
package/index.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
5
  export const PACKAGE_IDENTIFIER = "@dbx-tools/postgres";
6
- export const PACKAGE_VERSION = "0.9.95";
6
+ export const PACKAGE_VERSION = "0.9.105";
7
7
  export * as advisoryLock from "./src/advisory-lock.ts";
8
8
  export * as bindings from "./src/bindings.ts";
9
9
  export * as identity from "./src/identity.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/postgres";
2
- export declare const PACKAGE_VERSION = "0.9.95";
2
+ export declare const PACKAGE_VERSION = "0.9.105";
3
3
  export * as advisoryLock from "./src/advisory-lock.ts";
4
4
  export * as bindings from "./src/bindings.ts";
5
5
  export * as identity from "./src/identity.ts";
package/lib/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
  export const PACKAGE_IDENTIFIER = "@dbx-tools/postgres";
5
- export const PACKAGE_VERSION = "0.9.95";
5
+ export const PACKAGE_VERSION = "0.9.105";
6
6
  export * as advisoryLock from "./src/advisory-lock.js";
7
7
  export * as bindings from "./src/bindings.js";
8
8
  export * as identity from "./src/identity.js";
@@ -12,4 +12,4 @@ export * as topicBus from "./src/topic-bus.js";
12
12
  export { POINTER_VERSION } from "./src/persistence.js";
13
13
  export { PostgresTopicBus } from "./src/topic-bus.js";
14
14
  export * from "./exports.js";
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxxQkFBcUIsQ0FBQztBQUN4RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxZQUFZLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxXQUFXLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssUUFBUSxNQUFNLG9CQUFvQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV0RCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvcG9zdGdyZXNcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS45NVwiO1xuZXhwb3J0ICogYXMgYWR2aXNvcnlMb2NrIGZyb20gXCIuL3NyYy9hZHZpc29yeS1sb2NrLnRzXCI7XG5leHBvcnQgKiBhcyBiaW5kaW5ncyBmcm9tIFwiLi9zcmMvYmluZGluZ3MudHNcIjtcbmV4cG9ydCAqIGFzIGlkZW50aXR5IGZyb20gXCIuL3NyYy9pZGVudGl0eS50c1wiO1xuZXhwb3J0ICogYXMgcGVyc2lzdGVuY2UgZnJvbSBcIi4vc3JjL3BlcnNpc3RlbmNlLnRzXCI7XG5leHBvcnQgKiBhcyBzZXNzaW9uIGZyb20gXCIuL3NyYy9zZXNzaW9uLnRzXCI7XG5leHBvcnQgKiBhcyB0b3BpY0J1cyBmcm9tIFwiLi9zcmMvdG9waWMtYnVzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEFkdmlzb3J5TG9ja0tleSwgUGdQb29sTGlrZSwgUGdRdWVyeWFibGUgfSBmcm9tIFwiLi9zcmMvYWR2aXNvcnktbG9jay50c1wiO1xuZXhwb3J0IHsgUE9JTlRFUl9WRVJTSU9OIH0gZnJvbSBcIi4vc3JjL3BlcnNpc3RlbmNlLnRzXCI7XG5leHBvcnQgdHlwZSB7IER1cmF0aW9uSW5wdXQsIFJlc29sdmVkVG9waWNCdXNQZXJzaXN0ZW5jZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvcGVyc2lzdGVuY2UudHNcIjtcbmV4cG9ydCB7IFBvc3RncmVzVG9waWNCdXMgfSBmcm9tIFwiLi9zcmMvdG9waWMtYnVzLnRzXCI7XG5leHBvcnQgdHlwZSB7IFRvcGljTWV0YWRhdGEsIFRvcGljTWVzc2FnZSwgVG9waWNQdWJsaXNoSW5wdXQsIFRvcGljTGlzdGVuZXIsIFRvcGljTWV0YWRhdGFQcm92aWRlciwgUG9zdGdyZXNUb3BpY0J1c09wdGlvbnMgfSBmcm9tIFwiLi9zcmMvdG9waWMtYnVzLnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9leHBvcnRzLnRzXCI7XG4iXX0=
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxxQkFBcUIsQ0FBQztBQUN4RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxZQUFZLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxXQUFXLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssUUFBUSxNQUFNLG9CQUFvQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV0RCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvcG9zdGdyZXNcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS4xMDVcIjtcbmV4cG9ydCAqIGFzIGFkdmlzb3J5TG9jayBmcm9tIFwiLi9zcmMvYWR2aXNvcnktbG9jay50c1wiO1xuZXhwb3J0ICogYXMgYmluZGluZ3MgZnJvbSBcIi4vc3JjL2JpbmRpbmdzLnRzXCI7XG5leHBvcnQgKiBhcyBpZGVudGl0eSBmcm9tIFwiLi9zcmMvaWRlbnRpdHkudHNcIjtcbmV4cG9ydCAqIGFzIHBlcnNpc3RlbmNlIGZyb20gXCIuL3NyYy9wZXJzaXN0ZW5jZS50c1wiO1xuZXhwb3J0ICogYXMgc2Vzc2lvbiBmcm9tIFwiLi9zcmMvc2Vzc2lvbi50c1wiO1xuZXhwb3J0ICogYXMgdG9waWNCdXMgZnJvbSBcIi4vc3JjL3RvcGljLWJ1cy50c1wiO1xuZXhwb3J0IHR5cGUgeyBBZHZpc29yeUxvY2tLZXksIFBnUG9vbExpa2UsIFBnUXVlcnlhYmxlIH0gZnJvbSBcIi4vc3JjL2Fkdmlzb3J5LWxvY2sudHNcIjtcbmV4cG9ydCB7IFBPSU5URVJfVkVSU0lPTiB9IGZyb20gXCIuL3NyYy9wZXJzaXN0ZW5jZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBEdXJhdGlvbklucHV0LCBSZXNvbHZlZFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3BlcnNpc3RlbmNlLnRzXCI7XG5leHBvcnQgeyBQb3N0Z3Jlc1RvcGljQnVzIH0gZnJvbSBcIi4vc3JjL3RvcGljLWJ1cy50c1wiO1xuZXhwb3J0IHR5cGUgeyBUb3BpY01ldGFkYXRhLCBUb3BpY01lc3NhZ2UsIFRvcGljUHVibGlzaElucHV0LCBUb3BpY0xpc3RlbmVyLCBUb3BpY01ldGFkYXRhUHJvdmlkZXIsIFBvc3RncmVzVG9waWNCdXNPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3RvcGljLWJ1cy50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXhwb3J0cy50c1wiO1xuIl19
package/package.json CHANGED
@@ -28,8 +28,8 @@
28
28
  "@databricks/appkit": "0.81.0"
29
29
  },
30
30
  "dependencies": {
31
- "@dbx-tools/lakebase": "^0.9.95",
32
- "@dbx-tools/shared-core": "^0.9.95",
31
+ "@dbx-tools/lakebase": "^0.9.105",
32
+ "@dbx-tools/shared-core": "^0.9.105",
33
33
  "pg": "^8.22.0"
34
34
  },
35
35
  "main": "./lib/index.js",
@@ -70,7 +70,7 @@
70
70
  "./package.json": "./package.json"
71
71
  }
72
72
  },
73
- "version": "0.9.95",
73
+ "version": "0.9.105",
74
74
  "types": "./lib/index.d.ts",
75
75
  "dbxToolsConfig": {
76
76
  "tags": [