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