@getstrata/core 0.5.88 → 0.5.90
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 +11 -0
- package/README.md +1 -1
- package/dist/entries/audit/exportAuditLogs.js +2 -2
- package/dist/entries/audit/siemFormatter.js +2 -2
- package/dist/entries/auth/intendedUrlCookie.js +2 -2
- package/dist/entries/auth/oauth/providers.js +2 -2
- package/dist/entries/auth/oauth/samlProvider.js +2 -2
- package/dist/entries/auth/passwordConfirmCookie.js +2 -2
- package/dist/entries/auth/sessionCookie.js +2 -2
- package/dist/entries/auth/sessionGuard.js +2 -2
- package/dist/entries/auth/tokenHash.js +2 -2
- package/dist/entries/cache/createCacheStore.js +2 -2
- package/dist/entries/facades.js +2 -2
- package/dist/entries/http/csrfMiddleware.js +2 -2
- package/dist/entries/http/csrfToken.js +2 -2
- package/dist/entries/http/flashMiddleware.js +2 -2
- package/dist/entries/http/flashSession.js +2 -2
- package/dist/entries/http/loginThrottleMiddleware.js +2 -2
- package/dist/entries/http/memoryThrottleMiddleware.js +2 -2
- package/dist/entries/http/scimThrottleMiddleware.js +2 -2
- package/dist/entries/http/securityHeadersMiddleware.js +2 -2
- package/dist/entries/http/signedUrl.js +2 -2
- package/dist/entries/http/throttleMiddleware.js +2 -2
- package/dist/entries/jobs/exportAuditLogsJob.js +2 -2
- package/dist/entries/mail/mailer.js +2 -2
- package/dist/entries/openapi/generator.js +5 -5
- package/dist/entries/queue/createAppQueue.js +2 -2
- package/dist/entries/queue/publicQueue.js +2 -2
- package/dist/entries/queue/queueMetrics.js +2 -2
- package/dist/entries/queue/redisQueue.js +2 -2
- package/dist/entries/runtime/appKeyPrefix.js +2 -2
- package/dist/entries/scheduler/schedule.js +13 -2
- package/dist/entries/security/oauthState.js +2 -2
- package/dist/entries/security/safeFetch.js +2 -2
- package/dist/entries/security/totp.js +2 -2
- package/dist/entries/tracing/tracingMiddleware.js +2 -2
- package/dist/entries/view.js +2 -2
- package/dist/index.js +14 -3
- package/package.json +2 -7
- package/dist/core/jobs/dispatchWebhookJob.d.ts +0 -2
- package/dist/entries/jobs/dispatchWebhookJob.js +0 -93
- package/dist/modules/webhook/dispatchWebhookJob.d.ts +0 -18
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# @getstrata/core changelog
|
|
2
2
|
|
|
3
|
+
## 0.5.90
|
|
4
|
+
|
|
5
|
+
- **Breaking identity defaults:** `appKeyPrefix()` is `strata` and `appDisplayName()` is `Strata` when `APP_KEY_PREFIX` / `APP_NAME` are unset (were `workhub` / `WorkHub`). WorkHub pins those env vars.
|
|
6
|
+
- `Schedule.command()` rejects cron strings other than `* * * * *` and `*/N * * * *` instead of silently never running them.
|
|
7
|
+
- OpenAPI marks `GET /users/me/*` as bearer-authenticated.
|
|
8
|
+
- OpenAPI `/users/me/current-organization` summaries no longer say Jetstream.
|
|
9
|
+
|
|
10
|
+
## 0.5.89
|
|
11
|
+
|
|
12
|
+
- **Breaking:** removed `@getstrata/core/jobs/dispatchWebhookJob`. Import `DispatchWebhookJob` from the app webhook module (`src/modules/webhook/dispatchWebhookJob.ts`).
|
|
13
|
+
|
|
3
14
|
## 0.5.88
|
|
4
15
|
|
|
5
16
|
- Exported cookie name constants (`SESSION_COOKIE`, `CSRF_COOKIE`, `FLASH_COOKIE`, `INTENDED_URL_COOKIE`, `PASSWORD_CONFIRM_COOKIE`) are `appCookieName(...)` so they match the default prefix instead of a hardcoded `workhub_` string.
|
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.95 && git push origin v0.5.95`
|
|
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.
|
|
@@ -4,7 +4,7 @@ import { repositoryConnection as db2 } from "@getstrata/core/database/repository
|
|
|
4
4
|
|
|
5
5
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
6
6
|
function appKeyPrefix() {
|
|
7
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
7
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
8
8
|
}
|
|
9
9
|
function appCookieName(kind) {
|
|
10
10
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -33,7 +33,7 @@ function webhookSignatureHeader() {
|
|
|
33
33
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
34
34
|
}
|
|
35
35
|
function appDisplayName() {
|
|
36
|
-
return process.env.APP_NAME?.trim() || "
|
|
36
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
37
37
|
}
|
|
38
38
|
function appEnv() {
|
|
39
39
|
return process.env.APP_ENV?.trim() || "local";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
3
3
|
function appKeyPrefix() {
|
|
4
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
4
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
5
5
|
}
|
|
6
6
|
function appCookieName(kind) {
|
|
7
7
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -30,7 +30,7 @@ function webhookSignatureHeader() {
|
|
|
30
30
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
31
31
|
}
|
|
32
32
|
function appDisplayName() {
|
|
33
|
-
return process.env.APP_NAME?.trim() || "
|
|
33
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
34
34
|
}
|
|
35
35
|
function appEnv() {
|
|
36
36
|
return process.env.APP_ENV?.trim() || "local";
|
|
@@ -34,7 +34,7 @@ function loginRedirectLocation(request) {
|
|
|
34
34
|
|
|
35
35
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
36
36
|
function appKeyPrefix() {
|
|
37
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
37
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
38
38
|
}
|
|
39
39
|
function appCookieName(kind) {
|
|
40
40
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -63,7 +63,7 @@ function webhookSignatureHeader() {
|
|
|
63
63
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
64
64
|
}
|
|
65
65
|
function appDisplayName() {
|
|
66
|
-
return process.env.APP_NAME?.trim() || "
|
|
66
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
67
67
|
}
|
|
68
68
|
function appEnv() {
|
|
69
69
|
return process.env.APP_ENV?.trim() || "local";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
3
3
|
function appKeyPrefix() {
|
|
4
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
4
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
5
5
|
}
|
|
6
6
|
function appCookieName(kind) {
|
|
7
7
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -30,7 +30,7 @@ function webhookSignatureHeader() {
|
|
|
30
30
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
31
31
|
}
|
|
32
32
|
function appDisplayName() {
|
|
33
|
-
return process.env.APP_NAME?.trim() || "
|
|
33
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
34
34
|
}
|
|
35
35
|
function appEnv() {
|
|
36
36
|
return process.env.APP_ENV?.trim() || "local";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
3
3
|
function appKeyPrefix() {
|
|
4
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
4
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
5
5
|
}
|
|
6
6
|
function appCookieName(kind) {
|
|
7
7
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -30,7 +30,7 @@ function webhookSignatureHeader() {
|
|
|
30
30
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
31
31
|
}
|
|
32
32
|
function appDisplayName() {
|
|
33
|
-
return process.env.APP_NAME?.trim() || "
|
|
33
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
34
34
|
}
|
|
35
35
|
function appEnv() {
|
|
36
36
|
return process.env.APP_ENV?.trim() || "local";
|
|
@@ -4,7 +4,7 @@ import { createHmac, timingSafeEqual } from "crypto";
|
|
|
4
4
|
|
|
5
5
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
6
6
|
function appKeyPrefix() {
|
|
7
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
7
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
8
8
|
}
|
|
9
9
|
function appCookieName(kind) {
|
|
10
10
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -33,7 +33,7 @@ function webhookSignatureHeader() {
|
|
|
33
33
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
34
34
|
}
|
|
35
35
|
function appDisplayName() {
|
|
36
|
-
return process.env.APP_NAME?.trim() || "
|
|
36
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
37
37
|
}
|
|
38
38
|
function appEnv() {
|
|
39
39
|
return process.env.APP_ENV?.trim() || "local";
|
|
@@ -4,7 +4,7 @@ import { createHmac, timingSafeEqual } from "crypto";
|
|
|
4
4
|
|
|
5
5
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
6
6
|
function appKeyPrefix() {
|
|
7
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
7
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
8
8
|
}
|
|
9
9
|
function appCookieName(kind) {
|
|
10
10
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -33,7 +33,7 @@ function webhookSignatureHeader() {
|
|
|
33
33
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
34
34
|
}
|
|
35
35
|
function appDisplayName() {
|
|
36
|
-
return process.env.APP_NAME?.trim() || "
|
|
36
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
37
37
|
}
|
|
38
38
|
function appEnv() {
|
|
39
39
|
return process.env.APP_ENV?.trim() || "local";
|
|
@@ -89,7 +89,7 @@ import { createHmac, timingSafeEqual } from "crypto";
|
|
|
89
89
|
|
|
90
90
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
91
91
|
function appKeyPrefix() {
|
|
92
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
92
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
93
93
|
}
|
|
94
94
|
function appCookieName(kind) {
|
|
95
95
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -118,7 +118,7 @@ function webhookSignatureHeader() {
|
|
|
118
118
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
119
119
|
}
|
|
120
120
|
function appDisplayName() {
|
|
121
|
-
return process.env.APP_NAME?.trim() || "
|
|
121
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
122
122
|
}
|
|
123
123
|
function appEnv() {
|
|
124
124
|
return process.env.APP_ENV?.trim() || "local";
|
|
@@ -4,7 +4,7 @@ import { createHash, createHmac } from "crypto";
|
|
|
4
4
|
|
|
5
5
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
6
6
|
function appKeyPrefix() {
|
|
7
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
7
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
8
8
|
}
|
|
9
9
|
function appCookieName(kind) {
|
|
10
10
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -33,7 +33,7 @@ function webhookSignatureHeader() {
|
|
|
33
33
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
34
34
|
}
|
|
35
35
|
function appDisplayName() {
|
|
36
|
-
return process.env.APP_NAME?.trim() || "
|
|
36
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
37
37
|
}
|
|
38
38
|
function appEnv() {
|
|
39
39
|
return process.env.APP_ENV?.trim() || "local";
|
|
@@ -4,7 +4,7 @@ var {RedisClient } = globalThis.Bun;
|
|
|
4
4
|
|
|
5
5
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
6
6
|
function appKeyPrefix() {
|
|
7
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
7
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
8
8
|
}
|
|
9
9
|
function appCookieName(kind) {
|
|
10
10
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -33,7 +33,7 @@ function webhookSignatureHeader() {
|
|
|
33
33
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
34
34
|
}
|
|
35
35
|
function appDisplayName() {
|
|
36
|
-
return process.env.APP_NAME?.trim() || "
|
|
36
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
37
37
|
}
|
|
38
38
|
function appEnv() {
|
|
39
39
|
return process.env.APP_ENV?.trim() || "local";
|
package/dist/entries/facades.js
CHANGED
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
|
|
14
14
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
15
15
|
function appKeyPrefix() {
|
|
16
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
16
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
17
17
|
}
|
|
18
18
|
function appCookieName(kind) {
|
|
19
19
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -42,7 +42,7 @@ function webhookSignatureHeader() {
|
|
|
42
42
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
43
43
|
}
|
|
44
44
|
function appDisplayName() {
|
|
45
|
-
return process.env.APP_NAME?.trim() || "
|
|
45
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
46
46
|
}
|
|
47
47
|
function appEnv() {
|
|
48
48
|
return process.env.APP_ENV?.trim() || "local";
|
|
@@ -7,7 +7,7 @@ import { timingSafeEqual } from "crypto";
|
|
|
7
7
|
|
|
8
8
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
9
9
|
function appKeyPrefix() {
|
|
10
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
10
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
11
11
|
}
|
|
12
12
|
function appCookieName(kind) {
|
|
13
13
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -36,7 +36,7 @@ function webhookSignatureHeader() {
|
|
|
36
36
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
37
37
|
}
|
|
38
38
|
function appDisplayName() {
|
|
39
|
-
return process.env.APP_NAME?.trim() || "
|
|
39
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
40
40
|
}
|
|
41
41
|
function appEnv() {
|
|
42
42
|
return process.env.APP_ENV?.trim() || "local";
|
|
@@ -4,7 +4,7 @@ import { timingSafeEqual } from "crypto";
|
|
|
4
4
|
|
|
5
5
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
6
6
|
function appKeyPrefix() {
|
|
7
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
7
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
8
8
|
}
|
|
9
9
|
function appCookieName(kind) {
|
|
10
10
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -33,7 +33,7 @@ function webhookSignatureHeader() {
|
|
|
33
33
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
34
34
|
}
|
|
35
35
|
function appDisplayName() {
|
|
36
|
-
return process.env.APP_NAME?.trim() || "
|
|
36
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
37
37
|
}
|
|
38
38
|
function appEnv() {
|
|
39
39
|
return process.env.APP_ENV?.trim() || "local";
|
|
@@ -4,7 +4,7 @@ import { createHmac, timingSafeEqual } from "crypto";
|
|
|
4
4
|
|
|
5
5
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
6
6
|
function appKeyPrefix() {
|
|
7
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
7
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
8
8
|
}
|
|
9
9
|
function appCookieName(kind) {
|
|
10
10
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -33,7 +33,7 @@ function webhookSignatureHeader() {
|
|
|
33
33
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
34
34
|
}
|
|
35
35
|
function appDisplayName() {
|
|
36
|
-
return process.env.APP_NAME?.trim() || "
|
|
36
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
37
37
|
}
|
|
38
38
|
function appEnv() {
|
|
39
39
|
return process.env.APP_ENV?.trim() || "local";
|
|
@@ -4,7 +4,7 @@ import { createHmac, timingSafeEqual } from "crypto";
|
|
|
4
4
|
|
|
5
5
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
6
6
|
function appKeyPrefix() {
|
|
7
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
7
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
8
8
|
}
|
|
9
9
|
function appCookieName(kind) {
|
|
10
10
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -33,7 +33,7 @@ function webhookSignatureHeader() {
|
|
|
33
33
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
34
34
|
}
|
|
35
35
|
function appDisplayName() {
|
|
36
|
-
return process.env.APP_NAME?.trim() || "
|
|
36
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
37
37
|
}
|
|
38
38
|
function appEnv() {
|
|
39
39
|
return process.env.APP_ENV?.trim() || "local";
|
|
@@ -4,7 +4,7 @@ var {RedisClient } = globalThis.Bun;
|
|
|
4
4
|
|
|
5
5
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
6
6
|
function appKeyPrefix() {
|
|
7
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
7
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
8
8
|
}
|
|
9
9
|
function appCookieName(kind) {
|
|
10
10
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -33,7 +33,7 @@ function webhookSignatureHeader() {
|
|
|
33
33
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
34
34
|
}
|
|
35
35
|
function appDisplayName() {
|
|
36
|
-
return process.env.APP_NAME?.trim() || "
|
|
36
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
37
37
|
}
|
|
38
38
|
function appEnv() {
|
|
39
39
|
return process.env.APP_ENV?.trim() || "local";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
3
3
|
function appKeyPrefix() {
|
|
4
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
4
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
5
5
|
}
|
|
6
6
|
function appCookieName(kind) {
|
|
7
7
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -30,7 +30,7 @@ function webhookSignatureHeader() {
|
|
|
30
30
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
31
31
|
}
|
|
32
32
|
function appDisplayName() {
|
|
33
|
-
return process.env.APP_NAME?.trim() || "
|
|
33
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
34
34
|
}
|
|
35
35
|
function appEnv() {
|
|
36
36
|
return process.env.APP_ENV?.trim() || "local";
|
|
@@ -4,7 +4,7 @@ var {RedisClient } = globalThis.Bun;
|
|
|
4
4
|
|
|
5
5
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
6
6
|
function appKeyPrefix() {
|
|
7
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
7
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
8
8
|
}
|
|
9
9
|
function appCookieName(kind) {
|
|
10
10
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -33,7 +33,7 @@ function webhookSignatureHeader() {
|
|
|
33
33
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
34
34
|
}
|
|
35
35
|
function appDisplayName() {
|
|
36
|
-
return process.env.APP_NAME?.trim() || "
|
|
36
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
37
37
|
}
|
|
38
38
|
function appEnv() {
|
|
39
39
|
return process.env.APP_ENV?.trim() || "local";
|
|
@@ -9,7 +9,7 @@ import { currentRequestMeta, runWithRequestMeta } from "@getstrata/core/http/req
|
|
|
9
9
|
|
|
10
10
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
11
11
|
function appKeyPrefix() {
|
|
12
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
12
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
13
13
|
}
|
|
14
14
|
function appCookieName(kind) {
|
|
15
15
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -38,7 +38,7 @@ function webhookSignatureHeader() {
|
|
|
38
38
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
39
39
|
}
|
|
40
40
|
function appDisplayName() {
|
|
41
|
-
return process.env.APP_NAME?.trim() || "
|
|
41
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
42
42
|
}
|
|
43
43
|
function appEnv() {
|
|
44
44
|
return process.env.APP_ENV?.trim() || "local";
|
|
@@ -6,7 +6,7 @@ import { timingSafeCompareString } from "@getstrata/core/security/timingSafeComp
|
|
|
6
6
|
|
|
7
7
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
8
8
|
function appKeyPrefix() {
|
|
9
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
9
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
10
10
|
}
|
|
11
11
|
function appCookieName(kind) {
|
|
12
12
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -35,7 +35,7 @@ function webhookSignatureHeader() {
|
|
|
35
35
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
36
36
|
}
|
|
37
37
|
function appDisplayName() {
|
|
38
|
-
return process.env.APP_NAME?.trim() || "
|
|
38
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
39
39
|
}
|
|
40
40
|
function appEnv() {
|
|
41
41
|
return process.env.APP_ENV?.trim() || "local";
|
|
@@ -6,7 +6,7 @@ var {RedisClient } = globalThis.Bun;
|
|
|
6
6
|
|
|
7
7
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
8
8
|
function appKeyPrefix() {
|
|
9
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
9
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
10
10
|
}
|
|
11
11
|
function appCookieName(kind) {
|
|
12
12
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -35,7 +35,7 @@ function webhookSignatureHeader() {
|
|
|
35
35
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
36
36
|
}
|
|
37
37
|
function appDisplayName() {
|
|
38
|
-
return process.env.APP_NAME?.trim() || "
|
|
38
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
39
39
|
}
|
|
40
40
|
function appEnv() {
|
|
41
41
|
return process.env.APP_ENV?.trim() || "local";
|
|
@@ -4,7 +4,7 @@ import { repositoryConnection as db2 } from "@getstrata/core/database/repository
|
|
|
4
4
|
|
|
5
5
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
6
6
|
function appKeyPrefix() {
|
|
7
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
7
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
8
8
|
}
|
|
9
9
|
function appCookieName(kind) {
|
|
10
10
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -33,7 +33,7 @@ function webhookSignatureHeader() {
|
|
|
33
33
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
34
34
|
}
|
|
35
35
|
function appDisplayName() {
|
|
36
|
-
return process.env.APP_NAME?.trim() || "
|
|
36
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
37
37
|
}
|
|
38
38
|
function appEnv() {
|
|
39
39
|
return process.env.APP_ENV?.trim() || "local";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
3
3
|
function appKeyPrefix() {
|
|
4
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
4
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
5
5
|
}
|
|
6
6
|
function appCookieName(kind) {
|
|
7
7
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -30,7 +30,7 @@ function webhookSignatureHeader() {
|
|
|
30
30
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
31
31
|
}
|
|
32
32
|
function appDisplayName() {
|
|
33
|
-
return process.env.APP_NAME?.trim() || "
|
|
33
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
34
34
|
}
|
|
35
35
|
function appEnv() {
|
|
36
36
|
return process.env.APP_ENV?.trim() || "local";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
3
3
|
function appKeyPrefix() {
|
|
4
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
4
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
5
5
|
}
|
|
6
6
|
function appCookieName(kind) {
|
|
7
7
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -30,7 +30,7 @@ function webhookSignatureHeader() {
|
|
|
30
30
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
31
31
|
}
|
|
32
32
|
function appDisplayName() {
|
|
33
|
-
return process.env.APP_NAME?.trim() || "
|
|
33
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
34
34
|
}
|
|
35
35
|
function appEnv() {
|
|
36
36
|
return process.env.APP_ENV?.trim() || "local";
|
|
@@ -66,8 +66,8 @@ var PUBLIC_ROUTE_DESCRIPTIONS = {
|
|
|
66
66
|
"POST /auth/tokens": "Create API token",
|
|
67
67
|
"DELETE /auth/tokens/:id": "Revoke API token",
|
|
68
68
|
"GET /users/me/export": "GDPR export of user data",
|
|
69
|
-
"GET /users/me/current-organization": "Current
|
|
70
|
-
"PUT /users/me/current-organization": "Switch current
|
|
69
|
+
"GET /users/me/current-organization": "Current organization",
|
|
70
|
+
"PUT /users/me/current-organization": "Switch current organization",
|
|
71
71
|
"GET /users/me/invitations": "List pending team invitations for the signed-in email",
|
|
72
72
|
"POST /users/me/invitations/:id/accept": "Accept a pending team invitation",
|
|
73
73
|
"DELETE /users/me/invitations/:id": "Decline a pending team invitation",
|
|
@@ -126,7 +126,7 @@ function requiresBearerAuth(path, method) {
|
|
|
126
126
|
if (method === "GET" && ["/organizations", "/projects", "/tasks", "/search"].some((prefix) => relative.startsWith(prefix) || path.startsWith(prefix))) {
|
|
127
127
|
return false;
|
|
128
128
|
}
|
|
129
|
-
return relative.startsWith("/auth/") || ["POST", "PATCH", "PUT", "DELETE"].includes(method);
|
|
129
|
+
return relative.startsWith("/auth/") || relative.startsWith("/users/me") || path.startsWith("/users/me") || ["POST", "PATCH", "PUT", "DELETE"].includes(method);
|
|
130
130
|
}
|
|
131
131
|
function generateOpenApiSpec(routes) {
|
|
132
132
|
const paths = {};
|
|
@@ -158,7 +158,7 @@ var {RedisClient } = globalThis.Bun;
|
|
|
158
158
|
|
|
159
159
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
160
160
|
function appKeyPrefix() {
|
|
161
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
161
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
162
162
|
}
|
|
163
163
|
function appCookieName(kind) {
|
|
164
164
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -187,7 +187,7 @@ function webhookSignatureHeader() {
|
|
|
187
187
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
188
188
|
}
|
|
189
189
|
function appDisplayName() {
|
|
190
|
-
return process.env.APP_NAME?.trim() || "
|
|
190
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
191
191
|
}
|
|
192
192
|
function appEnv() {
|
|
193
193
|
return process.env.APP_ENV?.trim() || "local";
|
|
@@ -158,7 +158,7 @@ var {RedisClient } = globalThis.Bun;
|
|
|
158
158
|
|
|
159
159
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
160
160
|
function appKeyPrefix() {
|
|
161
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
161
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
162
162
|
}
|
|
163
163
|
function appCookieName(kind) {
|
|
164
164
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -187,7 +187,7 @@ function webhookSignatureHeader() {
|
|
|
187
187
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
188
188
|
}
|
|
189
189
|
function appDisplayName() {
|
|
190
|
-
return process.env.APP_NAME?.trim() || "
|
|
190
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
191
191
|
}
|
|
192
192
|
function appEnv() {
|
|
193
193
|
return process.env.APP_ENV?.trim() || "local";
|
|
@@ -161,7 +161,7 @@ var {RedisClient } = globalThis.Bun;
|
|
|
161
161
|
|
|
162
162
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
163
163
|
function appKeyPrefix() {
|
|
164
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
164
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
165
165
|
}
|
|
166
166
|
function appCookieName(kind) {
|
|
167
167
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -190,7 +190,7 @@ function webhookSignatureHeader() {
|
|
|
190
190
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
191
191
|
}
|
|
192
192
|
function appDisplayName() {
|
|
193
|
-
return process.env.APP_NAME?.trim() || "
|
|
193
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
194
194
|
}
|
|
195
195
|
function appEnv() {
|
|
196
196
|
return process.env.APP_ENV?.trim() || "local";
|
|
@@ -4,7 +4,7 @@ var {RedisClient } = globalThis.Bun;
|
|
|
4
4
|
|
|
5
5
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
6
6
|
function appKeyPrefix() {
|
|
7
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
7
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
8
8
|
}
|
|
9
9
|
function appCookieName(kind) {
|
|
10
10
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -33,7 +33,7 @@ function webhookSignatureHeader() {
|
|
|
33
33
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
34
34
|
}
|
|
35
35
|
function appDisplayName() {
|
|
36
|
-
return process.env.APP_NAME?.trim() || "
|
|
36
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
37
37
|
}
|
|
38
38
|
function appEnv() {
|
|
39
39
|
return process.env.APP_ENV?.trim() || "local";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
3
3
|
function appKeyPrefix() {
|
|
4
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
4
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
5
5
|
}
|
|
6
6
|
function appCookieName(kind) {
|
|
7
7
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -30,7 +30,7 @@ function webhookSignatureHeader() {
|
|
|
30
30
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
31
31
|
}
|
|
32
32
|
function appDisplayName() {
|
|
33
|
-
return process.env.APP_NAME?.trim() || "
|
|
33
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
34
34
|
}
|
|
35
35
|
function appEnv() {
|
|
36
36
|
return process.env.APP_ENV?.trim() || "local";
|
|
@@ -1,8 +1,18 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
// ../../src/core/scheduler/schedule.ts
|
|
3
|
+
function isSupportedScheduleExpression(expression) {
|
|
4
|
+
if (expression === "* * * * *") {
|
|
5
|
+
return true;
|
|
6
|
+
}
|
|
7
|
+
return /^(\*\/\d+)( \*){4}$/.test(expression);
|
|
8
|
+
}
|
|
9
|
+
|
|
3
10
|
class Schedule {
|
|
4
11
|
tasks = [];
|
|
5
12
|
command(expression, name, run) {
|
|
13
|
+
if (!isSupportedScheduleExpression(expression)) {
|
|
14
|
+
throw new Error(`Unsupported schedule expression "${expression}". Only "* * * * *" and "*/N * * * *" are implemented.`);
|
|
15
|
+
}
|
|
6
16
|
this.tasks.push({ expression, name, run });
|
|
7
17
|
return this;
|
|
8
18
|
}
|
|
@@ -12,8 +22,9 @@ class Schedule {
|
|
|
12
22
|
if (task.expression === "* * * * *") {
|
|
13
23
|
return true;
|
|
14
24
|
}
|
|
15
|
-
|
|
16
|
-
|
|
25
|
+
const intervalMatch = task.expression.match(/^\*\/(\d+)(?: \*){4}$/);
|
|
26
|
+
if (intervalMatch) {
|
|
27
|
+
const interval = Number.parseInt(intervalMatch[1] ?? "", 10);
|
|
17
28
|
return Number.isInteger(interval) && interval > 0 && minute % interval === 0;
|
|
18
29
|
}
|
|
19
30
|
return false;
|
|
@@ -4,7 +4,7 @@ import { createHmac, randomBytes, timingSafeEqual } from "crypto";
|
|
|
4
4
|
|
|
5
5
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
6
6
|
function appKeyPrefix() {
|
|
7
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
7
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
8
8
|
}
|
|
9
9
|
function appCookieName(kind) {
|
|
10
10
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -33,7 +33,7 @@ function webhookSignatureHeader() {
|
|
|
33
33
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
34
34
|
}
|
|
35
35
|
function appDisplayName() {
|
|
36
|
-
return process.env.APP_NAME?.trim() || "
|
|
36
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
37
37
|
}
|
|
38
38
|
function appEnv() {
|
|
39
39
|
return process.env.APP_ENV?.trim() || "local";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
3
3
|
function appKeyPrefix() {
|
|
4
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
4
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
5
5
|
}
|
|
6
6
|
function appCookieName(kind) {
|
|
7
7
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -30,7 +30,7 @@ function webhookSignatureHeader() {
|
|
|
30
30
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
31
31
|
}
|
|
32
32
|
function appDisplayName() {
|
|
33
|
-
return process.env.APP_NAME?.trim() || "
|
|
33
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
34
34
|
}
|
|
35
35
|
function appEnv() {
|
|
36
36
|
return process.env.APP_ENV?.trim() || "local";
|
|
@@ -4,7 +4,7 @@ import { createHmac, randomBytes } from "crypto";
|
|
|
4
4
|
|
|
5
5
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
6
6
|
function appKeyPrefix() {
|
|
7
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
7
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
8
8
|
}
|
|
9
9
|
function appCookieName(kind) {
|
|
10
10
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -33,7 +33,7 @@ function webhookSignatureHeader() {
|
|
|
33
33
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
34
34
|
}
|
|
35
35
|
function appDisplayName() {
|
|
36
|
-
return process.env.APP_NAME?.trim() || "
|
|
36
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
37
37
|
}
|
|
38
38
|
function appEnv() {
|
|
39
39
|
return process.env.APP_ENV?.trim() || "local";
|
|
@@ -4,7 +4,7 @@ import { randomBytes } from "crypto";
|
|
|
4
4
|
|
|
5
5
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
6
6
|
function appKeyPrefix() {
|
|
7
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
7
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
8
8
|
}
|
|
9
9
|
function appCookieName(kind) {
|
|
10
10
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -33,7 +33,7 @@ function webhookSignatureHeader() {
|
|
|
33
33
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
34
34
|
}
|
|
35
35
|
function appDisplayName() {
|
|
36
|
-
return process.env.APP_NAME?.trim() || "
|
|
36
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
37
37
|
}
|
|
38
38
|
function appEnv() {
|
|
39
39
|
return process.env.APP_ENV?.trim() || "local";
|
package/dist/entries/view.js
CHANGED
|
@@ -386,7 +386,7 @@ import { timingSafeEqual } from "crypto";
|
|
|
386
386
|
|
|
387
387
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
388
388
|
function appKeyPrefix() {
|
|
389
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
389
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
390
390
|
}
|
|
391
391
|
function appCookieName(kind) {
|
|
392
392
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -415,7 +415,7 @@ function webhookSignatureHeader() {
|
|
|
415
415
|
return process.env.WEBHOOK_SIGNATURE_HEADER?.trim() || `x-${appKeyPrefix()}-signature`;
|
|
416
416
|
}
|
|
417
417
|
function appDisplayName() {
|
|
418
|
-
return process.env.APP_NAME?.trim() || "
|
|
418
|
+
return process.env.APP_NAME?.trim() || "Strata";
|
|
419
419
|
}
|
|
420
420
|
function appEnv() {
|
|
421
421
|
return process.env.APP_ENV?.trim() || "local";
|
package/dist/index.js
CHANGED
|
@@ -977,7 +977,7 @@ var {RedisClient } = globalThis.Bun;
|
|
|
977
977
|
|
|
978
978
|
// ../../src/core/runtime/appKeyPrefix.ts
|
|
979
979
|
function appKeyPrefix() {
|
|
980
|
-
return process.env.APP_KEY_PREFIX?.trim() || "
|
|
980
|
+
return process.env.APP_KEY_PREFIX?.trim() || "strata";
|
|
981
981
|
}
|
|
982
982
|
function appCookieName(kind) {
|
|
983
983
|
return `${appKeyPrefix()}_${kind}`;
|
|
@@ -6557,9 +6557,19 @@ async function collectQueueMetrics() {
|
|
|
6557
6557
|
};
|
|
6558
6558
|
}
|
|
6559
6559
|
// ../../src/core/scheduler/schedule.ts
|
|
6560
|
+
function isSupportedScheduleExpression(expression) {
|
|
6561
|
+
if (expression === "* * * * *") {
|
|
6562
|
+
return true;
|
|
6563
|
+
}
|
|
6564
|
+
return /^(\*\/\d+)( \*){4}$/.test(expression);
|
|
6565
|
+
}
|
|
6566
|
+
|
|
6560
6567
|
class Schedule {
|
|
6561
6568
|
tasks = [];
|
|
6562
6569
|
command(expression, name, run) {
|
|
6570
|
+
if (!isSupportedScheduleExpression(expression)) {
|
|
6571
|
+
throw new Error(`Unsupported schedule expression "${expression}". Only "* * * * *" and "*/N * * * *" are implemented.`);
|
|
6572
|
+
}
|
|
6563
6573
|
this.tasks.push({ expression, name, run });
|
|
6564
6574
|
return this;
|
|
6565
6575
|
}
|
|
@@ -6569,8 +6579,9 @@ class Schedule {
|
|
|
6569
6579
|
if (task.expression === "* * * * *") {
|
|
6570
6580
|
return true;
|
|
6571
6581
|
}
|
|
6572
|
-
|
|
6573
|
-
|
|
6582
|
+
const intervalMatch = task.expression.match(/^\*\/(\d+)(?: \*){4}$/);
|
|
6583
|
+
if (intervalMatch) {
|
|
6584
|
+
const interval = Number.parseInt(intervalMatch[1] ?? "", 10);
|
|
6574
6585
|
return Number.isInteger(interval) && interval > 0 && minute % interval === 0;
|
|
6575
6586
|
}
|
|
6576
6587
|
return false;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@getstrata/core",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.90",
|
|
4
4
|
"description": "Strata — Laravel-inspired Bun framework public API",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -555,11 +555,6 @@
|
|
|
555
555
|
"import": "./dist/entries/http/validation.js",
|
|
556
556
|
"default": "./dist/entries/http/validation.js"
|
|
557
557
|
},
|
|
558
|
-
"./jobs/dispatchWebhookJob": {
|
|
559
|
-
"types": "./dist/core/jobs/dispatchWebhookJob.d.ts",
|
|
560
|
-
"import": "./dist/entries/jobs/dispatchWebhookJob.js",
|
|
561
|
-
"default": "./dist/entries/jobs/dispatchWebhookJob.js"
|
|
562
|
-
},
|
|
563
558
|
"./jobs/exportAuditLogsJob": {
|
|
564
559
|
"types": "./dist/core/jobs/exportAuditLogsJob.d.ts",
|
|
565
560
|
"import": "./dist/entries/jobs/exportAuditLogsJob.js",
|
|
@@ -843,7 +838,7 @@
|
|
|
843
838
|
"build:bundle": "bun build index.ts --outdir dist --target bun --external bun --external eta",
|
|
844
839
|
"build:types": "tsc -p tsconfig.types.json",
|
|
845
840
|
"prepublishOnly": "bun run build && bun ../../scripts/prepare-core-package-publish.ts",
|
|
846
|
-
"build:subpaths": "bun build entries/auth/accessControl.ts entries/auth/abilityChecker.ts entries/auth/emailVerification.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/intendedUrlCookie.ts entries/auth/passwordConfirmCookie.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/requireVerifiedMiddleware.ts entries/http/requirePasswordConfirmMiddleware.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/frontendMode.ts entries/runtime/asyncContextStore.ts entries/scheduler/schedule.ts entries/scheduler/osCron.ts entries/security/oauthState.ts entries/security/publicReads.ts entries/security/recoveryCodes.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/emailVerification --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/intendedUrlCookie --external @getstrata/core/auth/passwordConfirmCookie --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/requireVerifiedMiddleware --external @getstrata/core/http/requirePasswordConfirmMiddleware --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/frontendMode --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/recoveryCodes --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",
|
|
841
|
+
"build:subpaths": "bun build entries/auth/accessControl.ts entries/auth/abilityChecker.ts entries/auth/emailVerification.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/intendedUrlCookie.ts entries/auth/passwordConfirmCookie.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/requireVerifiedMiddleware.ts entries/http/requirePasswordConfirmMiddleware.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/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/frontendMode.ts entries/runtime/asyncContextStore.ts entries/scheduler/schedule.ts entries/scheduler/osCron.ts entries/security/oauthState.ts entries/security/publicReads.ts entries/security/recoveryCodes.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/emailVerification --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/intendedUrlCookie --external @getstrata/core/auth/passwordConfirmCookie --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/requireVerifiedMiddleware --external @getstrata/core/http/requirePasswordConfirmMiddleware --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/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/frontendMode --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/recoveryCodes --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",
|
|
847
842
|
"build:shims": "bun ../../scripts/write-core-shared-shims.ts"
|
|
848
843
|
},
|
|
849
844
|
"publishConfig": {
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
// ../../src/modules/webhook/dispatchWebhookJob.ts
|
|
3
|
-
import { createHmac } from "crypto";
|
|
4
|
-
import { repositoryConnection as db } from "@getstrata/core/database/repositoryConnection";
|
|
5
|
-
import { BadRequestError } from "@getstrata/core/errors/http";
|
|
6
|
-
import { Job } from "@getstrata/core/queue";
|
|
7
|
-
import { webhookSignatureHeader } from "@getstrata/core/runtime/appKeyPrefix";
|
|
8
|
-
import { safeFetch } from "@getstrata/core/security/safeFetch";
|
|
9
|
-
import { assertSafeOutboundUrl } from "@getstrata/core/security/safeUrl";
|
|
10
|
-
import { resolveTenant } from "@getstrata/core/tenant/resolveTenant";
|
|
11
|
-
import { runWithTenantDatabase } from "@getstrata/core/tenant/tenantDatabaseScope";
|
|
12
|
-
|
|
13
|
-
class DispatchWebhookJob extends Job {
|
|
14
|
-
maxAttempts = 3;
|
|
15
|
-
backoffMs = 2000;
|
|
16
|
-
async handle(payload) {
|
|
17
|
-
const tenantId = Number(payload.tenantId);
|
|
18
|
-
const tenant = await resolveTenant(tenantId) ?? {
|
|
19
|
-
id: tenantId,
|
|
20
|
-
slug: "job",
|
|
21
|
-
plan: "free",
|
|
22
|
-
region: "eu"
|
|
23
|
-
};
|
|
24
|
-
const failure = await runWithTenantDatabase(tenant, async () => await this.deliver(payload));
|
|
25
|
-
if (failure) {
|
|
26
|
-
throw failure;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
async deliver(payload) {
|
|
30
|
-
const queuedUrl = typeof payload.url === "string" ? payload.url : "";
|
|
31
|
-
const queuedSecret = typeof payload.secret === "string" ? payload.secret : "";
|
|
32
|
-
const queued = queuedUrl !== "" && queuedSecret !== "" ? { id: payload.webhookId, url: queuedUrl, secret: queuedSecret } : null;
|
|
33
|
-
const rows = queued ? [] : await db`
|
|
34
|
-
SELECT id, url, secret
|
|
35
|
-
FROM webhook
|
|
36
|
-
WHERE id = ${payload.webhookId} AND active = TRUE
|
|
37
|
-
LIMIT 1
|
|
38
|
-
`;
|
|
39
|
-
const webhook = queued ?? rows[0];
|
|
40
|
-
if (!webhook) {
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
const body = JSON.stringify({ event: payload.event, payload: payload.payload });
|
|
44
|
-
const signature = createHmac("sha256", webhook.secret).update(body).digest("hex");
|
|
45
|
-
const allowHttp = (process.env.APP_ENV ?? "local") !== "production";
|
|
46
|
-
const signatureHeader = webhookSignatureHeader();
|
|
47
|
-
let responseStatus = null;
|
|
48
|
-
let errorMessage = null;
|
|
49
|
-
try {
|
|
50
|
-
assertSafeOutboundUrl(webhook.url, { allowHttp });
|
|
51
|
-
const response = await safeFetch(webhook.url, {
|
|
52
|
-
method: "POST",
|
|
53
|
-
headers: {
|
|
54
|
-
"content-type": "application/json",
|
|
55
|
-
[signatureHeader]: signature
|
|
56
|
-
},
|
|
57
|
-
body
|
|
58
|
-
}, { allowHttp });
|
|
59
|
-
responseStatus = response.status;
|
|
60
|
-
if (!response.ok) {
|
|
61
|
-
throw new Error(`Webhook delivery failed with status ${response.status}.`);
|
|
62
|
-
}
|
|
63
|
-
} catch (error) {
|
|
64
|
-
errorMessage = error instanceof Error ? error.message : String(error);
|
|
65
|
-
await db`
|
|
66
|
-
INSERT INTO webhook_delivery (webhook_id, event, payload, response_status, error)
|
|
67
|
-
VALUES (
|
|
68
|
-
${webhook.id},
|
|
69
|
-
${payload.event},
|
|
70
|
-
${JSON.stringify(payload.payload)}::jsonb,
|
|
71
|
-
${responseStatus},
|
|
72
|
-
${errorMessage}
|
|
73
|
-
)
|
|
74
|
-
`;
|
|
75
|
-
if (error instanceof BadRequestError) {
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
return error instanceof Error ? error : new Error(errorMessage);
|
|
79
|
-
}
|
|
80
|
-
await db`
|
|
81
|
-
INSERT INTO webhook_delivery (webhook_id, event, payload, response_status)
|
|
82
|
-
VALUES (
|
|
83
|
-
${webhook.id},
|
|
84
|
-
${payload.event},
|
|
85
|
-
${JSON.stringify(payload.payload)}::jsonb,
|
|
86
|
-
${responseStatus}
|
|
87
|
-
)
|
|
88
|
-
`;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
export {
|
|
92
|
-
DispatchWebhookJob
|
|
93
|
-
};
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { Job } from "@getstrata/core/queue";
|
|
2
|
-
interface DispatchWebhookPayload {
|
|
3
|
-
webhookId: number;
|
|
4
|
-
tenantId: number;
|
|
5
|
-
event: string;
|
|
6
|
-
payload: Record<string, unknown>;
|
|
7
|
-
url?: string;
|
|
8
|
-
secret?: string;
|
|
9
|
-
}
|
|
10
|
-
declare class DispatchWebhookJob extends Job<DispatchWebhookPayload> {
|
|
11
|
-
readonly maxAttempts = 3;
|
|
12
|
-
readonly backoffMs = 2000;
|
|
13
|
-
handle(payload: DispatchWebhookPayload): Promise<void>;
|
|
14
|
-
private deliver;
|
|
15
|
-
}
|
|
16
|
-
export { DispatchWebhookJob };
|
|
17
|
-
export default DispatchWebhookJob;
|
|
18
|
-
export type { DispatchWebhookPayload };
|