@getstrata/core 0.5.64 → 0.5.66
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/CHANGELOG.md +9 -0
- package/README.md +1 -1
- package/dist/core/http/signedUrl.d.ts +3 -1
- package/dist/core/runtime/appKeyPrefix.d.ts +7 -1
- package/dist/entries/audit/exportAuditLogs.js +30 -2
- package/dist/entries/audit/siemFormatter.js +30 -2
- package/dist/entries/auth/oauth/providers.js +29 -1
- package/dist/entries/auth/oauth/samlProvider.js +30 -2
- package/dist/entries/cache/createCacheStore.js +20 -0
- package/dist/entries/facades.js +29 -1
- package/dist/entries/http/loginThrottleMiddleware.js +20 -0
- package/dist/entries/http/memoryThrottleMiddleware.js +20 -0
- package/dist/entries/http/scimThrottleMiddleware.js +20 -0
- package/dist/entries/http/signedUrl.js +7 -0
- package/dist/entries/http/throttleMiddleware.js +20 -0
- package/dist/entries/jobs/dispatchWebhookJob.js +2 -1
- package/dist/entries/jobs/exportAuditLogsJob.js +30 -2
- package/dist/entries/mail/mailer.js +29 -1
- package/dist/entries/queue/createAppQueue.js +20 -0
- package/dist/entries/queue/publicQueue.js +20 -0
- package/dist/entries/queue/queueMetrics.js +20 -0
- package/dist/entries/queue/redisQueue.js +20 -0
- package/dist/entries/runtime/appKeyPrefix.js +38 -0
- package/dist/entries/tracing/tracingMiddleware.js +31 -1
- package/dist/framework/public-api.d.ts +1 -1
- package/dist/index.js +17 -2
- package/package.json +7 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# @getstrata/core changelog
|
|
2
2
|
|
|
3
|
+
## 0.5.66
|
|
4
|
+
|
|
5
|
+
- `createValidateSignatureMiddleware()` on `@getstrata/core/http/signedUrl` is Laravel’s `signed` / `ValidateSignature` middleware. Invalid or expired links throw `ForbiddenError`.
|
|
6
|
+
|
|
7
|
+
## 0.5.65
|
|
8
|
+
|
|
9
|
+
- Identity helpers on `@getstrata/core/runtime/appKeyPrefix` (`smtpEhloHost`, `siemEventType`, `appUserAgent`, `otelServiceName`, `appDisplayName`, `webhookSignatureHeader`) so sibling apps are not stuck with WorkHub SMTP/SIEM/OTEL/OAuth names.
|
|
10
|
+
- SIEM `event_type` and CEF vendor follow `SIEM_EVENT_TYPE` / `APP_NAME` (defaults stay `workhub.audit` / `WorkHub`).
|
|
11
|
+
|
|
3
12
|
## 0.5.64
|
|
4
13
|
|
|
5
14
|
- `APP_KEY_PREFIX` (default `workhub`) namespaces Redis cache, queue, and throttle keys so sibling apps do not share WorkHub’s keyspace.
|
package/README.md
CHANGED
|
@@ -82,7 +82,7 @@ import type { Migration } from "@getstrata/core/database/migrations/types";
|
|
|
82
82
|
Package name: **`@getstrata/core`** (npm org [`@getstrata`](https://www.npmjs.com/org/getstrata)).
|
|
83
83
|
|
|
84
84
|
1. Add `NPM_TOKEN` to GitHub repository secrets.
|
|
85
|
-
2. Tag a release: `git tag v0.5.
|
|
85
|
+
2. Tag a release: `git tag v0.5.68 && git push origin v0.5.68`
|
|
86
86
|
3. [Release workflow](../../.github/workflows/release.yml) builds and runs `npm publish --access public`.
|
|
87
87
|
|
|
88
88
|
Previously published as `@eyk-workhub/framework@0.1.0`, deprecated in favor of this package.
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Middleware } from "./middleware";
|
|
1
2
|
interface TemporarySignedUrlOptions {
|
|
2
3
|
expiresInSeconds?: number;
|
|
3
4
|
query?: Record<string, string | number>;
|
|
@@ -7,5 +8,6 @@ declare function temporarySignedUrl(path: string, expiresInSeconds: number, quer
|
|
|
7
8
|
declare function absoluteTemporarySignedUrl(path: string, expiresInSeconds: number, query?: Record<string, string | number>, origin?: string): string;
|
|
8
9
|
declare function hasValidSignature(input: Request | URL | string): boolean;
|
|
9
10
|
declare function assertValidSignature(input: Request | URL | string): void;
|
|
11
|
+
declare function createValidateSignatureMiddleware(): Middleware;
|
|
10
12
|
export type { TemporarySignedUrlOptions };
|
|
11
|
-
export { absoluteTemporarySignedUrl, assertValidSignature, hasValidSignature, signedUrl, temporarySignedUrl, };
|
|
13
|
+
export { absoluteTemporarySignedUrl, assertValidSignature, createValidateSignatureMiddleware, hasValidSignature, signedUrl, temporarySignedUrl, };
|
|
@@ -1,3 +1,9 @@
|
|
|
1
1
|
declare function appKeyPrefix(): string;
|
|
2
2
|
declare function namespacedRedisKey(kind: string): string;
|
|
3
|
-
|
|
3
|
+
declare function smtpEhloHost(): string;
|
|
4
|
+
declare function siemEventType(): string;
|
|
5
|
+
declare function appUserAgent(): string;
|
|
6
|
+
declare function otelServiceName(): string;
|
|
7
|
+
declare function webhookSignatureHeader(): string;
|
|
8
|
+
declare function appDisplayName(): string;
|
|
9
|
+
export { appDisplayName, appKeyPrefix, appUserAgent, namespacedRedisKey, otelServiceName, siemEventType, smtpEhloHost, webhookSignatureHeader, };
|
|
@@ -153,11 +153,39 @@ async function runWithMigrationBypass(callback) {
|
|
|
153
153
|
}
|
|
154
154
|
}
|
|
155
155
|
|
|
156
|
+
// ../../src/core/runtime/appKeyPrefix.ts
|
|
157
|
+
function appKeyPrefix() {
|
|
158
|
+
return process.env.APP_KEY_PREFIX?.trim() || "workhub";
|
|
159
|
+
}
|
|
160
|
+
function namespacedRedisKey(kind) {
|
|
161
|
+
return `${appKeyPrefix()}:${kind}`;
|
|
162
|
+
}
|
|
163
|
+
function smtpEhloHost() {
|
|
164
|
+
const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
|
|
165
|
+
const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
|
|
166
|
+
return safe || "strata.local";
|
|
167
|
+
}
|
|
168
|
+
function siemEventType() {
|
|
169
|
+
return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
|
|
170
|
+
}
|
|
171
|
+
function appUserAgent() {
|
|
172
|
+
return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
|
|
173
|
+
}
|
|
174
|
+
function otelServiceName() {
|
|
175
|
+
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
176
|
+
}
|
|
177
|
+
function webhookSignatureHeader() {
|
|
178
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
179
|
+
}
|
|
180
|
+
function appDisplayName() {
|
|
181
|
+
return process.env.APP_NAME?.trim() || "WorkHub";
|
|
182
|
+
}
|
|
183
|
+
|
|
156
184
|
// ../../src/core/audit/siemFormatter.ts
|
|
157
185
|
function formatSiemAuditEvent(input) {
|
|
158
186
|
return {
|
|
159
187
|
timestamp: input.created_at.toISOString(),
|
|
160
|
-
event_type:
|
|
188
|
+
event_type: siemEventType(),
|
|
161
189
|
actor_user_id: input.user_id,
|
|
162
190
|
tenant_id: input.tenant_id ?? null,
|
|
163
191
|
trace_id: input.trace_id ?? null,
|
|
@@ -183,7 +211,7 @@ function formatCefLine(event) {
|
|
|
183
211
|
`src=${event.ip_address ?? ""}`,
|
|
184
212
|
`request=${event.trace_id ?? ""}`
|
|
185
213
|
].join(" ");
|
|
186
|
-
return `CEF:0|
|
|
214
|
+
return `CEF:0|${appDisplayName()}|API|1.0|${event.action}|${event.subject_type}|5|${extension}`;
|
|
187
215
|
}
|
|
188
216
|
|
|
189
217
|
// ../../src/core/audit/exportAuditLogs.ts
|
|
@@ -1,9 +1,37 @@
|
|
|
1
1
|
// @bun
|
|
2
|
+
// ../../src/core/runtime/appKeyPrefix.ts
|
|
3
|
+
function appKeyPrefix() {
|
|
4
|
+
return process.env.APP_KEY_PREFIX?.trim() || "workhub";
|
|
5
|
+
}
|
|
6
|
+
function namespacedRedisKey(kind) {
|
|
7
|
+
return `${appKeyPrefix()}:${kind}`;
|
|
8
|
+
}
|
|
9
|
+
function smtpEhloHost() {
|
|
10
|
+
const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
|
|
11
|
+
const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
|
|
12
|
+
return safe || "strata.local";
|
|
13
|
+
}
|
|
14
|
+
function siemEventType() {
|
|
15
|
+
return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
|
|
16
|
+
}
|
|
17
|
+
function appUserAgent() {
|
|
18
|
+
return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
|
|
19
|
+
}
|
|
20
|
+
function otelServiceName() {
|
|
21
|
+
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
22
|
+
}
|
|
23
|
+
function webhookSignatureHeader() {
|
|
24
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
25
|
+
}
|
|
26
|
+
function appDisplayName() {
|
|
27
|
+
return process.env.APP_NAME?.trim() || "WorkHub";
|
|
28
|
+
}
|
|
29
|
+
|
|
2
30
|
// ../../src/core/audit/siemFormatter.ts
|
|
3
31
|
function formatSiemAuditEvent(input) {
|
|
4
32
|
return {
|
|
5
33
|
timestamp: input.created_at.toISOString(),
|
|
6
|
-
event_type:
|
|
34
|
+
event_type: siemEventType(),
|
|
7
35
|
actor_user_id: input.user_id,
|
|
8
36
|
tenant_id: input.tenant_id ?? null,
|
|
9
37
|
trace_id: input.trace_id ?? null,
|
|
@@ -29,7 +57,7 @@ function formatCefLine(event) {
|
|
|
29
57
|
`src=${event.ip_address ?? ""}`,
|
|
30
58
|
`request=${event.trace_id ?? ""}`
|
|
31
59
|
].join(" ");
|
|
32
|
-
return `CEF:0|
|
|
60
|
+
return `CEF:0|${appDisplayName()}|API|1.0|${event.action}|${event.subject_type}|5|${extension}`;
|
|
33
61
|
}
|
|
34
62
|
export {
|
|
35
63
|
formatCefLine,
|
|
@@ -1,4 +1,32 @@
|
|
|
1
1
|
// @bun
|
|
2
|
+
// ../../src/core/runtime/appKeyPrefix.ts
|
|
3
|
+
function appKeyPrefix() {
|
|
4
|
+
return process.env.APP_KEY_PREFIX?.trim() || "workhub";
|
|
5
|
+
}
|
|
6
|
+
function namespacedRedisKey(kind) {
|
|
7
|
+
return `${appKeyPrefix()}:${kind}`;
|
|
8
|
+
}
|
|
9
|
+
function smtpEhloHost() {
|
|
10
|
+
const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
|
|
11
|
+
const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
|
|
12
|
+
return safe || "strata.local";
|
|
13
|
+
}
|
|
14
|
+
function siemEventType() {
|
|
15
|
+
return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
|
|
16
|
+
}
|
|
17
|
+
function appUserAgent() {
|
|
18
|
+
return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
|
|
19
|
+
}
|
|
20
|
+
function otelServiceName() {
|
|
21
|
+
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
22
|
+
}
|
|
23
|
+
function webhookSignatureHeader() {
|
|
24
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
25
|
+
}
|
|
26
|
+
function appDisplayName() {
|
|
27
|
+
return process.env.APP_NAME?.trim() || "WorkHub";
|
|
28
|
+
}
|
|
29
|
+
|
|
2
30
|
// ../../src/core/auth/oauth/providers.ts
|
|
3
31
|
class GitHubOAuthProvider {
|
|
4
32
|
options;
|
|
@@ -37,7 +65,7 @@ class GitHubOAuthProvider {
|
|
|
37
65
|
headers: {
|
|
38
66
|
authorization: `Bearer ${tokenBody.access_token}`,
|
|
39
67
|
accept: "application/json",
|
|
40
|
-
"user-agent":
|
|
68
|
+
"user-agent": appUserAgent()
|
|
41
69
|
}
|
|
42
70
|
});
|
|
43
71
|
const profile = await profileResponse.json();
|
|
@@ -1,4 +1,32 @@
|
|
|
1
1
|
// @bun
|
|
2
|
+
// ../../src/core/runtime/appKeyPrefix.ts
|
|
3
|
+
function appKeyPrefix() {
|
|
4
|
+
return process.env.APP_KEY_PREFIX?.trim() || "workhub";
|
|
5
|
+
}
|
|
6
|
+
function namespacedRedisKey(kind) {
|
|
7
|
+
return `${appKeyPrefix()}:${kind}`;
|
|
8
|
+
}
|
|
9
|
+
function smtpEhloHost() {
|
|
10
|
+
const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
|
|
11
|
+
const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
|
|
12
|
+
return safe || "strata.local";
|
|
13
|
+
}
|
|
14
|
+
function siemEventType() {
|
|
15
|
+
return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
|
|
16
|
+
}
|
|
17
|
+
function appUserAgent() {
|
|
18
|
+
return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
|
|
19
|
+
}
|
|
20
|
+
function otelServiceName() {
|
|
21
|
+
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
22
|
+
}
|
|
23
|
+
function webhookSignatureHeader() {
|
|
24
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
25
|
+
}
|
|
26
|
+
function appDisplayName() {
|
|
27
|
+
return process.env.APP_NAME?.trim() || "WorkHub";
|
|
28
|
+
}
|
|
29
|
+
|
|
2
30
|
// ../../src/core/auth/oauth/samlProvider.ts
|
|
3
31
|
class SamlProvider {
|
|
4
32
|
loginUrl;
|
|
@@ -15,8 +43,8 @@ class SamlProvider {
|
|
|
15
43
|
}
|
|
16
44
|
const [, email, name] = code.split(":");
|
|
17
45
|
return {
|
|
18
|
-
providerUserId: email
|
|
19
|
-
email: email
|
|
46
|
+
providerUserId: email || "saml-user",
|
|
47
|
+
email: email || `saml-user@${appKeyPrefix()}.test`,
|
|
20
48
|
name: name ?? "SAML User"
|
|
21
49
|
};
|
|
22
50
|
}
|
|
@@ -9,6 +9,26 @@ function appKeyPrefix() {
|
|
|
9
9
|
function namespacedRedisKey(kind) {
|
|
10
10
|
return `${appKeyPrefix()}:${kind}`;
|
|
11
11
|
}
|
|
12
|
+
function smtpEhloHost() {
|
|
13
|
+
const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
|
|
14
|
+
const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
|
|
15
|
+
return safe || "strata.local";
|
|
16
|
+
}
|
|
17
|
+
function siemEventType() {
|
|
18
|
+
return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
|
|
19
|
+
}
|
|
20
|
+
function appUserAgent() {
|
|
21
|
+
return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
|
|
22
|
+
}
|
|
23
|
+
function otelServiceName() {
|
|
24
|
+
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
25
|
+
}
|
|
26
|
+
function webhookSignatureHeader() {
|
|
27
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
28
|
+
}
|
|
29
|
+
function appDisplayName() {
|
|
30
|
+
return process.env.APP_NAME?.trim() || "WorkHub";
|
|
31
|
+
}
|
|
12
32
|
|
|
13
33
|
// ../../src/core/cache/redisCacheStore.ts
|
|
14
34
|
function cacheKeyPrefix() {
|
package/dist/entries/facades.js
CHANGED
|
@@ -11,6 +11,34 @@ import {
|
|
|
11
11
|
resolveApplicationQueue
|
|
12
12
|
} from "@getstrata/core/runtime/applicationRegistry";
|
|
13
13
|
|
|
14
|
+
// ../../src/core/runtime/appKeyPrefix.ts
|
|
15
|
+
function appKeyPrefix() {
|
|
16
|
+
return process.env.APP_KEY_PREFIX?.trim() || "workhub";
|
|
17
|
+
}
|
|
18
|
+
function namespacedRedisKey(kind) {
|
|
19
|
+
return `${appKeyPrefix()}:${kind}`;
|
|
20
|
+
}
|
|
21
|
+
function smtpEhloHost() {
|
|
22
|
+
const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
|
|
23
|
+
const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
|
|
24
|
+
return safe || "strata.local";
|
|
25
|
+
}
|
|
26
|
+
function siemEventType() {
|
|
27
|
+
return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
|
|
28
|
+
}
|
|
29
|
+
function appUserAgent() {
|
|
30
|
+
return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
|
|
31
|
+
}
|
|
32
|
+
function otelServiceName() {
|
|
33
|
+
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
34
|
+
}
|
|
35
|
+
function webhookSignatureHeader() {
|
|
36
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
37
|
+
}
|
|
38
|
+
function appDisplayName() {
|
|
39
|
+
return process.env.APP_NAME?.trim() || "WorkHub";
|
|
40
|
+
}
|
|
41
|
+
|
|
14
42
|
// ../../src/core/mail/mailer.ts
|
|
15
43
|
function resolveSmtpConfig() {
|
|
16
44
|
const host = process.env.MAIL_HOST?.trim();
|
|
@@ -101,7 +129,7 @@ async function defaultSmtpTransport(config, message) {
|
|
|
101
129
|
const { socket, readResponse } = await openSmtpConnection(config);
|
|
102
130
|
try {
|
|
103
131
|
await waitForSmtpResponse(readResponse, ["220"]);
|
|
104
|
-
await socket.write(`EHLO
|
|
132
|
+
await socket.write(`EHLO ${smtpEhloHost()}\r
|
|
105
133
|
`);
|
|
106
134
|
await waitForSmtpResponse(readResponse, ["250"]);
|
|
107
135
|
if (config.username && config.password) {
|
|
@@ -9,6 +9,26 @@ function appKeyPrefix() {
|
|
|
9
9
|
function namespacedRedisKey(kind) {
|
|
10
10
|
return `${appKeyPrefix()}:${kind}`;
|
|
11
11
|
}
|
|
12
|
+
function smtpEhloHost() {
|
|
13
|
+
const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
|
|
14
|
+
const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
|
|
15
|
+
return safe || "strata.local";
|
|
16
|
+
}
|
|
17
|
+
function siemEventType() {
|
|
18
|
+
return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
|
|
19
|
+
}
|
|
20
|
+
function appUserAgent() {
|
|
21
|
+
return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
|
|
22
|
+
}
|
|
23
|
+
function otelServiceName() {
|
|
24
|
+
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
25
|
+
}
|
|
26
|
+
function webhookSignatureHeader() {
|
|
27
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
28
|
+
}
|
|
29
|
+
function appDisplayName() {
|
|
30
|
+
return process.env.APP_NAME?.trim() || "WorkHub";
|
|
31
|
+
}
|
|
12
32
|
|
|
13
33
|
// ../../src/core/http/clientIp.ts
|
|
14
34
|
function trustForwardedFor(env = process.env) {
|
|
@@ -6,6 +6,26 @@ function appKeyPrefix() {
|
|
|
6
6
|
function namespacedRedisKey(kind) {
|
|
7
7
|
return `${appKeyPrefix()}:${kind}`;
|
|
8
8
|
}
|
|
9
|
+
function smtpEhloHost() {
|
|
10
|
+
const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
|
|
11
|
+
const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
|
|
12
|
+
return safe || "strata.local";
|
|
13
|
+
}
|
|
14
|
+
function siemEventType() {
|
|
15
|
+
return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
|
|
16
|
+
}
|
|
17
|
+
function appUserAgent() {
|
|
18
|
+
return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
|
|
19
|
+
}
|
|
20
|
+
function otelServiceName() {
|
|
21
|
+
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
22
|
+
}
|
|
23
|
+
function webhookSignatureHeader() {
|
|
24
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
25
|
+
}
|
|
26
|
+
function appDisplayName() {
|
|
27
|
+
return process.env.APP_NAME?.trim() || "WorkHub";
|
|
28
|
+
}
|
|
9
29
|
|
|
10
30
|
// ../../src/core/http/clientIp.ts
|
|
11
31
|
function trustForwardedFor(env = process.env) {
|
|
@@ -9,6 +9,26 @@ function appKeyPrefix() {
|
|
|
9
9
|
function namespacedRedisKey(kind) {
|
|
10
10
|
return `${appKeyPrefix()}:${kind}`;
|
|
11
11
|
}
|
|
12
|
+
function smtpEhloHost() {
|
|
13
|
+
const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
|
|
14
|
+
const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
|
|
15
|
+
return safe || "strata.local";
|
|
16
|
+
}
|
|
17
|
+
function siemEventType() {
|
|
18
|
+
return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
|
|
19
|
+
}
|
|
20
|
+
function appUserAgent() {
|
|
21
|
+
return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
|
|
22
|
+
}
|
|
23
|
+
function otelServiceName() {
|
|
24
|
+
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
25
|
+
}
|
|
26
|
+
function webhookSignatureHeader() {
|
|
27
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
28
|
+
}
|
|
29
|
+
function appDisplayName() {
|
|
30
|
+
return process.env.APP_NAME?.trim() || "WorkHub";
|
|
31
|
+
}
|
|
12
32
|
|
|
13
33
|
// ../../src/core/http/clientIp.ts
|
|
14
34
|
function trustForwardedFor(env = process.env) {
|
|
@@ -88,9 +88,16 @@ function assertValidSignature(input) {
|
|
|
88
88
|
throw new ForbiddenError("Invalid or expired signed URL.");
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
|
+
function createValidateSignatureMiddleware() {
|
|
92
|
+
return async (request, next) => {
|
|
93
|
+
assertValidSignature(request);
|
|
94
|
+
return await next();
|
|
95
|
+
};
|
|
96
|
+
}
|
|
91
97
|
export {
|
|
92
98
|
absoluteTemporarySignedUrl,
|
|
93
99
|
assertValidSignature,
|
|
100
|
+
createValidateSignatureMiddleware,
|
|
94
101
|
hasValidSignature,
|
|
95
102
|
signedUrl,
|
|
96
103
|
temporarySignedUrl
|
|
@@ -11,6 +11,26 @@ function appKeyPrefix() {
|
|
|
11
11
|
function namespacedRedisKey(kind) {
|
|
12
12
|
return `${appKeyPrefix()}:${kind}`;
|
|
13
13
|
}
|
|
14
|
+
function smtpEhloHost() {
|
|
15
|
+
const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
|
|
16
|
+
const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
|
|
17
|
+
return safe || "strata.local";
|
|
18
|
+
}
|
|
19
|
+
function siemEventType() {
|
|
20
|
+
return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
|
|
21
|
+
}
|
|
22
|
+
function appUserAgent() {
|
|
23
|
+
return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
|
|
24
|
+
}
|
|
25
|
+
function otelServiceName() {
|
|
26
|
+
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
27
|
+
}
|
|
28
|
+
function webhookSignatureHeader() {
|
|
29
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
30
|
+
}
|
|
31
|
+
function appDisplayName() {
|
|
32
|
+
return process.env.APP_NAME?.trim() || "WorkHub";
|
|
33
|
+
}
|
|
14
34
|
|
|
15
35
|
// ../../src/core/http/clientIp.ts
|
|
16
36
|
function trustForwardedFor(env = process.env) {
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
import { createHmac } from "crypto";
|
|
4
4
|
import { repositoryConnection as db } from "@getstrata/core/database/repositoryConnection";
|
|
5
5
|
import { Job } from "@getstrata/core/queue";
|
|
6
|
+
import { webhookSignatureHeader } from "@getstrata/core/runtime/appKeyPrefix";
|
|
6
7
|
import { safeFetch } from "@getstrata/core/security/safeFetch";
|
|
7
8
|
import { assertSafeOutboundUrl } from "@getstrata/core/security/safeUrl";
|
|
8
9
|
import { resolveTenant } from "@getstrata/core/tenant/resolveTenant";
|
|
@@ -37,7 +38,7 @@ class DispatchWebhookJob extends Job {
|
|
|
37
38
|
const body = JSON.stringify({ event: payload.event, payload: payload.payload });
|
|
38
39
|
const signature = createHmac("sha256", webhook.secret).update(body).digest("hex");
|
|
39
40
|
const allowHttp = (process.env.APP_ENV ?? "local") !== "production";
|
|
40
|
-
const signatureHeader =
|
|
41
|
+
const signatureHeader = webhookSignatureHeader();
|
|
41
42
|
assertSafeOutboundUrl(webhook.url, { allowHttp });
|
|
42
43
|
let responseStatus = null;
|
|
43
44
|
let errorMessage = null;
|
|
@@ -153,11 +153,39 @@ async function runWithMigrationBypass(callback) {
|
|
|
153
153
|
}
|
|
154
154
|
}
|
|
155
155
|
|
|
156
|
+
// ../../src/core/runtime/appKeyPrefix.ts
|
|
157
|
+
function appKeyPrefix() {
|
|
158
|
+
return process.env.APP_KEY_PREFIX?.trim() || "workhub";
|
|
159
|
+
}
|
|
160
|
+
function namespacedRedisKey(kind) {
|
|
161
|
+
return `${appKeyPrefix()}:${kind}`;
|
|
162
|
+
}
|
|
163
|
+
function smtpEhloHost() {
|
|
164
|
+
const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
|
|
165
|
+
const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
|
|
166
|
+
return safe || "strata.local";
|
|
167
|
+
}
|
|
168
|
+
function siemEventType() {
|
|
169
|
+
return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
|
|
170
|
+
}
|
|
171
|
+
function appUserAgent() {
|
|
172
|
+
return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
|
|
173
|
+
}
|
|
174
|
+
function otelServiceName() {
|
|
175
|
+
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
176
|
+
}
|
|
177
|
+
function webhookSignatureHeader() {
|
|
178
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
179
|
+
}
|
|
180
|
+
function appDisplayName() {
|
|
181
|
+
return process.env.APP_NAME?.trim() || "WorkHub";
|
|
182
|
+
}
|
|
183
|
+
|
|
156
184
|
// ../../src/core/audit/siemFormatter.ts
|
|
157
185
|
function formatSiemAuditEvent(input) {
|
|
158
186
|
return {
|
|
159
187
|
timestamp: input.created_at.toISOString(),
|
|
160
|
-
event_type:
|
|
188
|
+
event_type: siemEventType(),
|
|
161
189
|
actor_user_id: input.user_id,
|
|
162
190
|
tenant_id: input.tenant_id ?? null,
|
|
163
191
|
trace_id: input.trace_id ?? null,
|
|
@@ -183,7 +211,7 @@ function formatCefLine(event) {
|
|
|
183
211
|
`src=${event.ip_address ?? ""}`,
|
|
184
212
|
`request=${event.trace_id ?? ""}`
|
|
185
213
|
].join(" ");
|
|
186
|
-
return `CEF:0|
|
|
214
|
+
return `CEF:0|${appDisplayName()}|API|1.0|${event.action}|${event.subject_type}|5|${extension}`;
|
|
187
215
|
}
|
|
188
216
|
|
|
189
217
|
// ../../src/core/audit/exportAuditLogs.ts
|
|
@@ -1,4 +1,32 @@
|
|
|
1
1
|
// @bun
|
|
2
|
+
// ../../src/core/runtime/appKeyPrefix.ts
|
|
3
|
+
function appKeyPrefix() {
|
|
4
|
+
return process.env.APP_KEY_PREFIX?.trim() || "workhub";
|
|
5
|
+
}
|
|
6
|
+
function namespacedRedisKey(kind) {
|
|
7
|
+
return `${appKeyPrefix()}:${kind}`;
|
|
8
|
+
}
|
|
9
|
+
function smtpEhloHost() {
|
|
10
|
+
const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
|
|
11
|
+
const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
|
|
12
|
+
return safe || "strata.local";
|
|
13
|
+
}
|
|
14
|
+
function siemEventType() {
|
|
15
|
+
return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
|
|
16
|
+
}
|
|
17
|
+
function appUserAgent() {
|
|
18
|
+
return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
|
|
19
|
+
}
|
|
20
|
+
function otelServiceName() {
|
|
21
|
+
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
22
|
+
}
|
|
23
|
+
function webhookSignatureHeader() {
|
|
24
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
25
|
+
}
|
|
26
|
+
function appDisplayName() {
|
|
27
|
+
return process.env.APP_NAME?.trim() || "WorkHub";
|
|
28
|
+
}
|
|
29
|
+
|
|
2
30
|
// ../../src/core/mail/mailer.ts
|
|
3
31
|
function resolveSmtpConfig() {
|
|
4
32
|
const host = process.env.MAIL_HOST?.trim();
|
|
@@ -89,7 +117,7 @@ async function defaultSmtpTransport(config, message) {
|
|
|
89
117
|
const { socket, readResponse } = await openSmtpConnection(config);
|
|
90
118
|
try {
|
|
91
119
|
await waitForSmtpResponse(readResponse, ["220"]);
|
|
92
|
-
await socket.write(`EHLO
|
|
120
|
+
await socket.write(`EHLO ${smtpEhloHost()}\r
|
|
93
121
|
`);
|
|
94
122
|
await waitForSmtpResponse(readResponse, ["250"]);
|
|
95
123
|
if (config.username && config.password) {
|
|
@@ -161,6 +161,26 @@ function appKeyPrefix() {
|
|
|
161
161
|
function namespacedRedisKey(kind) {
|
|
162
162
|
return `${appKeyPrefix()}:${kind}`;
|
|
163
163
|
}
|
|
164
|
+
function smtpEhloHost() {
|
|
165
|
+
const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
|
|
166
|
+
const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
|
|
167
|
+
return safe || "strata.local";
|
|
168
|
+
}
|
|
169
|
+
function siemEventType() {
|
|
170
|
+
return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
|
|
171
|
+
}
|
|
172
|
+
function appUserAgent() {
|
|
173
|
+
return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
|
|
174
|
+
}
|
|
175
|
+
function otelServiceName() {
|
|
176
|
+
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
177
|
+
}
|
|
178
|
+
function webhookSignatureHeader() {
|
|
179
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
180
|
+
}
|
|
181
|
+
function appDisplayName() {
|
|
182
|
+
return process.env.APP_NAME?.trim() || "WorkHub";
|
|
183
|
+
}
|
|
164
184
|
|
|
165
185
|
// ../../src/core/queue/redisQueue.ts
|
|
166
186
|
function queueListKey() {
|
|
@@ -161,6 +161,26 @@ function appKeyPrefix() {
|
|
|
161
161
|
function namespacedRedisKey(kind) {
|
|
162
162
|
return `${appKeyPrefix()}:${kind}`;
|
|
163
163
|
}
|
|
164
|
+
function smtpEhloHost() {
|
|
165
|
+
const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
|
|
166
|
+
const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
|
|
167
|
+
return safe || "strata.local";
|
|
168
|
+
}
|
|
169
|
+
function siemEventType() {
|
|
170
|
+
return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
|
|
171
|
+
}
|
|
172
|
+
function appUserAgent() {
|
|
173
|
+
return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
|
|
174
|
+
}
|
|
175
|
+
function otelServiceName() {
|
|
176
|
+
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
177
|
+
}
|
|
178
|
+
function webhookSignatureHeader() {
|
|
179
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
180
|
+
}
|
|
181
|
+
function appDisplayName() {
|
|
182
|
+
return process.env.APP_NAME?.trim() || "WorkHub";
|
|
183
|
+
}
|
|
164
184
|
|
|
165
185
|
// ../../src/core/queue/redisQueue.ts
|
|
166
186
|
function queueListKey() {
|
|
@@ -164,6 +164,26 @@ function appKeyPrefix() {
|
|
|
164
164
|
function namespacedRedisKey(kind) {
|
|
165
165
|
return `${appKeyPrefix()}:${kind}`;
|
|
166
166
|
}
|
|
167
|
+
function smtpEhloHost() {
|
|
168
|
+
const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
|
|
169
|
+
const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
|
|
170
|
+
return safe || "strata.local";
|
|
171
|
+
}
|
|
172
|
+
function siemEventType() {
|
|
173
|
+
return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
|
|
174
|
+
}
|
|
175
|
+
function appUserAgent() {
|
|
176
|
+
return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
|
|
177
|
+
}
|
|
178
|
+
function otelServiceName() {
|
|
179
|
+
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
180
|
+
}
|
|
181
|
+
function webhookSignatureHeader() {
|
|
182
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
183
|
+
}
|
|
184
|
+
function appDisplayName() {
|
|
185
|
+
return process.env.APP_NAME?.trim() || "WorkHub";
|
|
186
|
+
}
|
|
167
187
|
|
|
168
188
|
// ../../src/core/queue/redisQueue.ts
|
|
169
189
|
function queueListKey() {
|
|
@@ -9,6 +9,26 @@ function appKeyPrefix() {
|
|
|
9
9
|
function namespacedRedisKey(kind) {
|
|
10
10
|
return `${appKeyPrefix()}:${kind}`;
|
|
11
11
|
}
|
|
12
|
+
function smtpEhloHost() {
|
|
13
|
+
const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
|
|
14
|
+
const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
|
|
15
|
+
return safe || "strata.local";
|
|
16
|
+
}
|
|
17
|
+
function siemEventType() {
|
|
18
|
+
return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
|
|
19
|
+
}
|
|
20
|
+
function appUserAgent() {
|
|
21
|
+
return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
|
|
22
|
+
}
|
|
23
|
+
function otelServiceName() {
|
|
24
|
+
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
25
|
+
}
|
|
26
|
+
function webhookSignatureHeader() {
|
|
27
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
28
|
+
}
|
|
29
|
+
function appDisplayName() {
|
|
30
|
+
return process.env.APP_NAME?.trim() || "WorkHub";
|
|
31
|
+
}
|
|
12
32
|
|
|
13
33
|
// ../../src/core/queue/jobRegistry.ts
|
|
14
34
|
class JobRegistry {
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// ../../src/core/runtime/appKeyPrefix.ts
|
|
3
|
+
function appKeyPrefix() {
|
|
4
|
+
return process.env.APP_KEY_PREFIX?.trim() || "workhub";
|
|
5
|
+
}
|
|
6
|
+
function namespacedRedisKey(kind) {
|
|
7
|
+
return `${appKeyPrefix()}:${kind}`;
|
|
8
|
+
}
|
|
9
|
+
function smtpEhloHost() {
|
|
10
|
+
const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
|
|
11
|
+
const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
|
|
12
|
+
return safe || "strata.local";
|
|
13
|
+
}
|
|
14
|
+
function siemEventType() {
|
|
15
|
+
return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
|
|
16
|
+
}
|
|
17
|
+
function appUserAgent() {
|
|
18
|
+
return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
|
|
19
|
+
}
|
|
20
|
+
function otelServiceName() {
|
|
21
|
+
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
22
|
+
}
|
|
23
|
+
function webhookSignatureHeader() {
|
|
24
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
25
|
+
}
|
|
26
|
+
function appDisplayName() {
|
|
27
|
+
return process.env.APP_NAME?.trim() || "WorkHub";
|
|
28
|
+
}
|
|
29
|
+
export {
|
|
30
|
+
appDisplayName,
|
|
31
|
+
appKeyPrefix,
|
|
32
|
+
appUserAgent,
|
|
33
|
+
namespacedRedisKey,
|
|
34
|
+
otelServiceName,
|
|
35
|
+
siemEventType,
|
|
36
|
+
smtpEhloHost,
|
|
37
|
+
webhookSignatureHeader
|
|
38
|
+
};
|
|
@@ -1,6 +1,36 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
// ../../src/core/tracing/otel.ts
|
|
3
3
|
import { randomBytes } from "crypto";
|
|
4
|
+
|
|
5
|
+
// ../../src/core/runtime/appKeyPrefix.ts
|
|
6
|
+
function appKeyPrefix() {
|
|
7
|
+
return process.env.APP_KEY_PREFIX?.trim() || "workhub";
|
|
8
|
+
}
|
|
9
|
+
function namespacedRedisKey(kind) {
|
|
10
|
+
return `${appKeyPrefix()}:${kind}`;
|
|
11
|
+
}
|
|
12
|
+
function smtpEhloHost() {
|
|
13
|
+
const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
|
|
14
|
+
const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
|
|
15
|
+
return safe || "strata.local";
|
|
16
|
+
}
|
|
17
|
+
function siemEventType() {
|
|
18
|
+
return process.env.SIEM_EVENT_TYPE?.trim() || `${appKeyPrefix()}.audit`;
|
|
19
|
+
}
|
|
20
|
+
function appUserAgent() {
|
|
21
|
+
return process.env.APP_USER_AGENT?.trim() || appKeyPrefix();
|
|
22
|
+
}
|
|
23
|
+
function otelServiceName() {
|
|
24
|
+
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
25
|
+
}
|
|
26
|
+
function webhookSignatureHeader() {
|
|
27
|
+
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
28
|
+
}
|
|
29
|
+
function appDisplayName() {
|
|
30
|
+
return process.env.APP_NAME?.trim() || "WorkHub";
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// ../../src/core/tracing/otel.ts
|
|
4
34
|
function randomHex(bytes) {
|
|
5
35
|
return randomBytes(bytes).toString("hex");
|
|
6
36
|
}
|
|
@@ -24,7 +54,7 @@ async function exportOtelSpan(span) {
|
|
|
24
54
|
if (!endpoint) {
|
|
25
55
|
return;
|
|
26
56
|
}
|
|
27
|
-
const serviceName =
|
|
57
|
+
const serviceName = otelServiceName();
|
|
28
58
|
const url = endpoint.endsWith("/v1/traces") ? endpoint : `${endpoint.replace(/\/$/, "")}/v1/traces`;
|
|
29
59
|
await fetch(url, {
|
|
30
60
|
method: "POST",
|
|
@@ -83,7 +83,7 @@ export type { RouteRequest } from "../core/http/route.ts";
|
|
|
83
83
|
export { loginRedirectLocation, safeInternalRedirectPath, sanitizeInternalPath, } from "../core/http/safeInternalPath.ts";
|
|
84
84
|
export { createScimThrottleMiddleware } from "../core/http/scimThrottleMiddleware.ts";
|
|
85
85
|
export { createSecurityHeadersMiddleware } from "../core/http/securityHeadersMiddleware.ts";
|
|
86
|
-
export { absoluteTemporarySignedUrl, assertValidSignature, hasValidSignature, signedUrl, temporarySignedUrl, } from "../core/http/signedUrl.ts";
|
|
86
|
+
export { absoluteTemporarySignedUrl, assertValidSignature, createValidateSignatureMiddleware, hasValidSignature, signedUrl, temporarySignedUrl, } from "../core/http/signedUrl.ts";
|
|
87
87
|
export { createThrottleMiddleware } from "../core/http/throttleMiddleware.ts";
|
|
88
88
|
export { WebFormRequest } from "../core/http/webFormRequest.ts";
|
|
89
89
|
export { installGracefulShutdownSignals, registerShutdownHandler, runGracefulShutdown, } from "../core/lifecycle/gracefulShutdown.ts";
|
package/dist/index.js
CHANGED
|
@@ -974,6 +974,14 @@ function appKeyPrefix() {
|
|
|
974
974
|
function namespacedRedisKey(kind) {
|
|
975
975
|
return `${appKeyPrefix()}:${kind}`;
|
|
976
976
|
}
|
|
977
|
+
function smtpEhloHost() {
|
|
978
|
+
const raw = process.env.MAIL_EHLO?.trim() || `${appKeyPrefix()}.local`;
|
|
979
|
+
const safe = raw.replace(/[^a-zA-Z0-9.-]/g, "");
|
|
980
|
+
return safe || "strata.local";
|
|
981
|
+
}
|
|
982
|
+
function otelServiceName() {
|
|
983
|
+
return process.env.OTEL_SERVICE_NAME?.trim() || `${appKeyPrefix()}-api`;
|
|
984
|
+
}
|
|
977
985
|
|
|
978
986
|
// ../../src/core/cache/redisCacheStore.ts
|
|
979
987
|
function cacheKeyPrefix() {
|
|
@@ -3894,7 +3902,7 @@ async function defaultSmtpTransport(config, message) {
|
|
|
3894
3902
|
const { socket, readResponse } = await openSmtpConnection(config);
|
|
3895
3903
|
try {
|
|
3896
3904
|
await waitForSmtpResponse(readResponse, ["220"]);
|
|
3897
|
-
await socket.write(`EHLO
|
|
3905
|
+
await socket.write(`EHLO ${smtpEhloHost()}\r
|
|
3898
3906
|
`);
|
|
3899
3907
|
await waitForSmtpResponse(readResponse, ["250"]);
|
|
3900
3908
|
if (config.username && config.password) {
|
|
@@ -5782,6 +5790,12 @@ function assertValidSignature(input) {
|
|
|
5782
5790
|
throw new ForbiddenError("Invalid or expired signed URL.");
|
|
5783
5791
|
}
|
|
5784
5792
|
}
|
|
5793
|
+
function createValidateSignatureMiddleware() {
|
|
5794
|
+
return async (request, next) => {
|
|
5795
|
+
assertValidSignature(request);
|
|
5796
|
+
return await next();
|
|
5797
|
+
};
|
|
5798
|
+
}
|
|
5785
5799
|
// ../../src/core/http/throttleMiddleware.ts
|
|
5786
5800
|
var {RedisClient: RedisClient4 } = globalThis.Bun;
|
|
5787
5801
|
function resolveThrottleIdentity(request) {
|
|
@@ -6693,7 +6707,7 @@ async function exportOtelSpan(span) {
|
|
|
6693
6707
|
if (!endpoint) {
|
|
6694
6708
|
return;
|
|
6695
6709
|
}
|
|
6696
|
-
const serviceName =
|
|
6710
|
+
const serviceName = otelServiceName();
|
|
6697
6711
|
const url = endpoint.endsWith("/v1/traces") ? endpoint : `${endpoint.replace(/\/$/, "")}/v1/traces`;
|
|
6698
6712
|
await fetch(url, {
|
|
6699
6713
|
method: "POST",
|
|
@@ -7215,6 +7229,7 @@ export {
|
|
|
7215
7229
|
createThrottleMiddleware,
|
|
7216
7230
|
createTracingMiddleware,
|
|
7217
7231
|
createTrackedJob,
|
|
7232
|
+
createValidateSignatureMiddleware,
|
|
7218
7233
|
createdResponse,
|
|
7219
7234
|
currentAuthUser,
|
|
7220
7235
|
currentOrgRole,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@getstrata/core",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.66",
|
|
4
4
|
"description": "Strata — Laravel-inspired Bun framework public API",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -665,6 +665,11 @@
|
|
|
665
665
|
"import": "./dist/entries/queue/types.js",
|
|
666
666
|
"default": "./dist/entries/queue/types.js"
|
|
667
667
|
},
|
|
668
|
+
"./runtime/appKeyPrefix": {
|
|
669
|
+
"types": "./dist/core/runtime/appKeyPrefix.d.ts",
|
|
670
|
+
"import": "./dist/entries/runtime/appKeyPrefix.js",
|
|
671
|
+
"default": "./dist/entries/runtime/appKeyPrefix.js"
|
|
672
|
+
},
|
|
668
673
|
"./runtime/applicationRegistry": {
|
|
669
674
|
"types": "./dist/core/runtime/applicationRegistry.d.ts",
|
|
670
675
|
"import": "./dist/entries/runtime/applicationRegistry.js",
|
|
@@ -803,7 +808,7 @@
|
|
|
803
808
|
"build:bundle": "bun build index.ts --outdir dist --target bun --external bun --external eta",
|
|
804
809
|
"build:types": "tsc -p tsconfig.types.json",
|
|
805
810
|
"prepublishOnly": "bun run build && bun ../../scripts/prepare-core-package-publish.ts",
|
|
806
|
-
"build:subpaths": "bun build entries/auth/accessControl.ts entries/auth/abilityChecker.ts entries/auth/membershipMiddleware.ts entries/auth/membershipScope.ts entries/auth/membershipService.ts entries/auth/oauth/oidcProvider.ts entries/auth/oauth/providers.ts entries/auth/oauth/samlProvider.ts entries/auth/oauth/types.ts entries/auth/password.ts entries/auth/policy.ts entries/auth/scimAuthMiddleware.ts entries/auth/sessionCookie.ts entries/auth/sessionGuard.ts entries/auth/tokenHash.ts entries/audit/exportAuditLogs.ts entries/audit/siemFormatter.ts entries/admin/formatValue.ts entries/admin/registry.ts entries/admin/types.ts entries/cache/tags.ts entries/cache/createCacheStore.ts entries/cache/repository.ts entries/cache/simpleCache.ts entries/cache/simpleCacheStore.ts entries/config/envSchema.ts entries/contracts/serviceTokens.ts entries/contracts/container.ts entries/contracts/di.ts entries/crypto/fieldEncryption.ts entries/crypto/mfaSecret.ts entries/database/errors.ts entries/database/factory.ts entries/database/migrations.ts entries/database/migrations/types.ts entries/database/model.ts entries/database/query.ts entries/database/relationships.ts entries/database/repositoryQuery.ts entries/database/seeders.ts entries/database/seeders/types.ts entries/database/schema.ts entries/database/table.ts entries/database/types.ts entries/database/whereBuilder.ts entries/facades.ts entries/http/authMiddleware.ts entries/http/authorizeMiddleware.ts entries/http/bodySizeLimitMiddleware.ts entries/http/clientIp.ts entries/http/cookies.ts entries/http/contentNegotiation.ts entries/http/conditionalResponse.ts entries/http/corsMiddleware.ts entries/http/csrfMiddleware.ts entries/http/csrfProtection.ts entries/http/csrfToken.ts entries/http/etag.ts entries/http/flashSession.ts entries/http/flashMiddleware.ts entries/http/formRequest.ts entries/http/metricsMiddleware.ts entries/http/loginThrottleMiddleware.ts entries/http/memoryThrottleMiddleware.ts entries/http/pagination.ts entries/http/parseFormBody.ts entries/http/parseMultipartUpload.ts entries/http/requireAbilityMiddleware.ts entries/http/requireAuthMiddleware.ts entries/http/requireGlobalAdminMiddleware.ts entries/http/requireWebAuthMiddleware.ts entries/http/resources.ts entries/http/response.ts entries/http/route.ts entries/http/routeMiddleware.ts entries/http/routeModelBinding.ts entries/http/safeInternalPath.ts entries/http/signedUrl.ts entries/http/scimThrottleMiddleware.ts entries/http/securityHeadersMiddleware.ts entries/http/securedRouteModelBinding.ts entries/http/webErrorResponse.ts entries/http/webFormRequest.ts entries/http/throttleMiddleware.ts entries/http/validation.ts entries/jobs/dispatchWebhookJob.ts entries/jobs/exportAuditLogsJob.ts entries/jobs/invalidateCacheTagsJob.ts entries/lifecycle/gracefulShutdown.ts entries/logging/logger.ts entries/logging/requestLoggingMiddleware.ts entries/mail/mailer.ts entries/mail/markdownMail.ts entries/mail/markdownMailable.ts entries/mail/sanitizeMailHtml.ts entries/media/imageTransform.ts entries/metrics/prometheus.ts entries/openapi/generator.ts entries/openapi/registeredRoute.ts entries/openapi/validate.ts entries/pagination.ts entries/queue.ts entries/queue/createAppQueue.ts entries/queue/failedJobRepository.ts entries/queue/failedJobService.ts entries/queue/jobRunner.ts entries/queue/queueMetrics.ts entries/queue/publicQueue.ts entries/queue/redisQueue.ts entries/queue/types.ts entries/runtime/asyncContextStore.ts entries/scheduler/schedule.ts entries/scheduler/osCron.ts entries/security/oauthState.ts entries/security/publicReads.ts entries/security/safeFetch.ts entries/security/safeUrl.ts entries/security/scimTenantTokens.ts entries/security/stripeWebhook.ts entries/security/timingSafeCompare.ts entries/security/tokenExpiry.ts entries/security/totp.ts entries/storage/storage.ts entries/tenant/tenancyConfig.ts entries/tenant/tenantDatabaseScope.ts entries/tenant/databaseTenantContext.ts entries/terminal/runShell.ts entries/tracing/tracingMiddleware.ts entries/validation/rules.ts entries/view.ts --outdir dist --root . --target bun --external bun --external eta --external @getstrata/core --external @getstrata/core/auth/accessControl --external @getstrata/core/auth/abilityChecker --external @getstrata/core/auth/authContext --external @getstrata/core/auth/guard --external @getstrata/core/auth/membershipContext --external @getstrata/core/auth/membershipMiddleware --external @getstrata/core/auth/membershipScope --external @getstrata/core/auth/membershipService --external @getstrata/core/auth/oauth/oidcProvider --external @getstrata/core/auth/oauth/providers --external @getstrata/core/auth/oauth/samlProvider --external @getstrata/core/auth/oauth/types --external @getstrata/core/auth/password --external @getstrata/core/auth/policy --external @getstrata/core/auth/scimAuthMiddleware --external @getstrata/core/auth/sessionCookie --external @getstrata/core/auth/sessionGuard --external @getstrata/core/auth/tokenHash --external @getstrata/core/audit/exportAuditLogs --external @getstrata/core/audit/siemFormatter --external @getstrata/core/admin/formatValue --external @getstrata/core/admin/registry --external @getstrata/core/admin/types --external @getstrata/core/cache/tags --external @getstrata/core/cache/createCacheStore --external @getstrata/core/cache/repository --external @getstrata/core/cache/simpleCache --external @getstrata/core/cache/simpleCacheStore --external @getstrata/core/config/envSchema --external @getstrata/core/contracts/serviceTokens --external @getstrata/core/contracts/container --external @getstrata/core/contracts/di --external @getstrata/core/crypto/fieldEncryption --external @getstrata/core/crypto/mfaSecret --external @getstrata/core/database --external @getstrata/core/database/baseRepository --external @getstrata/core/database/bindConnection --external @getstrata/core/database/boundConnection --external @getstrata/core/database/bunSql --external @getstrata/core/database/connection --external @getstrata/core/database/defaultConnection --external @getstrata/core/database/errors --external @getstrata/core/database/factory --external @getstrata/core/database/migrations --external @getstrata/core/database/migrations/types --external @getstrata/core/database/model --external @getstrata/core/database/query --external @getstrata/core/database/relationships --external @getstrata/core/database/repositoryConnection --external @getstrata/core/database/repositoryQuery --external @getstrata/core/database/seeders --external @getstrata/core/database/seeders/types --external @getstrata/core/database/schema --external @getstrata/core/database/table --external @getstrata/core/database/transaction --external @getstrata/core/database/types --external @getstrata/core/database/whereBuilder --external @getstrata/core/errors/http --external @getstrata/core/events --external @getstrata/core/facades --external @getstrata/core/http --external @getstrata/core/http/authMiddleware --external @getstrata/core/http/authorizeMiddleware --external @getstrata/core/http/bodySizeLimitMiddleware --external @getstrata/core/http/clientIp --external @getstrata/core/http/cookies --external @getstrata/core/http/contentNegotiation --external @getstrata/core/http/contentSecurityPolicy --external @getstrata/core/http/conditionalResponse --external @getstrata/core/http/corsMiddleware --external @getstrata/core/http/csrfMiddleware --external @getstrata/core/http/csrfProtection --external @getstrata/core/http/csrfToken --external @getstrata/core/http/etag --external @getstrata/core/http/flashSession --external @getstrata/core/http/flashMiddleware --external @getstrata/core/http/formRequest --external @getstrata/core/http/middleware --external @getstrata/core/http/metricsMiddleware --external @getstrata/core/http/loginThrottleMiddleware --external @getstrata/core/http/memoryThrottleMiddleware --external @getstrata/core/http/pagination --external @getstrata/core/http/parseFormBody --external @getstrata/core/http/parseMultipartUpload --external @getstrata/core/http/requireAbilityMiddleware --external @getstrata/core/http/requireAuthMiddleware --external @getstrata/core/http/requireGlobalAdminMiddleware --external @getstrata/core/http/requireWebAuthMiddleware --external @getstrata/core/http/resources --external @getstrata/core/http/response --external @getstrata/core/http/route --external @getstrata/core/http/routeMiddleware --external @getstrata/core/http/routeModelBinding --external @getstrata/core/http/safeInternalPath --external @getstrata/core/http/signedUrl --external @getstrata/core/http/scimThrottleMiddleware --external @getstrata/core/http/securityHeadersMiddleware --external @getstrata/core/http/securedRouteModelBinding --external @getstrata/core/http/requestMetaContext --external @getstrata/core/http/webErrorResponse --external @getstrata/core/http/webFormRequest --external @getstrata/core/http/throttleMiddleware --external @getstrata/core/http/validation --external @getstrata/core/jobs/dispatchWebhookJob --external @getstrata/core/jobs/exportAuditLogsJob --external @getstrata/core/jobs/invalidateCacheTagsJob --external @getstrata/core/lifecycle/gracefulShutdown --external @getstrata/core/logging/logger --external @getstrata/core/logging/requestLoggingMiddleware --external @getstrata/core/mail/mailer --external @getstrata/core/mail/markdownMail --external @getstrata/core/mail/markdownMailable --external @getstrata/core/mail/sanitizeMailHtml --external @getstrata/core/media/imageTransform --external @getstrata/core/metrics/prometheus --external @getstrata/core/notifications --external @getstrata/core/openapi/generator --external @getstrata/core/openapi/registeredRoute --external @getstrata/core/openapi/validate --external @getstrata/core/pagination --external @getstrata/core/queue --external @getstrata/core/queue/createAppQueue --external @getstrata/core/queue/failedJobRepository --external @getstrata/core/queue/failedJobService --external @getstrata/core/queue/jobRegistry --external @getstrata/core/queue/jobRunner --external @getstrata/core/queue/queueMetrics --external @getstrata/core/queue/publicQueue --external @getstrata/core/queue/redisQueue --external @getstrata/core/queue/types --external @getstrata/core/runtime/applicationRegistry --external @getstrata/core/runtime/asyncContextStore --external @getstrata/core/scheduler/schedule --external @getstrata/core/scheduler/osCron --external @getstrata/core/security/oauthState --external @getstrata/core/security/publicReads --external @getstrata/core/security/safeFetch --external @getstrata/core/security/safeUrl --external @getstrata/core/security/scimTenantTokens --external @getstrata/core/security/securityEvents --external @getstrata/core/security/stripeWebhook --external @getstrata/core/security/timingSafeCompare --external @getstrata/core/security/tokenExpiry --external @getstrata/core/security/totp --external @getstrata/core/storage/storage --external @getstrata/core/tenant/tenancyConfig --external @getstrata/core/tenant/tenantContext --external @getstrata/core/tenant/tenantDatabaseScope --external @getstrata/core/tenant/databaseTenantContext --external @getstrata/core/tenant/tenantMiddleware --external @getstrata/core/terminal/runShell --external @getstrata/core/tracing/traceContext --external @getstrata/core/tracing/tracingMiddleware --external @getstrata/core/validation/rules --external @getstrata/core/view",
|
|
811
|
+
"build:subpaths": "bun build entries/auth/accessControl.ts entries/auth/abilityChecker.ts entries/auth/membershipMiddleware.ts entries/auth/membershipScope.ts entries/auth/membershipService.ts entries/auth/oauth/oidcProvider.ts entries/auth/oauth/providers.ts entries/auth/oauth/samlProvider.ts entries/auth/oauth/types.ts entries/auth/password.ts entries/auth/policy.ts entries/auth/scimAuthMiddleware.ts entries/auth/sessionCookie.ts entries/auth/sessionGuard.ts entries/auth/tokenHash.ts entries/audit/exportAuditLogs.ts entries/audit/siemFormatter.ts entries/admin/formatValue.ts entries/admin/registry.ts entries/admin/types.ts entries/cache/tags.ts entries/cache/createCacheStore.ts entries/cache/repository.ts entries/cache/simpleCache.ts entries/cache/simpleCacheStore.ts entries/config/envSchema.ts entries/contracts/serviceTokens.ts entries/contracts/container.ts entries/contracts/di.ts entries/crypto/fieldEncryption.ts entries/crypto/mfaSecret.ts entries/database/errors.ts entries/database/factory.ts entries/database/migrations.ts entries/database/migrations/types.ts entries/database/model.ts entries/database/query.ts entries/database/relationships.ts entries/database/repositoryQuery.ts entries/database/seeders.ts entries/database/seeders/types.ts entries/database/schema.ts entries/database/table.ts entries/database/types.ts entries/database/whereBuilder.ts entries/facades.ts entries/http/authMiddleware.ts entries/http/authorizeMiddleware.ts entries/http/bodySizeLimitMiddleware.ts entries/http/clientIp.ts entries/http/cookies.ts entries/http/contentNegotiation.ts entries/http/conditionalResponse.ts entries/http/corsMiddleware.ts entries/http/csrfMiddleware.ts entries/http/csrfProtection.ts entries/http/csrfToken.ts entries/http/etag.ts entries/http/flashSession.ts entries/http/flashMiddleware.ts entries/http/formRequest.ts entries/http/metricsMiddleware.ts entries/http/loginThrottleMiddleware.ts entries/http/memoryThrottleMiddleware.ts entries/http/pagination.ts entries/http/parseFormBody.ts entries/http/parseMultipartUpload.ts entries/http/requireAbilityMiddleware.ts entries/http/requireAuthMiddleware.ts entries/http/requireGlobalAdminMiddleware.ts entries/http/requireWebAuthMiddleware.ts entries/http/resources.ts entries/http/response.ts entries/http/route.ts entries/http/routeMiddleware.ts entries/http/routeModelBinding.ts entries/http/safeInternalPath.ts entries/http/signedUrl.ts entries/http/scimThrottleMiddleware.ts entries/http/securityHeadersMiddleware.ts entries/http/securedRouteModelBinding.ts entries/http/webErrorResponse.ts entries/http/webFormRequest.ts entries/http/throttleMiddleware.ts entries/http/validation.ts entries/jobs/dispatchWebhookJob.ts entries/jobs/exportAuditLogsJob.ts entries/jobs/invalidateCacheTagsJob.ts entries/lifecycle/gracefulShutdown.ts entries/logging/logger.ts entries/logging/requestLoggingMiddleware.ts entries/mail/mailer.ts entries/mail/markdownMail.ts entries/mail/markdownMailable.ts entries/mail/sanitizeMailHtml.ts entries/media/imageTransform.ts entries/metrics/prometheus.ts entries/openapi/generator.ts entries/openapi/registeredRoute.ts entries/openapi/validate.ts entries/pagination.ts entries/queue.ts entries/queue/createAppQueue.ts entries/queue/failedJobRepository.ts entries/queue/failedJobService.ts entries/queue/jobRunner.ts entries/queue/queueMetrics.ts entries/queue/publicQueue.ts entries/queue/redisQueue.ts entries/queue/types.ts entries/runtime/appKeyPrefix.ts entries/runtime/asyncContextStore.ts entries/scheduler/schedule.ts entries/scheduler/osCron.ts entries/security/oauthState.ts entries/security/publicReads.ts entries/security/safeFetch.ts entries/security/safeUrl.ts entries/security/scimTenantTokens.ts entries/security/stripeWebhook.ts entries/security/timingSafeCompare.ts entries/security/tokenExpiry.ts entries/security/totp.ts entries/storage/storage.ts entries/tenant/tenancyConfig.ts entries/tenant/tenantDatabaseScope.ts entries/tenant/databaseTenantContext.ts entries/terminal/runShell.ts entries/tracing/tracingMiddleware.ts entries/validation/rules.ts entries/view.ts --outdir dist --root . --target bun --external bun --external eta --external @getstrata/core --external @getstrata/core/auth/accessControl --external @getstrata/core/auth/abilityChecker --external @getstrata/core/auth/authContext --external @getstrata/core/auth/guard --external @getstrata/core/auth/membershipContext --external @getstrata/core/auth/membershipMiddleware --external @getstrata/core/auth/membershipScope --external @getstrata/core/auth/membershipService --external @getstrata/core/auth/oauth/oidcProvider --external @getstrata/core/auth/oauth/providers --external @getstrata/core/auth/oauth/samlProvider --external @getstrata/core/auth/oauth/types --external @getstrata/core/auth/password --external @getstrata/core/auth/policy --external @getstrata/core/auth/scimAuthMiddleware --external @getstrata/core/auth/sessionCookie --external @getstrata/core/auth/sessionGuard --external @getstrata/core/auth/tokenHash --external @getstrata/core/audit/exportAuditLogs --external @getstrata/core/audit/siemFormatter --external @getstrata/core/admin/formatValue --external @getstrata/core/admin/registry --external @getstrata/core/admin/types --external @getstrata/core/cache/tags --external @getstrata/core/cache/createCacheStore --external @getstrata/core/cache/repository --external @getstrata/core/cache/simpleCache --external @getstrata/core/cache/simpleCacheStore --external @getstrata/core/config/envSchema --external @getstrata/core/contracts/serviceTokens --external @getstrata/core/contracts/container --external @getstrata/core/contracts/di --external @getstrata/core/crypto/fieldEncryption --external @getstrata/core/crypto/mfaSecret --external @getstrata/core/database --external @getstrata/core/database/baseRepository --external @getstrata/core/database/bindConnection --external @getstrata/core/database/boundConnection --external @getstrata/core/database/bunSql --external @getstrata/core/database/connection --external @getstrata/core/database/defaultConnection --external @getstrata/core/database/errors --external @getstrata/core/database/factory --external @getstrata/core/database/migrations --external @getstrata/core/database/migrations/types --external @getstrata/core/database/model --external @getstrata/core/database/query --external @getstrata/core/database/relationships --external @getstrata/core/database/repositoryConnection --external @getstrata/core/database/repositoryQuery --external @getstrata/core/database/seeders --external @getstrata/core/database/seeders/types --external @getstrata/core/database/schema --external @getstrata/core/database/table --external @getstrata/core/database/transaction --external @getstrata/core/database/types --external @getstrata/core/database/whereBuilder --external @getstrata/core/errors/http --external @getstrata/core/events --external @getstrata/core/facades --external @getstrata/core/http --external @getstrata/core/http/authMiddleware --external @getstrata/core/http/authorizeMiddleware --external @getstrata/core/http/bodySizeLimitMiddleware --external @getstrata/core/http/clientIp --external @getstrata/core/http/cookies --external @getstrata/core/http/contentNegotiation --external @getstrata/core/http/contentSecurityPolicy --external @getstrata/core/http/conditionalResponse --external @getstrata/core/http/corsMiddleware --external @getstrata/core/http/csrfMiddleware --external @getstrata/core/http/csrfProtection --external @getstrata/core/http/csrfToken --external @getstrata/core/http/etag --external @getstrata/core/http/flashSession --external @getstrata/core/http/flashMiddleware --external @getstrata/core/http/formRequest --external @getstrata/core/http/middleware --external @getstrata/core/http/metricsMiddleware --external @getstrata/core/http/loginThrottleMiddleware --external @getstrata/core/http/memoryThrottleMiddleware --external @getstrata/core/http/pagination --external @getstrata/core/http/parseFormBody --external @getstrata/core/http/parseMultipartUpload --external @getstrata/core/http/requireAbilityMiddleware --external @getstrata/core/http/requireAuthMiddleware --external @getstrata/core/http/requireGlobalAdminMiddleware --external @getstrata/core/http/requireWebAuthMiddleware --external @getstrata/core/http/resources --external @getstrata/core/http/response --external @getstrata/core/http/route --external @getstrata/core/http/routeMiddleware --external @getstrata/core/http/routeModelBinding --external @getstrata/core/http/safeInternalPath --external @getstrata/core/http/signedUrl --external @getstrata/core/http/scimThrottleMiddleware --external @getstrata/core/http/securityHeadersMiddleware --external @getstrata/core/http/securedRouteModelBinding --external @getstrata/core/http/requestMetaContext --external @getstrata/core/http/webErrorResponse --external @getstrata/core/http/webFormRequest --external @getstrata/core/http/throttleMiddleware --external @getstrata/core/http/validation --external @getstrata/core/jobs/dispatchWebhookJob --external @getstrata/core/jobs/exportAuditLogsJob --external @getstrata/core/jobs/invalidateCacheTagsJob --external @getstrata/core/lifecycle/gracefulShutdown --external @getstrata/core/logging/logger --external @getstrata/core/logging/requestLoggingMiddleware --external @getstrata/core/mail/mailer --external @getstrata/core/mail/markdownMail --external @getstrata/core/mail/markdownMailable --external @getstrata/core/mail/sanitizeMailHtml --external @getstrata/core/media/imageTransform --external @getstrata/core/metrics/prometheus --external @getstrata/core/notifications --external @getstrata/core/openapi/generator --external @getstrata/core/openapi/registeredRoute --external @getstrata/core/openapi/validate --external @getstrata/core/pagination --external @getstrata/core/queue --external @getstrata/core/queue/createAppQueue --external @getstrata/core/queue/failedJobRepository --external @getstrata/core/queue/failedJobService --external @getstrata/core/queue/jobRegistry --external @getstrata/core/queue/jobRunner --external @getstrata/core/queue/queueMetrics --external @getstrata/core/queue/publicQueue --external @getstrata/core/queue/redisQueue --external @getstrata/core/queue/types --external @getstrata/core/runtime/appKeyPrefix --external @getstrata/core/runtime/applicationRegistry --external @getstrata/core/runtime/asyncContextStore --external @getstrata/core/scheduler/schedule --external @getstrata/core/scheduler/osCron --external @getstrata/core/security/oauthState --external @getstrata/core/security/publicReads --external @getstrata/core/security/safeFetch --external @getstrata/core/security/safeUrl --external @getstrata/core/security/scimTenantTokens --external @getstrata/core/security/securityEvents --external @getstrata/core/security/stripeWebhook --external @getstrata/core/security/timingSafeCompare --external @getstrata/core/security/tokenExpiry --external @getstrata/core/security/totp --external @getstrata/core/storage/storage --external @getstrata/core/tenant/tenancyConfig --external @getstrata/core/tenant/tenantContext --external @getstrata/core/tenant/tenantDatabaseScope --external @getstrata/core/tenant/databaseTenantContext --external @getstrata/core/tenant/tenantMiddleware --external @getstrata/core/terminal/runShell --external @getstrata/core/tracing/traceContext --external @getstrata/core/tracing/tracingMiddleware --external @getstrata/core/validation/rules --external @getstrata/core/view",
|
|
807
812
|
"build:shims": "bun ../../scripts/write-core-shared-shims.ts"
|
|
808
813
|
},
|
|
809
814
|
"publishConfig": {
|