mirror of
https://github.com/Dvorinka/Primora.git
synced 2026-10-28 07:41:23 +00:00
Scheduled jobs (migration 00009): cron expressions + @every descriptors, in-process scheduler (15s scan, missed-run collapse), signed HTTP POST delivery (X-Primora-Signature), AES-256-GCM sealed secrets returned once, run history with status/duration/http-code, manual execution, retention pruning. Viewer reads, admin/developer writes. Domain events: publishEvent fans document/object/issue/deploy/job mutations to realtime subscribers and matching webhooks through one path. Webhook event filter extended to job.run, document.*, object.*. Realtime: GET /projects/:id/realtime/stream SSE with 25s keepalives and ?token=/?api_key= auth for EventSource clients. Automation dashboard page: Schedules tab (CRUD, run history, manual run, secret-once banner) + Live events tab (live badge, pause/clear). Demo mode parity. primora jobs:* CLI group, six primora_*_job* MCP tools, AutomationService in the generated client. Fixes folded in: gzip middleware buffered SSE flushes (broke EventSource on both streams — */stream now bypasses compression); event payloads double-marshaled json.RawMessage as base64; compose hardcoded localhost trusted origins so non-default ports broke sign-in; frontend auth base URL baked an absolute localhost instead of resolving /auth on origin. Verified live: stack up on :8085, signed delivery HMAC-checked at sink, @every 30s schedule firing, run history rendering, document.created landing in the live events feed. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
35 lines
1015 B
TypeScript
35 lines
1015 B
TypeScript
import { createAuthClient } from "better-auth/solid";
|
|
import { adminClient } from "better-auth/client/plugins";
|
|
|
|
// Same-origin default — nginx routes /auth to the auth service at whatever
|
|
// port or domain serves the app. better-auth requires an absolute baseURL, so
|
|
// resolve it against the runtime origin; VITE_AUTH_BASE_URL overrides for
|
|
// split-origin setups.
|
|
const baseURL =
|
|
import.meta.env.VITE_AUTH_BASE_URL ?? new URL("/auth", window.location.origin).href;
|
|
|
|
export const authClient = createAuthClient({
|
|
baseURL,
|
|
plugins: [adminClient()],
|
|
});
|
|
|
|
export async function fetchApiToken() {
|
|
const response = await fetch(`${baseURL}/token`, {
|
|
credentials: "include",
|
|
headers: {
|
|
accept: "application/json",
|
|
},
|
|
});
|
|
|
|
if (response.status === 401 || response.status === 403) {
|
|
return undefined;
|
|
}
|
|
|
|
if (!response.ok) {
|
|
throw new Error(`Failed to fetch API token (${response.status})`);
|
|
}
|
|
|
|
const data = (await response.json()) as { token: string };
|
|
return data.token;
|
|
}
|