@celerity-sdk/sql-database 0.3.1 → 0.5.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.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
|