Tactical Media Broadcast Hub — initial release
Self-hosted multi-platform broadcast newsroom for activist collectives: publishing pipeline with group approval and DST-proof scheduling, TweetDeck-style column wall with hostile-content-safe rendering, live control room with Auto Director, bridged chat governance with polls and quorum, distributed sandboxed transcode workers, encrypted content-addressed archive, monthly analytics. MIT licensed. See README.md and docs/.
This commit is contained in:
commit
aa5e262f3a
880 changed files with 111042 additions and 0 deletions
8
apps/scheduler/src/workflows/index.ts
Normal file
8
apps/scheduler/src/workflows/index.ts
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
/**
|
||||
* Workflow entrypoints the scheduler worker registers. One file keeps the
|
||||
* worker's workflow bundle small: publish.workflow.js stays the only publishing
|
||||
* entrypoint, and the director evaluator joins it without a second Worker
|
||||
* instance. Both are pure re-exports so bundling stays stable.
|
||||
*/
|
||||
export * from "./publish.workflow.js";
|
||||
export * from "../director/evaluator.workflow.js";
|
||||
14
apps/scheduler/src/workflows/publish.workflow.ts
Normal file
14
apps/scheduler/src/workflows/publish.workflow.ts
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
import { proxyActivities, sleep } from "@temporalio/workflow";
|
||||
import type { AttemptRef } from "@tactical-media-broadcast-hub/publishing-execution";
|
||||
import type { PublishActivity, ActivityOutcome } from "../activities/publish.activity.js";
|
||||
const { publishScheduled } = proxyActivities<Pick<PublishActivity, "publishScheduled">>({
|
||||
startToCloseTimeout: "60 seconds", heartbeatTimeout: "10 seconds",
|
||||
retry: { initialInterval: "1 second", maximumInterval: "30 seconds", maximumAttempts: 5 },
|
||||
});
|
||||
export async function scheduledPublish(ref: AttemptRef): Promise<ActivityOutcome> {
|
||||
for (;;) {
|
||||
const outcome = await publishScheduled(ref);
|
||||
if (outcome.kind !== "wait") return outcome;
|
||||
await sleep(Math.max(1000, Date.parse(outcome.until) - Date.now()));
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue