@celerity-sdk/sql-database 0.3.0 → 0.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/README.md +114 -2
- package/dist/index.cjs +634 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +175 -1
- package/dist/index.d.ts +175 -1
- package/dist/index.js +596 -0
- package/dist/index.js.map +1 -1
- package/package.json +36 -4
package/dist/index.cjs
CHANGED
|
@@ -1,8 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
2
3
|
var __defProp = Object.defineProperty;
|
|
3
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
5
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
9
|
+
var __esm = (fn, res) => function __init() {
|
|
10
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
11
|
+
};
|
|
12
|
+
var __export = (target, all) => {
|
|
13
|
+
for (var name in all)
|
|
14
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
15
|
+
};
|
|
6
16
|
var __copyProps = (to, from, except, desc) => {
|
|
7
17
|
if (from && typeof from === "object" || typeof from === "function") {
|
|
8
18
|
for (let key of __getOwnPropNames(from))
|
|
@@ -11,9 +21,633 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
11
21
|
}
|
|
12
22
|
return to;
|
|
13
23
|
};
|
|
24
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
25
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
26
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
27
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
28
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
29
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
30
|
+
mod
|
|
31
|
+
));
|
|
14
32
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
15
33
|
|
|
34
|
+
// src/rds-token-provider.ts
|
|
35
|
+
var rds_token_provider_exports = {};
|
|
36
|
+
__export(rds_token_provider_exports, {
|
|
37
|
+
RdsTokenProvider: () => RdsTokenProvider,
|
|
38
|
+
createRdsTokenProviderFactory: () => createRdsTokenProviderFactory
|
|
39
|
+
});
|
|
40
|
+
function createRdsTokenProviderFactory(region) {
|
|
41
|
+
return (hostname, port, username) => new RdsTokenProvider(hostname, port, username, region);
|
|
42
|
+
}
|
|
43
|
+
var TOKEN_CACHE_MS, RdsTokenProvider;
|
|
44
|
+
var init_rds_token_provider = __esm({
|
|
45
|
+
"src/rds-token-provider.ts"() {
|
|
46
|
+
"use strict";
|
|
47
|
+
TOKEN_CACHE_MS = 14 * 60 * 1e3;
|
|
48
|
+
RdsTokenProvider = class {
|
|
49
|
+
static {
|
|
50
|
+
__name(this, "RdsTokenProvider");
|
|
51
|
+
}
|
|
52
|
+
hostname;
|
|
53
|
+
port;
|
|
54
|
+
username;
|
|
55
|
+
region;
|
|
56
|
+
cached = null;
|
|
57
|
+
constructor(hostname, port, username, region) {
|
|
58
|
+
this.hostname = hostname;
|
|
59
|
+
this.port = port;
|
|
60
|
+
this.username = username;
|
|
61
|
+
this.region = region;
|
|
62
|
+
}
|
|
63
|
+
async getToken() {
|
|
64
|
+
const now = Date.now();
|
|
65
|
+
if (this.cached && now < this.cached.expiresAt) return this.cached.token;
|
|
66
|
+
const pkg = "@aws-sdk/rds-signer";
|
|
67
|
+
const { Signer } = await import(pkg);
|
|
68
|
+
const signer = new Signer({
|
|
69
|
+
hostname: this.hostname,
|
|
70
|
+
port: this.port,
|
|
71
|
+
username: this.username,
|
|
72
|
+
region: this.region
|
|
73
|
+
});
|
|
74
|
+
const token = await signer.getAuthToken();
|
|
75
|
+
this.cached = {
|
|
76
|
+
token,
|
|
77
|
+
expiresAt: now + TOKEN_CACHE_MS
|
|
78
|
+
};
|
|
79
|
+
return token;
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
__name(createRdsTokenProviderFactory, "createRdsTokenProviderFactory");
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
|
|
16
86
|
// src/index.ts
|
|
17
87
|
var index_exports = {};
|
|
88
|
+
__export(index_exports, {
|
|
89
|
+
DEFAULT_SQL_CREDENTIALS_TOKEN: () => DEFAULT_SQL_CREDENTIALS_TOKEN,
|
|
90
|
+
DEFAULT_SQL_DATABASE_INSTANCE_TOKEN: () => DEFAULT_SQL_DATABASE_INSTANCE_TOKEN,
|
|
91
|
+
DEFAULT_SQL_READER_TOKEN: () => DEFAULT_SQL_READER_TOKEN,
|
|
92
|
+
DEFAULT_SQL_WRITER_TOKEN: () => DEFAULT_SQL_WRITER_TOKEN,
|
|
93
|
+
POOL_PRESETS: () => POOL_PRESETS,
|
|
94
|
+
RdsTokenProvider: () => RdsTokenProvider,
|
|
95
|
+
SqlCredentials: () => SqlCredentials,
|
|
96
|
+
SqlDatabase: () => SqlDatabase,
|
|
97
|
+
SqlDatabaseError: () => SqlDatabaseError,
|
|
98
|
+
SqlDatabaseInstance: () => SqlDatabaseInstance,
|
|
99
|
+
SqlDatabaseLayer: () => SqlDatabaseLayer,
|
|
100
|
+
SqlReader: () => SqlReader,
|
|
101
|
+
SqlWriter: () => SqlWriter,
|
|
102
|
+
buildConnectionUrl: () => buildConnectionUrl,
|
|
103
|
+
captureSqlDatabaseLayerConfig: () => captureSqlDatabaseLayerConfig,
|
|
104
|
+
createKnexInstance: () => createKnexInstance,
|
|
105
|
+
createRdsTokenProviderFactory: () => createRdsTokenProviderFactory,
|
|
106
|
+
getSqlCredentials: () => getSqlCredentials,
|
|
107
|
+
getSqlReader: () => getSqlReader,
|
|
108
|
+
getSqlWriter: () => getSqlWriter,
|
|
109
|
+
resolveDatabaseCredentials: () => resolveDatabaseCredentials,
|
|
110
|
+
resolvePoolConfig: () => resolvePoolConfig,
|
|
111
|
+
resolvePoolOverrides: () => resolvePoolOverrides,
|
|
112
|
+
sqlDatabaseCredentialsToken: () => sqlDatabaseCredentialsToken,
|
|
113
|
+
sqlDatabaseInstanceToken: () => sqlDatabaseInstanceToken,
|
|
114
|
+
sqlReaderToken: () => sqlReaderToken,
|
|
115
|
+
sqlWriterToken: () => sqlWriterToken
|
|
116
|
+
});
|
|
18
117
|
module.exports = __toCommonJS(index_exports);
|
|
118
|
+
|
|
119
|
+
// src/errors.ts
|
|
120
|
+
var SqlDatabaseError = class extends Error {
|
|
121
|
+
static {
|
|
122
|
+
__name(this, "SqlDatabaseError");
|
|
123
|
+
}
|
|
124
|
+
database;
|
|
125
|
+
constructor(message, database, options) {
|
|
126
|
+
super(message, options), this.database = database;
|
|
127
|
+
this.name = "SqlDatabaseError";
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
// src/config.ts
|
|
132
|
+
var import_config = require("@celerity-sdk/config");
|
|
133
|
+
function captureSqlDatabaseLayerConfig() {
|
|
134
|
+
return {
|
|
135
|
+
deployTarget: process.env.CELERITY_RUNTIME ? "runtime" : "functions",
|
|
136
|
+
platform: import_config.CelerityConfig.getPlatform()
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
__name(captureSqlDatabaseLayerConfig, "captureSqlDatabaseLayerConfig");
|
|
140
|
+
async function resolveTokenProviderFactory(platform) {
|
|
141
|
+
if (platform !== "aws") return void 0;
|
|
142
|
+
const mod = await Promise.resolve().then(() => (init_rds_token_provider(), rds_token_provider_exports));
|
|
143
|
+
return mod.createRdsTokenProviderFactory();
|
|
144
|
+
}
|
|
145
|
+
__name(resolveTokenProviderFactory, "resolveTokenProviderFactory");
|
|
146
|
+
var FUNCTIONS_POOL = {
|
|
147
|
+
min: 0,
|
|
148
|
+
max: 2,
|
|
149
|
+
idleTimeoutMillis: 1e3,
|
|
150
|
+
acquireTimeoutMillis: 1e4,
|
|
151
|
+
createTimeoutMillis: 1e4,
|
|
152
|
+
reapIntervalMillis: 500
|
|
153
|
+
};
|
|
154
|
+
var RUNTIME_POOL = {
|
|
155
|
+
min: 2,
|
|
156
|
+
max: 10,
|
|
157
|
+
idleTimeoutMillis: 3e4,
|
|
158
|
+
acquireTimeoutMillis: 1e4,
|
|
159
|
+
createTimeoutMillis: 1e4,
|
|
160
|
+
reapIntervalMillis: 1e3
|
|
161
|
+
};
|
|
162
|
+
var POOL_PRESETS = {
|
|
163
|
+
functions: FUNCTIONS_POOL,
|
|
164
|
+
runtime: RUNTIME_POOL
|
|
165
|
+
};
|
|
166
|
+
var POOL_CONFIG_KEYS = [
|
|
167
|
+
[
|
|
168
|
+
"poolMin",
|
|
169
|
+
"min"
|
|
170
|
+
],
|
|
171
|
+
[
|
|
172
|
+
"poolMax",
|
|
173
|
+
"max"
|
|
174
|
+
],
|
|
175
|
+
[
|
|
176
|
+
"poolIdleTimeoutMs",
|
|
177
|
+
"idleTimeoutMillis"
|
|
178
|
+
],
|
|
179
|
+
[
|
|
180
|
+
"poolAcquireTimeoutMs",
|
|
181
|
+
"acquireTimeoutMillis"
|
|
182
|
+
],
|
|
183
|
+
[
|
|
184
|
+
"poolCreateTimeoutMs",
|
|
185
|
+
"createTimeoutMillis"
|
|
186
|
+
],
|
|
187
|
+
[
|
|
188
|
+
"poolReapIntervalMs",
|
|
189
|
+
"reapIntervalMillis"
|
|
190
|
+
]
|
|
191
|
+
];
|
|
192
|
+
async function resolvePoolOverrides(configKey, resourceConfig) {
|
|
193
|
+
const overrides = {};
|
|
194
|
+
for (const [suffix, field] of POOL_CONFIG_KEYS) {
|
|
195
|
+
const value = await resourceConfig.get(`${configKey}_${suffix}`);
|
|
196
|
+
if (value !== void 0) {
|
|
197
|
+
overrides[field] = Number.parseInt(value, 10);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return overrides;
|
|
201
|
+
}
|
|
202
|
+
__name(resolvePoolOverrides, "resolvePoolOverrides");
|
|
203
|
+
function resolvePoolConfig(deployTarget, configOverrides, programmaticOverrides) {
|
|
204
|
+
return {
|
|
205
|
+
...POOL_PRESETS[deployTarget],
|
|
206
|
+
...configOverrides,
|
|
207
|
+
...programmaticOverrides
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
__name(resolvePoolConfig, "resolvePoolConfig");
|
|
211
|
+
|
|
212
|
+
// src/credentials.ts
|
|
213
|
+
var DEFAULT_PORTS = {
|
|
214
|
+
postgres: 5432,
|
|
215
|
+
mysql: 3306
|
|
216
|
+
};
|
|
217
|
+
function buildConnectionUrl(params) {
|
|
218
|
+
const { engine, user, password, host, port, database, ssl } = params;
|
|
219
|
+
const encodedPassword = encodeURIComponent(password);
|
|
220
|
+
const protocol = engine === "postgres" ? "postgresql" : "mysql";
|
|
221
|
+
const sslParam = ssl ? engine === "postgres" ? "?sslmode=require" : "?ssl=true" : "";
|
|
222
|
+
return `${protocol}://${user}:${encodedPassword}@${host}:${port}/${database}${sslParam}`;
|
|
223
|
+
}
|
|
224
|
+
__name(buildConnectionUrl, "buildConnectionUrl");
|
|
225
|
+
async function resolveDatabaseCredentials(configKey, resourceConfig, tokenProviderFactory) {
|
|
226
|
+
const host = await resourceConfig.get(`${configKey}_host`);
|
|
227
|
+
if (!host) {
|
|
228
|
+
throw new SqlDatabaseError(`Missing required config key "${configKey}_host"`, configKey);
|
|
229
|
+
}
|
|
230
|
+
const user = await resourceConfig.get(`${configKey}_user`);
|
|
231
|
+
if (!user) {
|
|
232
|
+
throw new SqlDatabaseError(`Missing required config key "${configKey}_user"`, configKey);
|
|
233
|
+
}
|
|
234
|
+
const engineRaw = await resourceConfig.get(`${configKey}_engine`);
|
|
235
|
+
const engine = engineRaw === "mysql" ? "mysql" : "postgres";
|
|
236
|
+
const portRaw = await resourceConfig.get(`${configKey}_port`);
|
|
237
|
+
const port = portRaw ? Number.parseInt(portRaw, 10) : DEFAULT_PORTS[engine];
|
|
238
|
+
const databaseName = await resourceConfig.get(`${configKey}_database`) ?? configKey;
|
|
239
|
+
const authModeRaw = await resourceConfig.get(`${configKey}_authMode`);
|
|
240
|
+
const authMode = authModeRaw === "iam" ? "iam" : "password";
|
|
241
|
+
const sslRaw = await resourceConfig.get(`${configKey}_ssl`);
|
|
242
|
+
const ssl = authMode === "iam" ? true : sslRaw !== "false";
|
|
243
|
+
const readHost = await resourceConfig.get(`${configKey}_readHost`);
|
|
244
|
+
const connectionInfo = {
|
|
245
|
+
host,
|
|
246
|
+
port,
|
|
247
|
+
database: databaseName,
|
|
248
|
+
user,
|
|
249
|
+
engine,
|
|
250
|
+
ssl,
|
|
251
|
+
authMode,
|
|
252
|
+
...readHost ? {
|
|
253
|
+
readHost
|
|
254
|
+
} : {}
|
|
255
|
+
};
|
|
256
|
+
if (authMode === "password") {
|
|
257
|
+
const password = await resourceConfig.get(`${configKey}_password`);
|
|
258
|
+
if (!password) {
|
|
259
|
+
throw new SqlDatabaseError(`Missing required config key "${configKey}_password" for password auth`, configKey);
|
|
260
|
+
}
|
|
261
|
+
return new PasswordCredentials(connectionInfo, password);
|
|
262
|
+
}
|
|
263
|
+
if (!tokenProviderFactory) {
|
|
264
|
+
throw new SqlDatabaseError(`IAM auth requires a tokenProviderFactory for config key "${configKey}"`, configKey);
|
|
265
|
+
}
|
|
266
|
+
return new IamCredentials(connectionInfo, tokenProviderFactory);
|
|
267
|
+
}
|
|
268
|
+
__name(resolveDatabaseCredentials, "resolveDatabaseCredentials");
|
|
269
|
+
var PasswordCredentials = class PasswordCredentials2 {
|
|
270
|
+
static {
|
|
271
|
+
__name(this, "PasswordCredentials");
|
|
272
|
+
}
|
|
273
|
+
info;
|
|
274
|
+
password;
|
|
275
|
+
constructor(info, password) {
|
|
276
|
+
this.info = info;
|
|
277
|
+
this.password = password;
|
|
278
|
+
}
|
|
279
|
+
async getConnectionInfo() {
|
|
280
|
+
return this.info;
|
|
281
|
+
}
|
|
282
|
+
async getPasswordAuth() {
|
|
283
|
+
const { engine, user, host, port, database, ssl } = this.info;
|
|
284
|
+
const url = buildConnectionUrl({
|
|
285
|
+
engine,
|
|
286
|
+
user,
|
|
287
|
+
password: this.password,
|
|
288
|
+
host,
|
|
289
|
+
port,
|
|
290
|
+
database,
|
|
291
|
+
ssl
|
|
292
|
+
});
|
|
293
|
+
const readUrl = this.info.readHost ? buildConnectionUrl({
|
|
294
|
+
engine,
|
|
295
|
+
user,
|
|
296
|
+
password: this.password,
|
|
297
|
+
host: this.info.readHost,
|
|
298
|
+
port,
|
|
299
|
+
database,
|
|
300
|
+
ssl
|
|
301
|
+
}) : void 0;
|
|
302
|
+
return {
|
|
303
|
+
password: this.password,
|
|
304
|
+
url,
|
|
305
|
+
...readUrl ? {
|
|
306
|
+
readUrl
|
|
307
|
+
} : {}
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
async getIamAuth() {
|
|
311
|
+
throw new SqlDatabaseError('Cannot call getIamAuth() when authMode is "password"', this.info.database);
|
|
312
|
+
}
|
|
313
|
+
};
|
|
314
|
+
var IamCredentials = class IamCredentials2 {
|
|
315
|
+
static {
|
|
316
|
+
__name(this, "IamCredentials");
|
|
317
|
+
}
|
|
318
|
+
info;
|
|
319
|
+
factory;
|
|
320
|
+
tokenProvider = null;
|
|
321
|
+
readTokenProvider = null;
|
|
322
|
+
constructor(info, factory) {
|
|
323
|
+
this.info = info;
|
|
324
|
+
this.factory = factory;
|
|
325
|
+
}
|
|
326
|
+
async getConnectionInfo() {
|
|
327
|
+
return this.info;
|
|
328
|
+
}
|
|
329
|
+
async getPasswordAuth() {
|
|
330
|
+
throw new SqlDatabaseError('Cannot call getPasswordAuth() when authMode is "iam"', this.info.database);
|
|
331
|
+
}
|
|
332
|
+
async getIamAuth() {
|
|
333
|
+
const provider = this.getOrCreateTokenProvider();
|
|
334
|
+
const token = await provider.getToken();
|
|
335
|
+
const { engine, user, host, port, database, ssl } = this.info;
|
|
336
|
+
const url = buildConnectionUrl({
|
|
337
|
+
engine,
|
|
338
|
+
user,
|
|
339
|
+
password: token,
|
|
340
|
+
host,
|
|
341
|
+
port,
|
|
342
|
+
database,
|
|
343
|
+
ssl
|
|
344
|
+
});
|
|
345
|
+
let readUrl;
|
|
346
|
+
if (this.info.readHost) {
|
|
347
|
+
const readProvider = this.getOrCreateReadTokenProvider();
|
|
348
|
+
const readToken = await readProvider.getToken();
|
|
349
|
+
readUrl = buildConnectionUrl({
|
|
350
|
+
engine,
|
|
351
|
+
user,
|
|
352
|
+
password: readToken,
|
|
353
|
+
host: this.info.readHost,
|
|
354
|
+
port,
|
|
355
|
+
database,
|
|
356
|
+
ssl
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
return {
|
|
360
|
+
token,
|
|
361
|
+
url,
|
|
362
|
+
...readUrl ? {
|
|
363
|
+
readUrl
|
|
364
|
+
} : {}
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
getOrCreateTokenProvider() {
|
|
368
|
+
if (!this.tokenProvider) {
|
|
369
|
+
this.tokenProvider = this.factory(this.info.host, this.info.port, this.info.user);
|
|
370
|
+
}
|
|
371
|
+
return this.tokenProvider;
|
|
372
|
+
}
|
|
373
|
+
getOrCreateReadTokenProvider() {
|
|
374
|
+
if (!this.readTokenProvider) {
|
|
375
|
+
this.readTokenProvider = this.factory(this.info.readHost, this.info.port, this.info.user);
|
|
376
|
+
}
|
|
377
|
+
return this.readTokenProvider;
|
|
378
|
+
}
|
|
379
|
+
};
|
|
380
|
+
|
|
381
|
+
// src/index.ts
|
|
382
|
+
init_rds_token_provider();
|
|
383
|
+
|
|
384
|
+
// src/factory.ts
|
|
385
|
+
var ENGINE_CLIENT = {
|
|
386
|
+
postgres: "pg",
|
|
387
|
+
mysql: "mysql2"
|
|
388
|
+
};
|
|
389
|
+
async function createKnexInstance(options) {
|
|
390
|
+
const { credentials, deployTarget, pool: poolOverrides, useReadHost } = options;
|
|
391
|
+
const pkg = "knex";
|
|
392
|
+
const { default: createKnex } = await import(pkg);
|
|
393
|
+
const info = await credentials.getConnectionInfo();
|
|
394
|
+
const client = ENGINE_CLIENT[info.engine];
|
|
395
|
+
if (!client) {
|
|
396
|
+
throw new Error(`Unsupported SQL engine: "${info.engine}"`);
|
|
397
|
+
}
|
|
398
|
+
const poolConfig = resolvePoolConfig(deployTarget, poolOverrides);
|
|
399
|
+
const host = useReadHost && info.readHost ? info.readHost : info.host;
|
|
400
|
+
const sslConfig = info.ssl ? {
|
|
401
|
+
rejectUnauthorized: true
|
|
402
|
+
} : false;
|
|
403
|
+
const knexPool = {
|
|
404
|
+
min: poolConfig.min,
|
|
405
|
+
max: poolConfig.max,
|
|
406
|
+
idleTimeoutMillis: poolConfig.idleTimeoutMillis,
|
|
407
|
+
acquireTimeoutMillis: poolConfig.acquireTimeoutMillis,
|
|
408
|
+
createTimeoutMillis: poolConfig.createTimeoutMillis,
|
|
409
|
+
reapIntervalMillis: poolConfig.reapIntervalMillis
|
|
410
|
+
};
|
|
411
|
+
if (info.authMode === "iam") {
|
|
412
|
+
return createKnex({
|
|
413
|
+
client,
|
|
414
|
+
connection: /* @__PURE__ */ __name(async () => {
|
|
415
|
+
const auth2 = await credentials.getIamAuth();
|
|
416
|
+
return {
|
|
417
|
+
host,
|
|
418
|
+
port: info.port,
|
|
419
|
+
user: info.user,
|
|
420
|
+
database: info.database,
|
|
421
|
+
password: auth2.token,
|
|
422
|
+
ssl: sslConfig
|
|
423
|
+
};
|
|
424
|
+
}, "connection"),
|
|
425
|
+
pool: knexPool
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
const auth = await credentials.getPasswordAuth();
|
|
429
|
+
return createKnex({
|
|
430
|
+
client,
|
|
431
|
+
connection: {
|
|
432
|
+
host,
|
|
433
|
+
port: info.port,
|
|
434
|
+
user: info.user,
|
|
435
|
+
database: info.database,
|
|
436
|
+
password: auth.password,
|
|
437
|
+
ssl: sslConfig
|
|
438
|
+
},
|
|
439
|
+
pool: knexPool
|
|
440
|
+
});
|
|
441
|
+
}
|
|
442
|
+
__name(createKnexInstance, "createKnexInstance");
|
|
443
|
+
|
|
444
|
+
// src/sql-database.ts
|
|
445
|
+
var SqlDatabaseInstance = class {
|
|
446
|
+
static {
|
|
447
|
+
__name(this, "SqlDatabaseInstance");
|
|
448
|
+
}
|
|
449
|
+
_writer;
|
|
450
|
+
_reader;
|
|
451
|
+
constructor(writer, reader) {
|
|
452
|
+
this._writer = writer;
|
|
453
|
+
this._reader = reader ?? writer;
|
|
454
|
+
}
|
|
455
|
+
writer() {
|
|
456
|
+
return this._writer;
|
|
457
|
+
}
|
|
458
|
+
reader() {
|
|
459
|
+
return this._reader;
|
|
460
|
+
}
|
|
461
|
+
async close() {
|
|
462
|
+
await this._writer.destroy();
|
|
463
|
+
if (this._reader !== this._writer) {
|
|
464
|
+
await this._reader.destroy();
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
};
|
|
468
|
+
|
|
469
|
+
// src/decorators.ts
|
|
470
|
+
var import_reflect_metadata = require("reflect-metadata");
|
|
471
|
+
var import_common = require("@celerity-sdk/common");
|
|
472
|
+
function sqlWriterToken(resourceName) {
|
|
473
|
+
return /* @__PURE__ */ Symbol.for(`celerity:sqlDatabase:writer:${resourceName}`);
|
|
474
|
+
}
|
|
475
|
+
__name(sqlWriterToken, "sqlWriterToken");
|
|
476
|
+
function sqlReaderToken(resourceName) {
|
|
477
|
+
return /* @__PURE__ */ Symbol.for(`celerity:sqlDatabase:reader:${resourceName}`);
|
|
478
|
+
}
|
|
479
|
+
__name(sqlReaderToken, "sqlReaderToken");
|
|
480
|
+
function sqlDatabaseCredentialsToken(resourceName) {
|
|
481
|
+
return /* @__PURE__ */ Symbol.for(`celerity:sqlDatabase:credentials:${resourceName}`);
|
|
482
|
+
}
|
|
483
|
+
__name(sqlDatabaseCredentialsToken, "sqlDatabaseCredentialsToken");
|
|
484
|
+
function sqlDatabaseInstanceToken(resourceName) {
|
|
485
|
+
return /* @__PURE__ */ Symbol.for(`celerity:sqlDatabase:instance:${resourceName}`);
|
|
486
|
+
}
|
|
487
|
+
__name(sqlDatabaseInstanceToken, "sqlDatabaseInstanceToken");
|
|
488
|
+
var DEFAULT_SQL_WRITER_TOKEN = /* @__PURE__ */ Symbol.for("celerity:sqlDatabase:writer:default");
|
|
489
|
+
var DEFAULT_SQL_READER_TOKEN = /* @__PURE__ */ Symbol.for("celerity:sqlDatabase:reader:default");
|
|
490
|
+
var DEFAULT_SQL_CREDENTIALS_TOKEN = /* @__PURE__ */ Symbol.for("celerity:sqlDatabase:credentials:default");
|
|
491
|
+
var DEFAULT_SQL_DATABASE_INSTANCE_TOKEN = /* @__PURE__ */ Symbol.for("celerity:sqlDatabase:instance:default");
|
|
492
|
+
function createResourceDecorator(tokenFn, defaultToken) {
|
|
493
|
+
return (resourceName) => {
|
|
494
|
+
return (target, _propertyKey, parameterIndex) => {
|
|
495
|
+
const token = resourceName ? tokenFn(resourceName) : defaultToken;
|
|
496
|
+
const existing = Reflect.getOwnMetadata(import_common.INJECT_METADATA, target) ?? /* @__PURE__ */ new Map();
|
|
497
|
+
existing.set(parameterIndex, token);
|
|
498
|
+
Reflect.defineMetadata(import_common.INJECT_METADATA, existing, target);
|
|
499
|
+
if (resourceName) {
|
|
500
|
+
const resources = Reflect.getOwnMetadata(import_common.USE_RESOURCE_METADATA, target) ?? [];
|
|
501
|
+
if (!resources.includes(resourceName)) {
|
|
502
|
+
Reflect.defineMetadata(import_common.USE_RESOURCE_METADATA, [
|
|
503
|
+
...resources,
|
|
504
|
+
resourceName
|
|
505
|
+
], target);
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
};
|
|
509
|
+
};
|
|
510
|
+
}
|
|
511
|
+
__name(createResourceDecorator, "createResourceDecorator");
|
|
512
|
+
var SqlDatabase = createResourceDecorator(sqlWriterToken, DEFAULT_SQL_WRITER_TOKEN);
|
|
513
|
+
var SqlWriter = createResourceDecorator(sqlWriterToken, DEFAULT_SQL_WRITER_TOKEN);
|
|
514
|
+
var SqlReader = createResourceDecorator(sqlReaderToken, DEFAULT_SQL_READER_TOKEN);
|
|
515
|
+
var SqlCredentials = createResourceDecorator(sqlDatabaseCredentialsToken, DEFAULT_SQL_CREDENTIALS_TOKEN);
|
|
516
|
+
|
|
517
|
+
// src/helpers.ts
|
|
518
|
+
function getSqlWriter(container, resourceName) {
|
|
519
|
+
const token = resourceName ? sqlWriterToken(resourceName) : DEFAULT_SQL_WRITER_TOKEN;
|
|
520
|
+
return container.resolve(token);
|
|
521
|
+
}
|
|
522
|
+
__name(getSqlWriter, "getSqlWriter");
|
|
523
|
+
function getSqlReader(container, resourceName) {
|
|
524
|
+
const token = resourceName ? sqlReaderToken(resourceName) : DEFAULT_SQL_READER_TOKEN;
|
|
525
|
+
return container.resolve(token);
|
|
526
|
+
}
|
|
527
|
+
__name(getSqlReader, "getSqlReader");
|
|
528
|
+
function getSqlCredentials(container, resourceName) {
|
|
529
|
+
const token = resourceName ? sqlDatabaseCredentialsToken(resourceName) : DEFAULT_SQL_CREDENTIALS_TOKEN;
|
|
530
|
+
return container.resolve(token);
|
|
531
|
+
}
|
|
532
|
+
__name(getSqlCredentials, "getSqlCredentials");
|
|
533
|
+
|
|
534
|
+
// src/layer.ts
|
|
535
|
+
var import_debug = __toESM(require("debug"), 1);
|
|
536
|
+
var import_common2 = require("@celerity-sdk/common");
|
|
537
|
+
var import_config3 = require("@celerity-sdk/config");
|
|
538
|
+
var debug = (0, import_debug.default)("celerity:sql-database");
|
|
539
|
+
var SqlDatabaseLayer = class {
|
|
540
|
+
static {
|
|
541
|
+
__name(this, "SqlDatabaseLayer");
|
|
542
|
+
}
|
|
543
|
+
initialized = false;
|
|
544
|
+
config = null;
|
|
545
|
+
async handle(context, next) {
|
|
546
|
+
if (!this.initialized) {
|
|
547
|
+
this.config = captureSqlDatabaseLayerConfig();
|
|
548
|
+
const links = (0, import_config3.captureResourceLinks)();
|
|
549
|
+
const sqlLinks = (0, import_config3.getLinksOfType)(links, "sqlDatabase");
|
|
550
|
+
if (sqlLinks.size > 0) {
|
|
551
|
+
const configService = await context.container.resolve(import_common2.CONFIG_SERVICE_TOKEN);
|
|
552
|
+
const resourceConfig = configService.namespace(import_config3.RESOURCE_CONFIG_NAMESPACE);
|
|
553
|
+
const tokenProviderFactory = await resolveTokenProviderFactory(this.config.platform);
|
|
554
|
+
for (const [resourceName, configKey] of sqlLinks) {
|
|
555
|
+
await this.initializeResource(context.container, resourceName, configKey, resourceConfig, tokenProviderFactory);
|
|
556
|
+
}
|
|
557
|
+
if (sqlLinks.size === 1) {
|
|
558
|
+
const [resourceName] = [
|
|
559
|
+
...sqlLinks.keys()
|
|
560
|
+
];
|
|
561
|
+
await this.registerDefaultTokens(context.container, resourceName);
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
this.initialized = true;
|
|
565
|
+
}
|
|
566
|
+
return next();
|
|
567
|
+
}
|
|
568
|
+
async initializeResource(container, resourceName, configKey, resourceConfig, tokenProviderFactory) {
|
|
569
|
+
debug("resolving sql database resource %s (configKey=%s)", resourceName, configKey);
|
|
570
|
+
const credentials = await resolveDatabaseCredentials(configKey, resourceConfig, tokenProviderFactory);
|
|
571
|
+
const poolOverrides = await resolvePoolOverrides(configKey, resourceConfig);
|
|
572
|
+
const info = await credentials.getConnectionInfo();
|
|
573
|
+
const writerKnex = await createKnexInstance({
|
|
574
|
+
credentials,
|
|
575
|
+
deployTarget: this.config.deployTarget,
|
|
576
|
+
pool: poolOverrides
|
|
577
|
+
});
|
|
578
|
+
let readerKnex = writerKnex;
|
|
579
|
+
if (info.readHost) {
|
|
580
|
+
readerKnex = await createKnexInstance({
|
|
581
|
+
credentials,
|
|
582
|
+
deployTarget: this.config.deployTarget,
|
|
583
|
+
pool: poolOverrides,
|
|
584
|
+
useReadHost: true
|
|
585
|
+
});
|
|
586
|
+
}
|
|
587
|
+
const instance = new SqlDatabaseInstance(writerKnex, readerKnex);
|
|
588
|
+
container.register(sqlDatabaseInstanceToken(resourceName), {
|
|
589
|
+
useValue: instance,
|
|
590
|
+
onClose: /* @__PURE__ */ __name(() => instance.close(), "onClose")
|
|
591
|
+
});
|
|
592
|
+
container.register(sqlWriterToken(resourceName), {
|
|
593
|
+
useValue: writerKnex
|
|
594
|
+
});
|
|
595
|
+
container.register(sqlReaderToken(resourceName), {
|
|
596
|
+
useValue: readerKnex
|
|
597
|
+
});
|
|
598
|
+
container.register(sqlDatabaseCredentialsToken(resourceName), {
|
|
599
|
+
useValue: credentials
|
|
600
|
+
});
|
|
601
|
+
debug("registered sql database resource %s", resourceName);
|
|
602
|
+
}
|
|
603
|
+
async registerDefaultTokens(container, resourceName) {
|
|
604
|
+
const instance = await container.resolve(sqlDatabaseInstanceToken(resourceName));
|
|
605
|
+
const writer = await container.resolve(sqlWriterToken(resourceName));
|
|
606
|
+
const reader = await container.resolve(sqlReaderToken(resourceName));
|
|
607
|
+
const creds = await container.resolve(sqlDatabaseCredentialsToken(resourceName));
|
|
608
|
+
container.register(DEFAULT_SQL_DATABASE_INSTANCE_TOKEN, {
|
|
609
|
+
useValue: instance
|
|
610
|
+
});
|
|
611
|
+
container.register(DEFAULT_SQL_WRITER_TOKEN, {
|
|
612
|
+
useValue: writer
|
|
613
|
+
});
|
|
614
|
+
container.register(DEFAULT_SQL_READER_TOKEN, {
|
|
615
|
+
useValue: reader
|
|
616
|
+
});
|
|
617
|
+
container.register(DEFAULT_SQL_CREDENTIALS_TOKEN, {
|
|
618
|
+
useValue: creds
|
|
619
|
+
});
|
|
620
|
+
debug("registered default sql database tokens \u2192 %s", resourceName);
|
|
621
|
+
}
|
|
622
|
+
};
|
|
623
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
624
|
+
0 && (module.exports = {
|
|
625
|
+
DEFAULT_SQL_CREDENTIALS_TOKEN,
|
|
626
|
+
DEFAULT_SQL_DATABASE_INSTANCE_TOKEN,
|
|
627
|
+
DEFAULT_SQL_READER_TOKEN,
|
|
628
|
+
DEFAULT_SQL_WRITER_TOKEN,
|
|
629
|
+
POOL_PRESETS,
|
|
630
|
+
RdsTokenProvider,
|
|
631
|
+
SqlCredentials,
|
|
632
|
+
SqlDatabase,
|
|
633
|
+
SqlDatabaseError,
|
|
634
|
+
SqlDatabaseInstance,
|
|
635
|
+
SqlDatabaseLayer,
|
|
636
|
+
SqlReader,
|
|
637
|
+
SqlWriter,
|
|
638
|
+
buildConnectionUrl,
|
|
639
|
+
captureSqlDatabaseLayerConfig,
|
|
640
|
+
createKnexInstance,
|
|
641
|
+
createRdsTokenProviderFactory,
|
|
642
|
+
getSqlCredentials,
|
|
643
|
+
getSqlReader,
|
|
644
|
+
getSqlWriter,
|
|
645
|
+
resolveDatabaseCredentials,
|
|
646
|
+
resolvePoolConfig,
|
|
647
|
+
resolvePoolOverrides,
|
|
648
|
+
sqlDatabaseCredentialsToken,
|
|
649
|
+
sqlDatabaseInstanceToken,
|
|
650
|
+
sqlReaderToken,
|
|
651
|
+
sqlWriterToken
|
|
652
|
+
});
|
|
19
653
|
//# sourceMappingURL=index.cjs.map
|