@zintrust/core 0.9.1 → 0.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/boot/registry/runtime.d.ts.map +1 -1
- package/src/boot/registry/runtime.js +20 -3
- package/src/cache/drivers/KVRemoteDriver.d.ts.map +1 -1
- package/src/cache/drivers/KVRemoteDriver.js +9 -2
- package/src/cli/scaffolding/ProjectScaffolder.js +3 -3
- package/src/cli/scaffolding/ScaffoldingVersionUtils.js +1 -1
- package/src/common/RemoteSignedJson.d.ts.map +1 -1
- package/src/common/RemoteSignedJson.js +16 -8
- package/src/http/middleware/BodyParsingMiddleware.d.ts.map +1 -1
- package/src/http/middleware/BodyParsingMiddleware.js +33 -22
- package/src/index.js +3 -3
- package/src/migrations/enum/index.d.ts +1 -0
- package/src/migrations/enum/index.d.ts.map +1 -1
- package/src/migrations/enum/index.js +1 -0
- package/src/migrations/schema/Blueprint.d.ts.map +1 -1
- package/src/migrations/schema/Blueprint.js +1 -0
- package/src/migrations/schema/SchemaCompiler.d.ts.map +1 -1
- package/src/migrations/schema/SchemaCompiler.js +1 -0
- package/src/migrations/schema/types.d.ts +2 -1
- package/src/migrations/schema/types.d.ts.map +1 -1
- package/src/orm/Model.d.ts +11 -0
- package/src/orm/Model.d.ts.map +1 -1
- package/src/orm/Model.js +31 -0
- package/src/security/AuthStoreIds.d.ts +8 -0
- package/src/security/AuthStoreIds.d.ts.map +1 -0
- package/src/security/AuthStoreIds.js +31 -0
- package/src/security/BulletproofDeviceStore.d.ts.map +1 -1
- package/src/security/BulletproofDeviceStore.js +27 -11
- package/src/security/JwtSessions.d.ts.map +1 -1
- package/src/security/JwtSessions.js +23 -9
- package/src/security/TokenRevocation.d.ts.map +1 -1
- package/src/security/TokenRevocation.js +10 -1
- package/src/zintrust.plugins.d.ts +3 -6
- package/src/zintrust.plugins.d.ts.map +1 -1
- package/src/zintrust.plugins.js +3 -6
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../../src/boot/registry/runtime.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AASvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../../src/boot/registry/runtime.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AASvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AA+P9C,eAAO,MAAM,8BAA8B,GAAI,iBAAiB,gBAAgB,KAAG,IA6BlF,CAAC;AAwUF,eAAO,MAAM,eAAe,GAAI,QAAQ;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,eAAe,EAAE,gBAAgB,CAAC;IAClC,SAAS,EAAE,MAAM,OAAO,CAAC;IACzB,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACrC,KAAG;IAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAyF7D,CAAC"}
|
|
@@ -40,6 +40,14 @@ const importFromExistingCandidates = async (moduleCandidates) => {
|
|
|
40
40
|
}
|
|
41
41
|
return undefined;
|
|
42
42
|
};
|
|
43
|
+
const loadBundledSystemTraceModule = async () => {
|
|
44
|
+
try {
|
|
45
|
+
return (await import('../../runtime/plugins/trace-runtime.js'));
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
43
51
|
const loadLocalSystemTraceModule = async () => {
|
|
44
52
|
const globalTracePluginState = globalThis;
|
|
45
53
|
if (globalTracePluginState.__zintrust_system_trace_runtime__ !== undefined) {
|
|
@@ -56,12 +64,21 @@ const loadLocalSystemTraceModule = async () => {
|
|
|
56
64
|
const localModule = await importFromExistingCandidates(moduleCandidates);
|
|
57
65
|
if (localModule !== undefined) {
|
|
58
66
|
if (typeof localModule.isAvailable === 'function' && localModule.isAvailable() === false) {
|
|
59
|
-
return
|
|
67
|
+
return {
|
|
68
|
+
isAvailable: () => false,
|
|
69
|
+
ensureSystemTraceRegistered: async () => {
|
|
70
|
+
await Promise.resolve();
|
|
71
|
+
},
|
|
72
|
+
};
|
|
60
73
|
}
|
|
61
74
|
return localModule;
|
|
62
75
|
}
|
|
63
76
|
}
|
|
64
|
-
|
|
77
|
+
const runtimeAliasModule = await tryImportOptional('@runtime/plugins/trace-runtime');
|
|
78
|
+
if (runtimeAliasModule !== undefined) {
|
|
79
|
+
return runtimeAliasModule;
|
|
80
|
+
}
|
|
81
|
+
return loadBundledSystemTraceModule();
|
|
65
82
|
};
|
|
66
83
|
const loadRuntimeQueueConfig = async () => {
|
|
67
84
|
const startupQueueConfig = getStartupQueueConfig();
|
|
@@ -414,7 +431,7 @@ const initializeSystemTrace = async (router) => {
|
|
|
414
431
|
const traceModule = (await tryImportOptional('@runtime/plugins/trace-runtime')) ??
|
|
415
432
|
(await loadLocalSystemTraceModule());
|
|
416
433
|
if (traceModule === undefined) {
|
|
417
|
-
Logger.debug('System Trace is enabled but the
|
|
434
|
+
Logger.debug('System Trace is enabled but no trace runtime bridge could be resolved. Install @zintrust/trace and ensure the bundled or project trace-runtime bridge is available.');
|
|
418
435
|
return;
|
|
419
436
|
}
|
|
420
437
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KVRemoteDriver.d.ts","sourceRoot":"","sources":["../../../../src/cache/drivers/KVRemoteDriver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"KVRemoteDriver.d.ts","sourceRoot":"","sources":["../../../../src/cache/drivers/KVRemoteDriver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAoZtD,eAAO,MAAM,cAAc;kBAvEM,WAAW;EAyE1C,CAAC;AAEH,eAAe,cAAc,CAAC"}
|
|
@@ -7,6 +7,7 @@ import { RemoteSignedJson } from '../../common/RemoteSignedJson.js';
|
|
|
7
7
|
import { Env } from '../../config/env.js';
|
|
8
8
|
import { Logger } from '../../config/logger.js';
|
|
9
9
|
import { ErrorFactory } from '../../exceptions/ZintrustError.js';
|
|
10
|
+
import { normalizeSigningCredentials } from '../../proxy/SigningService.js';
|
|
10
11
|
const resolveSigningPrefix = (baseUrl) => {
|
|
11
12
|
try {
|
|
12
13
|
const parsed = new URL(baseUrl);
|
|
@@ -23,7 +24,7 @@ const normalizeNamespace = (defaultNamespace) => defaultNamespace.trim() === ''
|
|
|
23
24
|
const getSettings = () => ({
|
|
24
25
|
baseUrl: Env.get('KV_REMOTE_URL'),
|
|
25
26
|
keyId: Env.get('KV_REMOTE_KEY_ID'),
|
|
26
|
-
secret: Env.get('KV_REMOTE_SECRET',
|
|
27
|
+
secret: Env.get('KV_REMOTE_SECRET', ''),
|
|
27
28
|
defaultNamespace: Env.get('KV_REMOTE_NAMESPACE'),
|
|
28
29
|
timeoutMs: Env.getInt('ZT_PROXY_TIMEOUT_MS', Env.REQUEST_TIMEOUT),
|
|
29
30
|
});
|
|
@@ -37,7 +38,13 @@ const hasCloudflareApiCreds = () => {
|
|
|
37
38
|
const creds = getCloudflareCreds();
|
|
38
39
|
return creds.accountId !== '' && creds.apiToken !== '';
|
|
39
40
|
};
|
|
40
|
-
const hasProxySigningCreds = (settings) =>
|
|
41
|
+
const hasProxySigningCreds = (settings) => {
|
|
42
|
+
const normalized = normalizeSigningCredentials({
|
|
43
|
+
keyId: settings.keyId,
|
|
44
|
+
secret: settings.secret,
|
|
45
|
+
});
|
|
46
|
+
return normalized.keyId.trim() !== '' && normalized.secret.trim() !== '';
|
|
47
|
+
};
|
|
41
48
|
const buildCloudflareValueUrl = (creds, key, ttlSeconds) => {
|
|
42
49
|
const base = `https://api.cloudflare.com/client/v4/accounts/${encodeURIComponent(creds.accountId)}/storage/kv/namespaces/${encodeURIComponent(creds.namespaceId)}/values/${encodeURIComponent(key)}`;
|
|
43
50
|
if (ttlSeconds === undefined)
|
|
@@ -90,9 +90,9 @@ const loadBundledPublishedCoreVersion = () => {
|
|
|
90
90
|
}
|
|
91
91
|
const publishedLineVersion = extractMajorMinorVersion(corePeerRange);
|
|
92
92
|
if (publishedLineVersion === undefined) {
|
|
93
|
-
return '0.
|
|
93
|
+
return '0.9.2';
|
|
94
94
|
}
|
|
95
|
-
return `${publishedLineVersion.major}.${publishedLineVersion.minor}.
|
|
95
|
+
return `${publishedLineVersion.major}.${publishedLineVersion.minor}.2`;
|
|
96
96
|
};
|
|
97
97
|
const toCompatibleCoreDependencyRange = (version) => `^${version}`;
|
|
98
98
|
const loadScaffoldCoreVersion = () => {
|
|
@@ -111,7 +111,7 @@ const loadGovernanceVersion = () => {
|
|
|
111
111
|
if (typeof bundledPublishedCoreVersion === 'string') {
|
|
112
112
|
return bundledPublishedCoreVersion;
|
|
113
113
|
}
|
|
114
|
-
return '0.
|
|
114
|
+
return '0.9.2';
|
|
115
115
|
};
|
|
116
116
|
const createDirectories = (projectPath, directories) => {
|
|
117
117
|
let count = 0;
|
|
@@ -30,5 +30,5 @@ export const toCompatibleGovernanceVersion = (value, fallback = '^1.0.0') => {
|
|
|
30
30
|
const parsed = extractMajorMinorVersion(value);
|
|
31
31
|
if (parsed === undefined)
|
|
32
32
|
return fallback;
|
|
33
|
-
return `^${parsed.major}.${parsed.minor}.
|
|
33
|
+
return `^${parsed.major}.${parsed.minor}.2`;
|
|
34
34
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RemoteSignedJson.d.ts","sourceRoot":"","sources":["../../../src/common/RemoteSignedJson.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,0BAA0B,CAAC,EAAE,MAAM,CAAC;IAEpC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,yBAAyB,EAAE,MAAM,CAAC;IAElC,QAAQ,EAAE;QACR,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,CAAC;
|
|
1
|
+
{"version":3,"file":"RemoteSignedJson.d.ts","sourceRoot":"","sources":["../../../src/common/RemoteSignedJson.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,0BAA0B,CAAC,EAAE,MAAM,CAAC;IAEpC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,yBAAyB,EAAE,MAAM,CAAC;IAElC,QAAQ,EAAE;QACR,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,CAAC;AAgIF,eAAO,MAAM,gBAAgB;YACb,CAAC,YACH,wBAAwB,QAC5B,MAAM,WACH,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,CAAC,CAAC;EA0Cb,CAAC;AAEH,eAAe,gBAAgB,CAAC"}
|
|
@@ -22,21 +22,29 @@ const asJson = async (resp) => {
|
|
|
22
22
|
}
|
|
23
23
|
};
|
|
24
24
|
const isRecord = (value) => isObject(value);
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
if (!isRecord(details))
|
|
28
|
-
return '';
|
|
29
|
-
const body = details['body'];
|
|
30
|
-
if (!isRecord(body))
|
|
25
|
+
const describeProxyErrorCandidate = (candidate) => {
|
|
26
|
+
if (!isRecord(candidate))
|
|
31
27
|
return '';
|
|
32
|
-
const code = typeof
|
|
33
|
-
const message = typeof
|
|
28
|
+
const code = typeof candidate['code'] === 'string' ? candidate['code'] : '';
|
|
29
|
+
const message = typeof candidate['message'] === 'string' ? candidate['message'] : '';
|
|
34
30
|
if (code === '' && message === '')
|
|
35
31
|
return '';
|
|
36
32
|
if (code !== '' && message !== '')
|
|
37
33
|
return `${code}: ${message}`;
|
|
38
34
|
return code === '' ? message : code;
|
|
39
35
|
};
|
|
36
|
+
const describeProxyError = (details) => {
|
|
37
|
+
if (!isRecord(details))
|
|
38
|
+
return '';
|
|
39
|
+
const candidates = [details, details['body'], details['error']];
|
|
40
|
+
for (const candidate of candidates) {
|
|
41
|
+
const described = describeProxyErrorCandidate(candidate);
|
|
42
|
+
if (described !== '') {
|
|
43
|
+
return described;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return '';
|
|
47
|
+
};
|
|
40
48
|
const normalizeSettings = (settings) => {
|
|
41
49
|
const creds = normalizeSigningCredentials({
|
|
42
50
|
keyId: settings.keyId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BodyParsingMiddleware.d.ts","sourceRoot":"","sources":["../../../../src/http/middleware/BodyParsingMiddleware.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"BodyParsingMiddleware.d.ts","sourceRoot":"","sources":["../../../../src/http/middleware/BodyParsingMiddleware.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AA6R9D;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,UA4CnC,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
|
|
@@ -170,6 +170,34 @@ const setRequestBody = (req, rawResult, contentType) => {
|
|
|
170
170
|
req.setBody(rawResult.bytes);
|
|
171
171
|
}
|
|
172
172
|
};
|
|
173
|
+
const applyParsedRequestBody = (req, res, rawResult, contentType) => {
|
|
174
|
+
if (contentType.includes('application/json')) {
|
|
175
|
+
const parsed = parseJsonBody(getTextFromRaw(rawResult), contentType, res);
|
|
176
|
+
if (parsed === null && res.getStatus() === 400) {
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
req.setBody(parsed);
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
setRequestBody(req, rawResult, contentType);
|
|
183
|
+
return true;
|
|
184
|
+
};
|
|
185
|
+
const getMaxBodySize = (contentType) => {
|
|
186
|
+
const isJson = contentType.includes('application/json');
|
|
187
|
+
const maxJsonSize = Env.getInt('MAX_JSON_SIZE', 1024 * 1024);
|
|
188
|
+
return isJson ? maxJsonSize : Env.MAX_BODY_SIZE;
|
|
189
|
+
};
|
|
190
|
+
const reuseExistingRawBody = (req, res, contentType, existingBytes, existingText) => {
|
|
191
|
+
const rawResult = convertExistingToRawResult(existingBytes, existingText);
|
|
192
|
+
req.context['rawBodyBytes'] = rawResult.bytes;
|
|
193
|
+
if (shouldStoreRawText(contentType)) {
|
|
194
|
+
req.context['rawBodyText'] = getTextFromRaw(rawResult);
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
req.context['rawBodyText'] = undefined;
|
|
198
|
+
}
|
|
199
|
+
return applyParsedRequestBody(req, res, rawResult, contentType);
|
|
200
|
+
};
|
|
173
201
|
const parseUrlEncodedBody = (text) => {
|
|
174
202
|
const out = {};
|
|
175
203
|
const params = new URLSearchParams(text);
|
|
@@ -203,16 +231,8 @@ const processBodyParsing = async (req, res, contentType, maxBytes) => {
|
|
|
203
231
|
}
|
|
204
232
|
// Parse and set body based on content type
|
|
205
233
|
try {
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
const parsed = parseJsonBody(getTextFromRaw(rawResult), contentType, res);
|
|
209
|
-
if (parsed === null && res.getStatus() === 400) {
|
|
210
|
-
return false; // JSON parsing failed, response already sent
|
|
211
|
-
}
|
|
212
|
-
req.setBody(parsed);
|
|
213
|
-
}
|
|
214
|
-
else {
|
|
215
|
-
setRequestBody(req, rawResult, contentType);
|
|
234
|
+
if (!applyParsedRequestBody(req, res, rawResult, contentType)) {
|
|
235
|
+
return false;
|
|
216
236
|
}
|
|
217
237
|
if (Env.getBool('ZIN_DEBUG_BODY_PARSING', false)) {
|
|
218
238
|
Logger.debug('[Body Parser] Parsed request body', {
|
|
@@ -254,20 +274,11 @@ export const bodyParsingMiddleware = async (req, res, next) => {
|
|
|
254
274
|
const existingText = req.context['rawBodyText'];
|
|
255
275
|
const hasExisting = Buffer.isBuffer(existingBytes) || typeof existingText === 'string';
|
|
256
276
|
// Calculate size limit based on content type
|
|
257
|
-
const
|
|
258
|
-
const maxJsonSize = Env.getInt('MAX_JSON_SIZE', 1024 * 1024);
|
|
259
|
-
const maxBytes = isJson ? maxJsonSize : Env.MAX_BODY_SIZE;
|
|
277
|
+
const maxBytes = getMaxBodySize(contentType);
|
|
260
278
|
// Read or reuse raw body
|
|
261
279
|
if (hasExisting) {
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
req.context['rawBodyBytes'] = rawResult.bytes;
|
|
265
|
-
if (shouldStoreRawText(contentType)) {
|
|
266
|
-
req.context['rawBodyText'] = getTextFromRaw(rawResult);
|
|
267
|
-
}
|
|
268
|
-
else {
|
|
269
|
-
req.context['rawBodyText'] = undefined;
|
|
270
|
-
}
|
|
280
|
+
if (!reuseExistingRawBody(req, res, contentType, existingBytes, existingText)) {
|
|
281
|
+
return;
|
|
271
282
|
}
|
|
272
283
|
}
|
|
273
284
|
else {
|
package/src/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @zintrust/core v0.9.
|
|
2
|
+
* @zintrust/core v0.9.3
|
|
3
3
|
*
|
|
4
4
|
* ZinTrust Framework - Production-Grade TypeScript Backend
|
|
5
5
|
* Built for performance, type safety, and exceptional developer experience
|
|
6
6
|
*
|
|
7
7
|
* Build Information:
|
|
8
|
-
* Built: 2026-04-
|
|
8
|
+
* Built: 2026-04-22T15:45:17.699Z
|
|
9
9
|
* Node: >=20.0.0
|
|
10
10
|
* License: MIT
|
|
11
11
|
*
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
* Available at runtime for debugging and health checks
|
|
22
22
|
*/
|
|
23
23
|
export const ZINTRUST_VERSION = '0.1.41';
|
|
24
|
-
export const ZINTRUST_BUILD_DATE = '2026-04-
|
|
24
|
+
export const ZINTRUST_BUILD_DATE = '2026-04-22T15:45:17.669Z'; // Replaced during build
|
|
25
25
|
export { Application } from './boot/Application.js';
|
|
26
26
|
export { AwsSigV4 } from './common/index.js';
|
|
27
27
|
export { SignedRequest } from './security/SignedRequest.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/migrations/enum/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/migrations/enum/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyEb,CAAC;AAEX,eAAO,MAAM,YAAY;;;;;;;;CAQf,CAAC;AAEX,eAAO,MAAM,QAAQ;;;;;;;;;;;;CAYX,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,MAAM,OAAO,YAAY,CAAC;AAEzD,MAAM,MAAM,eAAe,GACvB,OAAO,YAAY,CAAC,MAAM,GAC1B,OAAO,YAAY,CAAC,EAAE,GACtB,OAAO,YAAY,CAAC,QAAQ,GAC5B,OAAO,YAAY,CAAC,UAAU,GAC9B,OAAO,YAAY,CAAC,KAAK,GACzB,OAAO,YAAY,CAAC,SAAS,GAC7B,OAAO,YAAY,CAAC,aAAa,CAAC;AAEtC,wBAAgB,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAI/D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Blueprint.d.ts","sourceRoot":"","sources":["../../../../src/migrations/schema/Blueprint.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,SAAS,EASV,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"Blueprint.d.ts","sourceRoot":"","sources":["../../../../src/migrations/schema/Blueprint.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,SAAS,EASV,MAAM,0BAA0B,CAAC;AA4NlC,eAAO,MAAM,kBAAkB;sBACX,MAAM,GAAG,SAAS;EAMpC,CAAC"}
|
|
@@ -127,6 +127,7 @@ function buildDefinition(state) {
|
|
|
127
127
|
function createBlueprintApi(state) {
|
|
128
128
|
const api = {
|
|
129
129
|
string: (name, length = 255) => addColumn(state, name, ColumnTypeName.STRING, length),
|
|
130
|
+
date: (name) => addColumn(state, name, ColumnTypeName.DATE),
|
|
130
131
|
integer: (name) => addColumn(state, name, ColumnTypeName.INTEGER),
|
|
131
132
|
bigInteger: (name) => addColumn(state, name, ColumnTypeName.BIGINT).unsigned(),
|
|
132
133
|
uuid: (name) => addColumn(state, name, ColumnTypeName.UUID),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchemaCompiler.d.ts","sourceRoot":"","sources":["../../../../src/migrations/schema/SchemaCompiler.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,gBAAgB,EAEhB,oBAAoB,EACpB,eAAe,EACf,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAIlC,KAAK,cAAc,GAAG;IACpB,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,eAAe,EAAE,CAAC;IACjC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,cAAc,EAAE,oBAAoB,EAAE,CAAC;IACvC,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B,CAAC;
|
|
1
|
+
{"version":3,"file":"SchemaCompiler.d.ts","sourceRoot":"","sources":["../../../../src/migrations/schema/SchemaCompiler.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,gBAAgB,EAEhB,oBAAoB,EACpB,eAAe,EACf,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAIlC,KAAK,cAAc,GAAG;IACpB,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,eAAe,EAAE,CAAC;IACjC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,cAAc,EAAE,oBAAoB,EAAE,CAAC;IACvC,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B,CAAC;AAgXF,eAAO,MAAM,uBAAuB;+BAExB,MAAM,OACT,eAAe,SACb;QAAE,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,GAC/B,MAAM,EAAE;6BAKc,MAAM,SAAS,MAAM,SAAS;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,MAAM;8BAK5D,MAAM,SAAS,MAAM,QAAQ,cAAc,GAAG,MAAM,EAAE;EAIhF,CAAC"}
|
|
@@ -43,6 +43,7 @@ const TYPE_SQL = Object.freeze({
|
|
|
43
43
|
const len = typeof def.length === SchOther.NUMBER && Number.isFinite(def.length) ? def.length : 255;
|
|
44
44
|
return isSqliteFamily(driver) ? ColumnType.TEXT : `${ColumnType.VARCHAR}(${len})`;
|
|
45
45
|
},
|
|
46
|
+
DATE: (driver) => (isSqliteFamily(driver) ? ColumnType.TEXT : ColumnType.DATE),
|
|
46
47
|
INTEGER: (driver) => (driver === AdaptersEnum.mysql ? ColumnType.INT : ColumnType.INTEGER),
|
|
47
48
|
BIGINT: () => ColumnType.BIGINT,
|
|
48
49
|
UUID: (driver) => {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { IDatabase } from '../../orm/Database';
|
|
2
|
-
export type ColumnType = 'STRING' | 'INTEGER' | 'BIGINT' | 'UUID' | 'REAL' | 'BOOLEAN' | 'TEXT' | 'JSON' | 'TIMESTAMP' | 'BLOB';
|
|
2
|
+
export type ColumnType = 'STRING' | 'DATE' | 'INTEGER' | 'BIGINT' | 'UUID' | 'REAL' | 'BOOLEAN' | 'TEXT' | 'JSON' | 'TIMESTAMP' | 'BLOB';
|
|
3
3
|
export type IndexType = 'INDEX' | 'UNIQUE';
|
|
4
4
|
export type ForeignKeyAction = 'CASCADE' | 'SET NULL' | 'RESTRICT' | 'NO ACTION' | 'SET DEFAULT';
|
|
5
5
|
export type ColumnDefinition = {
|
|
@@ -53,6 +53,7 @@ export type ForeignKeyBuilder = {
|
|
|
53
53
|
export type Blueprint = {
|
|
54
54
|
uuid(name: string): ColumnBuilder;
|
|
55
55
|
string(name: string, length?: number): ColumnBuilder;
|
|
56
|
+
date(name: string): ColumnBuilder;
|
|
56
57
|
integer(name: string): ColumnBuilder;
|
|
57
58
|
bigInteger(name: string): ColumnBuilder;
|
|
58
59
|
real(name: string): ColumnBuilder;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/migrations/schema/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/migrations/schema/types.ts"],"names":[],"mappings":"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"}
|
package/src/orm/Model.d.ts
CHANGED
|
@@ -28,6 +28,12 @@ export interface ModelConfig {
|
|
|
28
28
|
}>;
|
|
29
29
|
connection?: string;
|
|
30
30
|
}
|
|
31
|
+
type ModelObserver = NonNullable<ModelConfig['observers']>[number];
|
|
32
|
+
export type PrimaryKeyObserverOptions = {
|
|
33
|
+
key?: string;
|
|
34
|
+
whenMissing?: boolean;
|
|
35
|
+
generate: () => unknown;
|
|
36
|
+
};
|
|
31
37
|
export interface ModelStatic {
|
|
32
38
|
query(): IQueryBuilder;
|
|
33
39
|
getTable?(): string;
|
|
@@ -144,6 +150,11 @@ export declare const Model: Readonly<{
|
|
|
144
150
|
insert: (config: ModelConfig, values: Record<string, unknown> | Array<Record<string, unknown>>) => Promise<InsertResult>;
|
|
145
151
|
bulkInsert: (config: ModelConfig, records: Array<Record<string, unknown>>) => Promise<InsertResult>;
|
|
146
152
|
define: typeof define;
|
|
153
|
+
primaryKey: Readonly<{
|
|
154
|
+
isMissing: (value: unknown) => boolean;
|
|
155
|
+
using: (options: PrimaryKeyObserverOptions) => ModelObserver;
|
|
156
|
+
uuid: (key?: string) => ModelObserver;
|
|
157
|
+
}>;
|
|
147
158
|
}>;
|
|
148
159
|
export {};
|
|
149
160
|
//# sourceMappingURL=Model.d.ts.map
|
package/src/orm/Model.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Model.d.ts","sourceRoot":"","sources":["../../../src/orm/Model.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"Model.d.ts","sourceRoot":"","sources":["../../../src/orm/Model.ts"],"names":[],"mappings":"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"}
|
package/src/orm/Model.js
CHANGED
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
* Enhanced Model with Relationships
|
|
3
3
|
* Full ORM capabilities with eager/lazy loading
|
|
4
4
|
*/
|
|
5
|
+
import { generateUuid } from '../common/utility.js';
|
|
5
6
|
import { DEFAULTS } from '../config/constants.js';
|
|
6
7
|
import { Logger } from '../config/logger.js';
|
|
7
8
|
import { ErrorFactory } from '../exceptions/ZintrustError.js';
|
|
9
|
+
import { isMissingLike, isWhitespaceOnly } from '../helper/index.js';
|
|
8
10
|
import { useDatabase } from './Database.js';
|
|
9
11
|
import { QueryBuilder } from './QueryBuilder.js';
|
|
10
12
|
import { RelationBootstrapDiagnostics, } from './RelationBootstrapDiagnostics.js';
|
|
@@ -177,6 +179,34 @@ const emitTraceModelEvent = (action, config, attrs, dirtyFields = []) => {
|
|
|
177
179
|
// best-effort trace emission must not affect ORM operations
|
|
178
180
|
}
|
|
179
181
|
};
|
|
182
|
+
const isMissingPrimaryKeyValue = (value) => {
|
|
183
|
+
if (isMissingLike(value))
|
|
184
|
+
return true;
|
|
185
|
+
return typeof value === 'string' && (value.length === 0 || isWhitespaceOnly(value));
|
|
186
|
+
};
|
|
187
|
+
const createPrimaryKeyObserver = (options) => {
|
|
188
|
+
const key = options.key ?? 'id';
|
|
189
|
+
const whenMissing = options.whenMissing ?? true;
|
|
190
|
+
return Object.freeze({
|
|
191
|
+
creating(model) {
|
|
192
|
+
if (!whenMissing)
|
|
193
|
+
return;
|
|
194
|
+
const currentValue = model.getAttribute(key);
|
|
195
|
+
if (!isMissingPrimaryKeyValue(currentValue))
|
|
196
|
+
return;
|
|
197
|
+
const nextValue = options.generate();
|
|
198
|
+
if (isMissingPrimaryKeyValue(nextValue)) {
|
|
199
|
+
throw ErrorFactory.createValidationError(`Generated primary key for ${key} is missing or blank`);
|
|
200
|
+
}
|
|
201
|
+
model.setAttribute(key, nextValue);
|
|
202
|
+
},
|
|
203
|
+
});
|
|
204
|
+
};
|
|
205
|
+
const ModelPrimaryKey = Object.freeze({
|
|
206
|
+
isMissing: isMissingPrimaryKeyValue,
|
|
207
|
+
using: (options) => createPrimaryKeyObserver(options),
|
|
208
|
+
uuid: (key = 'id') => createPrimaryKeyObserver({ key, whenMissing: true, generate: generateUuid }),
|
|
209
|
+
});
|
|
180
210
|
const persistNewModel = async (config, db, attrs) => {
|
|
181
211
|
const builder = QueryBuilder.create(config.table, db, buildSoftDeleteOptions(config));
|
|
182
212
|
const result = await builder.insert({ ...attrs });
|
|
@@ -757,4 +787,5 @@ export const Model = Object.freeze({
|
|
|
757
787
|
insert,
|
|
758
788
|
bulkInsert,
|
|
759
789
|
define,
|
|
790
|
+
primaryKey: ModelPrimaryKey,
|
|
760
791
|
});
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const shouldRetryAuthStoreInsertWithGeneratedId: (error: unknown) => boolean;
|
|
2
|
+
export declare const withGeneratedAuthStoreId: (payload: Record<string, unknown>) => Record<string, unknown>;
|
|
3
|
+
declare const _default: Readonly<{
|
|
4
|
+
shouldRetryAuthStoreInsertWithGeneratedId: (error: unknown) => boolean;
|
|
5
|
+
withGeneratedAuthStoreId: (payload: Record<string, unknown>) => Record<string, unknown>;
|
|
6
|
+
}>;
|
|
7
|
+
export default _default;
|
|
8
|
+
//# sourceMappingURL=AuthStoreIds.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthStoreIds.d.ts","sourceRoot":"","sources":["../../../src/security/AuthStoreIds.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,yCAAyC,GAAI,OAAO,OAAO,KAAG,OAG1E,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC/B,MAAM,CAAC,MAAM,EAAE,OAAO,CASxB,CAAC;;uDAhB+D,OAAO,KAAG,OAAO;wCAMvE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC/B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;AAW1B,wBAGG"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { generateUuid } from '../common/utility.js';
|
|
2
|
+
const getErrorMessage = (error) => {
|
|
3
|
+
return error instanceof Error ? error.message : String(error);
|
|
4
|
+
};
|
|
5
|
+
const includesIdDefaultFailure = (message) => {
|
|
6
|
+
return (message.includes("field 'id' doesn't have a default value") ||
|
|
7
|
+
message.includes("field `id` doesn't have a default value") ||
|
|
8
|
+
message.includes('column "id" does not have a default value') ||
|
|
9
|
+
message.includes('column "id" cannot be null') ||
|
|
10
|
+
message.includes('null value in column "id" violates not-null constraint') ||
|
|
11
|
+
message.includes("cannot insert the value null into column 'id'") ||
|
|
12
|
+
message.includes('not null constraint failed') ||
|
|
13
|
+
message.includes('missing a default value for column'));
|
|
14
|
+
};
|
|
15
|
+
export const shouldRetryAuthStoreInsertWithGeneratedId = (error) => {
|
|
16
|
+
const message = getErrorMessage(error).toLowerCase();
|
|
17
|
+
return message.includes('id') && includesIdDefaultFailure(message);
|
|
18
|
+
};
|
|
19
|
+
export const withGeneratedAuthStoreId = (payload) => {
|
|
20
|
+
if (Object.prototype.hasOwnProperty.call(payload, 'id')) {
|
|
21
|
+
return payload;
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
id: generateUuid(),
|
|
25
|
+
...payload,
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
export default Object.freeze({
|
|
29
|
+
shouldRetryAuthStoreInsertWithGeneratedId,
|
|
30
|
+
withGeneratedAuthStoreId,
|
|
31
|
+
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BulletproofDeviceStore.d.ts","sourceRoot":"","sources":["../../../src/security/BulletproofDeviceStore.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"BulletproofDeviceStore.d.ts","sourceRoot":"","sources":["../../../src/security/BulletproofDeviceStore.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,uBAAuB,GAAG,QAAQ,CAAC;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,IAAI,CAAC;CAClB,CAAC,CAAC;AAEH,MAAM,MAAM,6BAA6B,GAAG,uBAAuB,GACjE,QAAQ,CAAC;IACP,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB,CAAC,CAAC;AAqNL,eAAO,MAAM,sBAAsB;6BACF,MAAM,GAAG,OAAO,CAAC,6BAA6B,GAAG,IAAI,CAAC;mBA4BhE,uBAAuB,GAAG,OAAO,CAAC,6BAA6B,CAAC;+BA8DpD,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;EAavD,CAAC;AAEH,eAAe,sBAAsB,CAAC"}
|
|
@@ -2,6 +2,7 @@ import { Env } from '../config/env.js';
|
|
|
2
2
|
import { ErrorFactory } from '../exceptions/ZintrustError.js';
|
|
3
3
|
import { isNonEmptyString } from '../helper/index.js';
|
|
4
4
|
import { useDatabase } from '../orm/Database.js';
|
|
5
|
+
import { shouldRetryAuthStoreInsertWithGeneratedId, withGeneratedAuthStoreId, } from './AuthStoreIds.js';
|
|
5
6
|
const DEFAULTS = Object.freeze({
|
|
6
7
|
dbConnection: 'default',
|
|
7
8
|
dbTable: 'zintrust_bulletproof_devices',
|
|
@@ -152,6 +153,13 @@ const buildIgnoreInsert = (db, table, columns, conflictColumns) => {
|
|
|
152
153
|
}
|
|
153
154
|
return `INSERT INTO ${table} (${columnList}) VALUES (${placeholders})`;
|
|
154
155
|
};
|
|
156
|
+
const isDuplicateInsertError = (error) => {
|
|
157
|
+
const message = getErrorMessage(error).toLowerCase();
|
|
158
|
+
return (message.includes('duplicate') ||
|
|
159
|
+
message.includes('unique constraint') ||
|
|
160
|
+
message.includes('unique failed') ||
|
|
161
|
+
message.includes('duplicate key'));
|
|
162
|
+
};
|
|
155
163
|
export const BulletproofDeviceStore = Object.freeze({
|
|
156
164
|
async findByDeviceId(deviceId) {
|
|
157
165
|
if (!isNonEmptyString(deviceId))
|
|
@@ -192,23 +200,31 @@ export const BulletproofDeviceStore = Object.freeze({
|
|
|
192
200
|
};
|
|
193
201
|
const insertPayload = buildInsertPayload(normalizedRecord);
|
|
194
202
|
const updatePayload = buildUpdatePayload(normalizedRecord);
|
|
195
|
-
const insertColumns = Object.keys(insertPayload);
|
|
196
|
-
const insertValues = insertColumns.map((column) => insertPayload[column]);
|
|
197
|
-
const insertSql = buildIgnoreInsert(db, table, insertColumns, ['device_id']);
|
|
198
203
|
try {
|
|
199
204
|
return await db.transaction(async (transactionDb) => {
|
|
200
205
|
await transactionDb.table(table).where('device_id', '=', deviceId).update(updatePayload);
|
|
206
|
+
const insertRecord = async (payload) => {
|
|
207
|
+
const columns = Object.keys(payload);
|
|
208
|
+
const values = columns.map((column) => payload[column]);
|
|
209
|
+
const sql = buildIgnoreInsert(db, table, columns, ['device_id']);
|
|
210
|
+
await transactionDb.execute(sql, values);
|
|
211
|
+
};
|
|
201
212
|
try {
|
|
202
|
-
await
|
|
213
|
+
await insertRecord(insertPayload);
|
|
203
214
|
}
|
|
204
215
|
catch (error) {
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
216
|
+
if (!isDuplicateInsertError(error)) {
|
|
217
|
+
if (!shouldRetryAuthStoreInsertWithGeneratedId(error)) {
|
|
218
|
+
throw error;
|
|
219
|
+
}
|
|
220
|
+
try {
|
|
221
|
+
await insertRecord(withGeneratedAuthStoreId(insertPayload));
|
|
222
|
+
}
|
|
223
|
+
catch (retryError) {
|
|
224
|
+
if (!isDuplicateInsertError(retryError)) {
|
|
225
|
+
throw retryError;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
212
228
|
}
|
|
213
229
|
}
|
|
214
230
|
const stored = await transactionDb
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JwtSessions.d.ts","sourceRoot":"","sources":["../../../src/security/JwtSessions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"JwtSessions.d.ts","sourceRoot":"","sources":["../../../src/security/JwtSessions.ts"],"names":[],"mappings":"AAcA,MAAM,MAAM,qBAAqB,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,IAAI,GAAG,WAAW,CAAC;AAEzF,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;AA2oBhE,eAAO,MAAM,WAAW;oBACA,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;oBAKtB,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;mBAM1B,mBAAmB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;mBAU5C,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;iBAQ9B,qBAAqB;sBAIhB,IAAI;EAItB,CAAC;AAEH,eAAe,WAAW,CAAC"}
|
|
@@ -6,6 +6,7 @@ import { securityConfig } from '../config/security.js';
|
|
|
6
6
|
import { createRedisConnection } from '../config/workers.js';
|
|
7
7
|
import { ErrorFactory } from '../exceptions/ZintrustError.js';
|
|
8
8
|
import { useDatabase } from '../orm/Database.js';
|
|
9
|
+
import { shouldRetryAuthStoreInsertWithGeneratedId, withGeneratedAuthStoreId, } from './AuthStoreIds.js';
|
|
9
10
|
import { JwtManager } from './JwtManager.js';
|
|
10
11
|
const DEFAULTS = {
|
|
11
12
|
driver: 'database',
|
|
@@ -150,6 +151,26 @@ const createMemoryStore = () => {
|
|
|
150
151
|
},
|
|
151
152
|
};
|
|
152
153
|
};
|
|
154
|
+
const createActiveSessionRecord = (key) => {
|
|
155
|
+
return {
|
|
156
|
+
jti: key.id,
|
|
157
|
+
sub: key.sub ?? null,
|
|
158
|
+
user_id: key.sub ?? null,
|
|
159
|
+
expires_at_ms: key.expiresAtMs,
|
|
160
|
+
kind: 'active',
|
|
161
|
+
};
|
|
162
|
+
};
|
|
163
|
+
const insertActiveSessionRecord = async (db, table, record) => {
|
|
164
|
+
try {
|
|
165
|
+
await db.table(table).insert(record);
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
if (!shouldRetryAuthStoreInsertWithGeneratedId(error)) {
|
|
169
|
+
throw error;
|
|
170
|
+
}
|
|
171
|
+
await db.table(table).insert(withGeneratedAuthStoreId(record));
|
|
172
|
+
}
|
|
173
|
+
};
|
|
153
174
|
const createDatabaseStore = (params) => {
|
|
154
175
|
let checkCount = 0;
|
|
155
176
|
const maybeCleanup = async () => {
|
|
@@ -169,19 +190,12 @@ const createDatabaseStore = (params) => {
|
|
|
169
190
|
return {
|
|
170
191
|
async upsertActive(key) {
|
|
171
192
|
const db = useDatabase(undefined, params.connection);
|
|
172
|
-
|
|
173
|
-
const record = {
|
|
174
|
-
jti: key.id,
|
|
175
|
-
sub: key.sub ?? null,
|
|
176
|
-
user_id: key.sub ?? null,
|
|
177
|
-
expires_at_ms: key.expiresAtMs,
|
|
178
|
-
kind: 'active',
|
|
179
|
-
};
|
|
193
|
+
const record = createActiveSessionRecord(key);
|
|
180
194
|
try {
|
|
181
195
|
await db.table(params.table).where('jti', '=', key.id).update(record);
|
|
182
196
|
const existing = await db.table(params.table).where('jti', '=', key.id).first();
|
|
183
197
|
if (existing === null) {
|
|
184
|
-
await db
|
|
198
|
+
await insertActiveSessionRecord(db, params.table, record);
|
|
185
199
|
}
|
|
186
200
|
}
|
|
187
201
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokenRevocation.d.ts","sourceRoot":"","sources":["../../../src/security/TokenRevocation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TokenRevocation.d.ts","sourceRoot":"","sources":["../../../src/security/TokenRevocation.ts"],"names":[],"mappings":"AAcA,KAAK,mBAAmB,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;AAEzD,MAAM,MAAM,yBAAyB,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,IAAI,GAAG,WAAW,CAAC;AAqtB7F,eAAO,MAAM,eAAe;IAC1B;;;;OAIG;mBACkB,mBAAmB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAUjE;;OAEG;qBACoB,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMhD;;OAEG;iBACU,yBAAyB;IAItC;;OAEG;sBACe,IAAI;EAItB,CAAC;AAEH,eAAe,eAAe,CAAC"}
|
|
@@ -6,6 +6,7 @@ import { securityConfig } from '../config/security.js';
|
|
|
6
6
|
import { createRedisConnection } from '../config/workers.js';
|
|
7
7
|
import { ErrorFactory } from '../exceptions/ZintrustError.js';
|
|
8
8
|
import { useDatabase } from '../orm/Database.js';
|
|
9
|
+
import { shouldRetryAuthStoreInsertWithGeneratedId, withGeneratedAuthStoreId, } from './AuthStoreIds.js';
|
|
9
10
|
import { JwtManager } from './JwtManager.js';
|
|
10
11
|
const DEFAULTS = {
|
|
11
12
|
driver: 'database',
|
|
@@ -157,7 +158,15 @@ const createDatabaseStore = (params) => {
|
|
|
157
158
|
await db.table(params.table).where('jti', '=', key.id).update(payload);
|
|
158
159
|
}
|
|
159
160
|
else {
|
|
160
|
-
|
|
161
|
+
try {
|
|
162
|
+
await db.table(params.table).insert(payload);
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
if (!shouldRetryAuthStoreInsertWithGeneratedId(error)) {
|
|
166
|
+
throw error;
|
|
167
|
+
}
|
|
168
|
+
await db.table(params.table).insert(withGeneratedAuthStoreId(payload));
|
|
169
|
+
}
|
|
161
170
|
}
|
|
162
171
|
}
|
|
163
172
|
catch (error) {
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* side-effect imports (e.g. `@zintrust/db-sqlite/register`) that register
|
|
6
|
-
* optional adapters/drivers into core registries.
|
|
7
|
-
*
|
|
2
|
+
* Auto-generated fallback module.
|
|
3
|
+
* This file is created by scripts/ensure-worker-plugins.mjs when missing.
|
|
4
|
+
* It allows optional runtime plugin imports to resolve in CI/scaffolded setups.
|
|
8
5
|
*/
|
|
9
6
|
export type {};
|
|
10
7
|
export declare const __zintrustGeneratedPluginStub = "zintrust.plugins.ts";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zintrust.plugins.d.ts","sourceRoot":"","sources":["../../src/zintrust.plugins.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"zintrust.plugins.d.ts","sourceRoot":"","sources":["../../src/zintrust.plugins.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,YAAY,EAAE,CAAC;AAgBf,eAAO,MAAM,6BAA6B,wBAAwB,CAAC;;AACnE,wBAAkB"}
|
package/src/zintrust.plugins.js
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* side-effect imports (e.g. `@zintrust/db-sqlite/register`) that register
|
|
6
|
-
* optional adapters/drivers into core registries.
|
|
7
|
-
*
|
|
2
|
+
* Auto-generated fallback module.
|
|
3
|
+
* This file is created by scripts/ensure-worker-plugins.mjs when missing.
|
|
4
|
+
* It allows optional runtime plugin imports to resolve in CI/scaffolded setups.
|
|
8
5
|
*/
|
|
9
6
|
import * as TraceRuntime from './runtime/plugins/trace-runtime.js';
|
|
10
7
|
globalThis.__zintrust_system_trace_plugin_requested__ = true;
|