@zintrust/db-postgres 0.9.1 → 0.9.3

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.
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@zintrust/db-postgres",
3
- "version": "0.9.1",
4
- "buildDate": "2026-04-21T12:31:14.649Z",
3
+ "version": "0.9.3",
4
+ "buildDate": "2026-04-22T15:45:45.967Z",
5
5
  "buildEnvironment": {
6
- "node": "v22.22.1",
7
- "platform": "darwin",
8
- "arch": "arm64"
6
+ "node": "v20.20.2",
7
+ "platform": "linux",
8
+ "arch": "x64"
9
9
  },
10
10
  "git": {
11
- "commit": "a017e573",
12
- "branch": "dev"
11
+ "commit": "552dfdf4",
12
+ "branch": "master"
13
13
  },
14
14
  "package": {
15
15
  "engines": {
@@ -23,25 +23,13 @@
23
23
  ]
24
24
  },
25
25
  "files": {
26
- "PostgresWorkersDurableObjectAdapter.d.ts": {
27
- "size": 225,
28
- "sha256": "7658ded3e8a7fb3c96e0171a538b76dd75985c4f0b736d5bd56261d88d540f44"
29
- },
30
- "PostgresWorkersDurableObjectAdapter.js": {
31
- "size": 7325,
32
- "sha256": "2c7fd4cc70356947b6d2206ffd154485c726d56bb3f9b46a5b6091417552ea55"
33
- },
34
- "build-manifest.json": {
35
- "size": 1420,
36
- "sha256": "5d43aaab89d6d77ec6275ef09fbef47a4103e8a2e37eb44ebe7861512d939a67"
37
- },
38
26
  "index.d.ts": {
39
27
  "size": 1347,
40
28
  "sha256": "6090d1757bf63ac7ac510a59ccfd9137e5b0b9e32b2cbebd0d5bbbe3834a7233"
41
29
  },
42
30
  "index.js": {
43
31
  "size": 7208,
44
- "sha256": "9bebd1b813c666df6cf47d1a32e385d4118ec31e50b5bbfd67569b7a525803b4"
32
+ "sha256": "9c6c963e3101e6618144a55ac52d8571f18d0ded3272870eee9e6d8b0874d5fd"
45
33
  },
46
34
  "register.d.ts": {
47
35
  "size": 183,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zintrust/db-postgres",
3
- "version": "0.9.1",
3
+ "version": "0.9.3",
4
4
  "description": "PostgreSQL database adapter for ZinTrust.",
5
5
  "private": false,
6
6
  "type": "module",
@@ -23,7 +23,7 @@
23
23
  "node": ">=20.0.0"
24
24
  },
25
25
  "peerDependencies": {
26
- "@zintrust/core": "*"
26
+ "@zintrust/core": "^0.9.2"
27
27
  },
28
28
  "publishConfig": {
29
29
  "access": "public"
@@ -1,5 +0,0 @@
1
- import type { IDatabaseAdapter } from './index.js';
2
- export declare const PostgresWorkersDurableObjectAdapter: Readonly<{
3
- create(_config: unknown): IDatabaseAdapter;
4
- }>;
5
- export default PostgresWorkersDurableObjectAdapter;
@@ -1,191 +0,0 @@
1
- import { ErrorFactory, Logger } from '@zintrust/core';
2
- const POSTGRES_TYPE = 'postgresql';
3
- const CREATE_MIGRATIONS_TABLE_SQL = `CREATE TABLE IF NOT EXISTS migrations (
4
- id SERIAL PRIMARY KEY,
5
- name VARCHAR(255) NOT NULL,
6
- scope VARCHAR(255) NOT NULL DEFAULT 'global',
7
- service VARCHAR(255) NOT NULL DEFAULT '',
8
- batch INTEGER NOT NULL,
9
- status VARCHAR(255) NOT NULL,
10
- applied_at TIMESTAMP NULL,
11
- created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
12
- UNIQUE(name, scope, service)
13
- )`;
14
- const getDoTimeoutMs = () => {
15
- const globalEnv = globalThis.env;
16
- const raw = globalEnv?.['POSTGRES_DO_TIMEOUT_MS'] ?? globalEnv?.['DO_REQUEST_TIMEOUT_MS'];
17
- const parsed = Number(raw);
18
- return Number.isFinite(parsed) && parsed > 0 ? parsed : 15000;
19
- };
20
- const createTimeoutSignal = (timeoutMs) => {
21
- if (timeoutMs <= 0)
22
- return undefined;
23
- const timeout = AbortSignal.timeout;
24
- return typeof timeout === 'function' ? timeout(timeoutMs) : undefined;
25
- };
26
- const createSendQueryFunction = (getStub, connect) => {
27
- return async (sql, params, method) => {
28
- await connect();
29
- const stub = getStub();
30
- const executePath = 'http://do/execute'; //NOSONAR
31
- const queryPath = 'http://do/query'; //NOSONAR
32
- const payload = JSON.stringify({
33
- command: sql,
34
- sql,
35
- params,
36
- method,
37
- });
38
- const timeoutMs = getDoTimeoutMs();
39
- const send = async (path) => {
40
- const startedAt = Date.now();
41
- try {
42
- const response = await stub.fetch(path, {
43
- method: 'POST',
44
- headers: {
45
- 'Content-Type': 'application/json',
46
- },
47
- body: payload,
48
- signal: createTimeoutSignal(timeoutMs),
49
- });
50
- Logger.debug('[PostgresWorkersDurableObjectAdapter] DO request completed', {
51
- path,
52
- status: response.status,
53
- durationMs: Date.now() - startedAt,
54
- timeoutMs,
55
- sqlPreview: sql.slice(0, 80),
56
- });
57
- return response;
58
- }
59
- catch (error) {
60
- Logger.error('[PostgresWorkersDurableObjectAdapter] DO request failed', {
61
- path,
62
- durationMs: Date.now() - startedAt,
63
- timeoutMs,
64
- error: error instanceof Error ? error.message : String(error),
65
- });
66
- if (error instanceof Error && error.name === 'AbortError') {
67
- throw ErrorFactory.createGeneralError(`PostgreSQL DO request timed out after ${timeoutMs}ms (${path})`, error);
68
- }
69
- throw error;
70
- }
71
- };
72
- let response = await send(executePath);
73
- if (!response.ok && (response.status === 404 || response.status === 405)) {
74
- response = await send(queryPath);
75
- }
76
- if (!response.ok) {
77
- const text = await response.text();
78
- let errDetail;
79
- try {
80
- errDetail = JSON.parse(text);
81
- }
82
- catch {
83
- errDetail = { error: text };
84
- }
85
- const msg = errDetail.error ||
86
- errDetail.message ||
87
- response.statusText;
88
- throw ErrorFactory.createGeneralError(`DO Query Failed: ${msg}`);
89
- }
90
- const json = (await response.json());
91
- if (json !== null && typeof json === 'object' && 'result' in json) {
92
- return json.result;
93
- }
94
- return json;
95
- };
96
- };
97
- const createConnectionManager = (getNamespace) => {
98
- let connected = false;
99
- const getStub = () => {
100
- const namespace = getNamespace();
101
- if (!namespace) {
102
- throw ErrorFactory.createConfigError('POSTGRES_POOL binding not found. Cannot connect to Durable Object pool.');
103
- }
104
- const id = namespace.idFromName('default');
105
- return namespace.get(id);
106
- };
107
- const connect = async () => {
108
- if (connected)
109
- return;
110
- try {
111
- const stub = getStub();
112
- const health = 'http://do/health'; //NOSONAR
113
- const timeoutMs = getDoTimeoutMs();
114
- const res = await stub.fetch(health, {
115
- method: 'POST',
116
- signal: createTimeoutSignal(timeoutMs),
117
- });
118
- if (!res.ok) {
119
- const details = await res.text();
120
- throw ErrorFactory.createGeneralError(`DO health check failed: ${res.status} ${details || res.statusText}`);
121
- }
122
- const body = (await res.json());
123
- if (!body.connected) {
124
- Logger.info('[PostgresWorkersDurableObjectAdapter] DO not connected yet, will init on first query');
125
- }
126
- connected = true;
127
- }
128
- catch (err) {
129
- Logger.error('[PostgresWorkersDurableObjectAdapter] Connection failed', err);
130
- throw ErrorFactory.createGeneralError('Failed to connect to PostgreSQL DO', err);
131
- }
132
- };
133
- const sendQuery = createSendQueryFunction(getStub, connect);
134
- return {
135
- connect,
136
- sendQuery,
137
- disconnect: () => {
138
- connected = false;
139
- },
140
- isConnected: () => connected,
141
- };
142
- };
143
- export const PostgresWorkersDurableObjectAdapter = Object.freeze({
144
- create(_config) {
145
- const connectionManager = createConnectionManager(() => {
146
- const globalEnv = globalThis.env;
147
- return globalEnv?.['POSTGRES_POOL'];
148
- });
149
- return {
150
- async connect() {
151
- return connectionManager.connect();
152
- },
153
- async disconnect() {
154
- connectionManager.disconnect();
155
- },
156
- async query(sql, parameters = []) {
157
- return connectionManager.sendQuery(sql, parameters, 'query');
158
- },
159
- async queryOne(sql, parameters = []) {
160
- const result = await connectionManager.sendQuery(sql, parameters, 'query');
161
- if (result.rows.length === 0)
162
- return null;
163
- return result.rows[0];
164
- },
165
- async rawQuery(sql, parameters) {
166
- const result = await connectionManager.sendQuery(sql, parameters || [], 'query');
167
- return result.rows;
168
- },
169
- async ping() {
170
- await connectionManager.connect();
171
- await connectionManager.sendQuery('SELECT 1', [], 'query');
172
- },
173
- async transaction(_callback) {
174
- throw ErrorFactory.createGeneralError('Transactions are not yet supported in PostgresWorkersDurableObjectAdapter');
175
- },
176
- getType() {
177
- return POSTGRES_TYPE;
178
- },
179
- isConnected() {
180
- return connectionManager.isConnected();
181
- },
182
- getPlaceholder(index) {
183
- return `$${index}`;
184
- },
185
- async ensureMigrationsTable() {
186
- await connectionManager.sendQuery(CREATE_MIGRATIONS_TABLE_SQL, [], 'query');
187
- },
188
- };
189
- },
190
- });
191
- export default PostgresWorkersDurableObjectAdapter;