@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/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