@smthrs/triggers 0.0.0-stage → 1.0.0-rc.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +219 -0
- package/LICENSE +21 -0
- package/README.md +109 -2
- package/dist/cjs/CatchUp.d.ts +25 -0
- package/dist/cjs/CatchUp.d.ts.map +1 -0
- package/dist/cjs/CatchUp.js +72 -0
- package/dist/cjs/CatchUp.js.map +7 -0
- package/dist/cjs/Channel.d.ts +108 -0
- package/dist/cjs/Channel.d.ts.map +1 -0
- package/dist/cjs/Channel.js +25 -0
- package/dist/cjs/Channel.js.map +7 -0
- package/dist/cjs/ClaimDecision.d.ts +183 -0
- package/dist/cjs/ClaimDecision.d.ts.map +1 -0
- package/dist/cjs/ClaimDecision.js +144 -0
- package/dist/cjs/ClaimDecision.js.map +7 -0
- package/dist/cjs/Cron.d.ts +91 -0
- package/dist/cjs/Cron.d.ts.map +1 -0
- package/dist/cjs/Cron.js +108 -0
- package/dist/cjs/Cron.js.map +7 -0
- package/dist/cjs/DispatchReader.d.ts +77 -0
- package/dist/cjs/DispatchReader.d.ts.map +1 -0
- package/dist/cjs/DispatchReader.js +121 -0
- package/dist/cjs/DispatchReader.js.map +7 -0
- package/dist/cjs/Overlap.d.ts +40 -0
- package/dist/cjs/Overlap.d.ts.map +1 -0
- package/dist/cjs/Overlap.js +37 -0
- package/dist/cjs/Overlap.js.map +7 -0
- package/dist/cjs/Schedule.d.ts +96 -0
- package/dist/cjs/Schedule.d.ts.map +1 -0
- package/dist/cjs/Schedule.js +61 -0
- package/dist/cjs/Schedule.js.map +7 -0
- package/dist/cjs/Scheduler.d.ts +248 -0
- package/dist/cjs/Scheduler.d.ts.map +1 -0
- package/dist/cjs/Scheduler.js +647 -0
- package/dist/cjs/Scheduler.js.map +7 -0
- package/dist/cjs/SqlTriggerStore.d.ts +29 -0
- package/dist/cjs/SqlTriggerStore.d.ts.map +1 -0
- package/dist/cjs/SqlTriggerStore.js +483 -0
- package/dist/cjs/SqlTriggerStore.js.map +7 -0
- package/dist/cjs/Trigger.d.ts +81 -0
- package/dist/cjs/Trigger.d.ts.map +1 -0
- package/dist/cjs/Trigger.js +54 -0
- package/dist/cjs/Trigger.js.map +7 -0
- package/dist/cjs/TriggerError.d.ts +58 -0
- package/dist/cjs/TriggerError.d.ts.map +1 -0
- package/dist/cjs/TriggerError.js +83 -0
- package/dist/cjs/TriggerError.js.map +7 -0
- package/dist/cjs/TriggerStore.d.ts +411 -0
- package/dist/cjs/TriggerStore.d.ts.map +1 -0
- package/dist/cjs/TriggerStore.js +127 -0
- package/dist/cjs/TriggerStore.js.map +7 -0
- package/dist/cjs/Webhook.d.ts +118 -0
- package/dist/cjs/Webhook.d.ts.map +1 -0
- package/dist/cjs/Webhook.js +153 -0
- package/dist/cjs/Webhook.js.map +7 -0
- package/dist/cjs/index.d.ts +30 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +57 -0
- package/dist/cjs/index.js.map +7 -0
- package/dist/cjs/internal/ActiveRuns.d.ts +51 -0
- package/dist/cjs/internal/ActiveRuns.d.ts.map +1 -0
- package/dist/cjs/internal/ActiveRuns.js +56 -0
- package/dist/cjs/internal/ActiveRuns.js.map +7 -0
- package/dist/cjs/internal/DueOccurrences.d.ts +32 -0
- package/dist/cjs/internal/DueOccurrences.d.ts.map +1 -0
- package/dist/cjs/internal/DueOccurrences.js +80 -0
- package/dist/cjs/internal/DueOccurrences.js.map +7 -0
- package/dist/cjs/internal/WallClock.d.ts +59 -0
- package/dist/cjs/internal/WallClock.d.ts.map +1 -0
- package/dist/cjs/internal/WallClock.js +132 -0
- package/dist/cjs/internal/WallClock.js.map +7 -0
- package/dist/cjs/migrations/0001_triggers.d.ts +15 -0
- package/dist/cjs/migrations/0001_triggers.d.ts.map +1 -0
- package/dist/cjs/migrations/0001_triggers.js +64 -0
- package/dist/cjs/migrations/0001_triggers.js.map +7 -0
- package/dist/cjs/migrations/0002_reservation_lease.d.ts +15 -0
- package/dist/cjs/migrations/0002_reservation_lease.d.ts.map +1 -0
- package/dist/cjs/migrations/0002_reservation_lease.js +41 -0
- package/dist/cjs/migrations/0002_reservation_lease.js.map +7 -0
- package/dist/cjs/migrations/0003_heartbeat.d.ts +16 -0
- package/dist/cjs/migrations/0003_heartbeat.d.ts.map +1 -0
- package/dist/cjs/migrations/0003_heartbeat.js +44 -0
- package/dist/cjs/migrations/0003_heartbeat.js.map +7 -0
- package/dist/cjs/migrations/0004_fire_run_index.d.ts +17 -0
- package/dist/cjs/migrations/0004_fire_run_index.d.ts.map +1 -0
- package/dist/cjs/migrations/0004_fire_run_index.js +40 -0
- package/dist/cjs/migrations/0004_fire_run_index.js.map +7 -0
- package/dist/cjs/migrations/index.d.ts +33 -0
- package/dist/cjs/migrations/index.d.ts.map +1 -0
- package/dist/cjs/migrations/index.js +50 -0
- package/dist/cjs/migrations/index.js.map +7 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/test/TestTriggers.d.ts +12 -0
- package/dist/cjs/test/TestTriggers.d.ts.map +1 -0
- package/dist/cjs/test/TestTriggers.js +421 -0
- package/dist/cjs/test/TestTriggers.js.map +7 -0
- package/dist/esm/CatchUp.d.ts +25 -0
- package/dist/esm/CatchUp.d.ts.map +1 -0
- package/dist/esm/CatchUp.js +52 -0
- package/dist/esm/CatchUp.js.map +1 -0
- package/dist/esm/Channel.d.ts +108 -0
- package/dist/esm/Channel.d.ts.map +1 -0
- package/dist/esm/Channel.js +19 -0
- package/dist/esm/Channel.js.map +1 -0
- package/dist/esm/ClaimDecision.d.ts +183 -0
- package/dist/esm/ClaimDecision.d.ts.map +1 -0
- package/dist/esm/ClaimDecision.js +172 -0
- package/dist/esm/ClaimDecision.js.map +1 -0
- package/dist/esm/Cron.d.ts +91 -0
- package/dist/esm/Cron.d.ts.map +1 -0
- package/dist/esm/Cron.js +132 -0
- package/dist/esm/Cron.js.map +1 -0
- package/dist/esm/DispatchReader.d.ts +77 -0
- package/dist/esm/DispatchReader.d.ts.map +1 -0
- package/dist/esm/DispatchReader.js +152 -0
- package/dist/esm/DispatchReader.js.map +1 -0
- package/dist/esm/Overlap.d.ts +40 -0
- package/dist/esm/Overlap.d.ts.map +1 -0
- package/dist/esm/Overlap.js +31 -0
- package/dist/esm/Overlap.js.map +1 -0
- package/dist/esm/Schedule.d.ts +96 -0
- package/dist/esm/Schedule.d.ts.map +1 -0
- package/dist/esm/Schedule.js +73 -0
- package/dist/esm/Schedule.js.map +1 -0
- package/dist/esm/Scheduler.d.ts +248 -0
- package/dist/esm/Scheduler.d.ts.map +1 -0
- package/dist/esm/Scheduler.js +734 -0
- package/dist/esm/Scheduler.js.map +1 -0
- package/dist/esm/SqlTriggerStore.d.ts +29 -0
- package/dist/esm/SqlTriggerStore.d.ts.map +1 -0
- package/dist/esm/SqlTriggerStore.js +483 -0
- package/dist/esm/SqlTriggerStore.js.map +1 -0
- package/dist/esm/Trigger.d.ts +81 -0
- package/dist/esm/Trigger.d.ts.map +1 -0
- package/dist/esm/Trigger.js +56 -0
- package/dist/esm/Trigger.js.map +1 -0
- package/dist/esm/TriggerError.d.ts +58 -0
- package/dist/esm/TriggerError.d.ts.map +1 -0
- package/dist/esm/TriggerError.js +110 -0
- package/dist/esm/TriggerError.js.map +1 -0
- package/dist/esm/TriggerStore.d.ts +411 -0
- package/dist/esm/TriggerStore.d.ts.map +1 -0
- package/dist/esm/TriggerStore.js +209 -0
- package/dist/esm/TriggerStore.js.map +1 -0
- package/dist/esm/Webhook.d.ts +118 -0
- package/dist/esm/Webhook.d.ts.map +1 -0
- package/dist/esm/Webhook.js +186 -0
- package/dist/esm/Webhook.js.map +1 -0
- package/dist/esm/index.d.ts +30 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +30 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/internal/ActiveRuns.d.ts +51 -0
- package/dist/esm/internal/ActiveRuns.d.ts.map +1 -0
- package/dist/esm/internal/ActiveRuns.js +34 -0
- package/dist/esm/internal/ActiveRuns.js.map +1 -0
- package/dist/esm/internal/DueOccurrences.d.ts +32 -0
- package/dist/esm/internal/DueOccurrences.d.ts.map +1 -0
- package/dist/esm/internal/DueOccurrences.js +55 -0
- package/dist/esm/internal/DueOccurrences.js.map +1 -0
- package/dist/esm/internal/WallClock.d.ts +59 -0
- package/dist/esm/internal/WallClock.d.ts.map +1 -0
- package/dist/esm/internal/WallClock.js +155 -0
- package/dist/esm/internal/WallClock.js.map +1 -0
- package/dist/esm/migrations/0001_triggers.d.ts +15 -0
- package/dist/esm/migrations/0001_triggers.d.ts.map +1 -0
- package/dist/esm/migrations/0001_triggers.js +42 -0
- package/dist/esm/migrations/0001_triggers.js.map +1 -0
- package/dist/esm/migrations/0002_reservation_lease.d.ts +15 -0
- package/dist/esm/migrations/0002_reservation_lease.d.ts.map +1 -0
- package/dist/esm/migrations/0002_reservation_lease.js +19 -0
- package/dist/esm/migrations/0002_reservation_lease.js.map +1 -0
- package/dist/esm/migrations/0003_heartbeat.d.ts +16 -0
- package/dist/esm/migrations/0003_heartbeat.d.ts.map +1 -0
- package/dist/esm/migrations/0003_heartbeat.js +23 -0
- package/dist/esm/migrations/0003_heartbeat.js.map +1 -0
- package/dist/esm/migrations/0004_fire_run_index.d.ts +17 -0
- package/dist/esm/migrations/0004_fire_run_index.d.ts.map +1 -0
- package/dist/esm/migrations/0004_fire_run_index.js +20 -0
- package/dist/esm/migrations/0004_fire_run_index.js.map +1 -0
- package/dist/esm/migrations/index.d.ts +33 -0
- package/dist/esm/migrations/index.d.ts.map +1 -0
- package/dist/esm/migrations/index.js +37 -0
- package/dist/esm/migrations/index.js.map +1 -0
- package/dist/esm/test/TestTriggers.d.ts +12 -0
- package/dist/esm/test/TestTriggers.d.ts.map +1 -0
- package/dist/esm/test/TestTriggers.js +439 -0
- package/dist/esm/test/TestTriggers.js.map +1 -0
- package/docs/README.md +140 -0
- package/docs/api.md +1186 -0
- package/docs/concepts/channels.md +103 -0
- package/docs/concepts/claim-protocol.md +229 -0
- package/docs/concepts/policies.md +124 -0
- package/docs/concepts/schedules.md +134 -0
- package/docs/guides/choose-a-policy.md +113 -0
- package/docs/guides/declare-a-trigger.md +136 -0
- package/docs/guides/ingest-a-webhook.md +164 -0
- package/docs/guides/run-the-scheduler.md +173 -0
- package/docs/guides/testing.md +157 -0
- package/docs/installation.md +81 -0
- package/docs/quickstart.md +163 -0
- package/docs/troubleshooting.md +281 -0
- package/package.json +241 -3
- package/src/CatchUp.ts +73 -0
- package/src/Channel.ts +121 -0
- package/src/ClaimDecision.ts +303 -0
- package/src/Cron.ts +173 -0
- package/src/DispatchReader.ts +179 -0
- package/src/Overlap.ts +53 -0
- package/src/Schedule.ts +112 -0
- package/src/Scheduler.ts +1154 -0
- package/src/SqlTriggerStore.ts +638 -0
- package/src/Trigger.ts +84 -0
- package/src/TriggerError.ts +129 -0
- package/src/TriggerStore.ts +514 -0
- package/src/Webhook.ts +270 -0
- package/src/index.ts +30 -0
- package/src/internal/ActiveRuns.ts +83 -0
- package/src/internal/DueOccurrences.ts +101 -0
- package/src/internal/WallClock.ts +172 -0
- package/src/migrations/0001_triggers.ts +43 -0
- package/src/migrations/0002_reservation_lease.ts +20 -0
- package/src/migrations/0003_heartbeat.ts +24 -0
- package/src/migrations/0004_fire_run_index.ts +21 -0
- package/src/migrations/index.ts +40 -0
- package/src/test/TestTriggers.ts +563 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** @since 0.1.0 */
|
|
2
|
+
|
|
3
|
+
import * as Dialect from "@smthrs/database/Dialect"
|
|
4
|
+
import * as Effect from "effect/Effect"
|
|
5
|
+
import * as SqlClient from "effect/unstable/sql/SqlClient"
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Creates the `flows_triggers` and `flows_trigger_fires` tables.
|
|
9
|
+
*
|
|
10
|
+
* A named export rather than `export default`: the CommonJS build reads a
|
|
11
|
+
* default import of a sibling module as the whole exports object, so the
|
|
12
|
+
* migrator received `{ default }` instead of this Effect.
|
|
13
|
+
*
|
|
14
|
+
* @category migrations
|
|
15
|
+
* @since 0.1.0
|
|
16
|
+
*/
|
|
17
|
+
export const triggers: Effect.Effect<void, unknown, SqlClient.SqlClient> = Effect.gen(function*() {
|
|
18
|
+
const sql = yield* SqlClient.SqlClient
|
|
19
|
+
yield* sql`CREATE TABLE IF NOT EXISTS flows_triggers (
|
|
20
|
+
trigger_id TEXT PRIMARY KEY,
|
|
21
|
+
flow_id TEXT NOT NULL,
|
|
22
|
+
input_json TEXT NOT NULL,
|
|
23
|
+
cron TEXT NOT NULL,
|
|
24
|
+
timezone TEXT,
|
|
25
|
+
overlap TEXT NOT NULL CHECK (overlap IN ('skip', 'buffer-one', 'supersede')),
|
|
26
|
+
catch_up TEXT NOT NULL CHECK (catch_up IN ('none', 'one', 'all')),
|
|
27
|
+
max_catch_up ${Dialect.integer(sql)} NOT NULL CHECK (max_catch_up >= 0),
|
|
28
|
+
enabled ${Dialect.integer(sql)} NOT NULL CHECK (enabled IN (0, 1)),
|
|
29
|
+
revision ${Dialect.integer(sql)} NOT NULL,
|
|
30
|
+
last_fired_at_ms ${Dialect.integer(sql)},
|
|
31
|
+
pending_at_ms ${Dialect.integer(sql)},
|
|
32
|
+
active_run_id TEXT
|
|
33
|
+
)`
|
|
34
|
+
yield* sql`CREATE TABLE IF NOT EXISTS flows_trigger_fires (
|
|
35
|
+
trigger_id TEXT NOT NULL,
|
|
36
|
+
occurrence_at_ms ${Dialect.integer(sql)} NOT NULL,
|
|
37
|
+
outcome TEXT,
|
|
38
|
+
run_id TEXT,
|
|
39
|
+
error TEXT,
|
|
40
|
+
PRIMARY KEY (trigger_id, occurrence_at_ms),
|
|
41
|
+
FOREIGN KEY (trigger_id) REFERENCES flows_triggers (trigger_id)
|
|
42
|
+
)`
|
|
43
|
+
})
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** @since 0.1.0 */
|
|
2
|
+
|
|
3
|
+
import * as Dialect from "@smthrs/database/Dialect"
|
|
4
|
+
import * as Effect from "effect/Effect"
|
|
5
|
+
import * as SqlClient from "effect/unstable/sql/SqlClient"
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Adds `active_claimed_at_ms`, the lease start of a launch reservation.
|
|
9
|
+
*
|
|
10
|
+
* A named export rather than `export default`: the CommonJS build reads a
|
|
11
|
+
* default import of a sibling module as the whole exports object, so the
|
|
12
|
+
* migrator received `{ default }` instead of this Effect.
|
|
13
|
+
*
|
|
14
|
+
* @category migrations
|
|
15
|
+
* @since 0.1.0
|
|
16
|
+
*/
|
|
17
|
+
export const reservationLease: Effect.Effect<void, unknown, SqlClient.SqlClient> = Effect.gen(function*() {
|
|
18
|
+
const sql = yield* SqlClient.SqlClient
|
|
19
|
+
yield* sql`ALTER TABLE flows_triggers ADD COLUMN active_claimed_at_ms ${Dialect.integer(sql)}`
|
|
20
|
+
})
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** @since 1.0.0-rc.0 */
|
|
2
|
+
|
|
3
|
+
import * as Dialect from "@smthrs/database/Dialect"
|
|
4
|
+
import * as Effect from "effect/Effect"
|
|
5
|
+
import * as SqlClient from "effect/unstable/sql/SqlClient"
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Creates `flows_scheduler_heartbeat`, one row per scheduler host holding the
|
|
9
|
+
* last poll it recorded, so a listing can say whether anything is listening.
|
|
10
|
+
*
|
|
11
|
+
* A named export rather than `export default`: the CommonJS build reads a
|
|
12
|
+
* default import of a sibling module as the whole exports object, so the
|
|
13
|
+
* migrator received `{ default }` instead of this Effect.
|
|
14
|
+
*
|
|
15
|
+
* @category migrations
|
|
16
|
+
* @since 1.0.0-rc.0
|
|
17
|
+
*/
|
|
18
|
+
export const schedulerHeartbeat: Effect.Effect<void, unknown, SqlClient.SqlClient> = Effect.gen(function*() {
|
|
19
|
+
const sql = yield* SqlClient.SqlClient
|
|
20
|
+
yield* sql`CREATE TABLE IF NOT EXISTS flows_scheduler_heartbeat (
|
|
21
|
+
host TEXT PRIMARY KEY,
|
|
22
|
+
ticked_at_ms ${Dialect.integer(sql)} NOT NULL
|
|
23
|
+
)`
|
|
24
|
+
})
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** @since 1.0.0-rc.1 */
|
|
2
|
+
|
|
3
|
+
import * as Effect from "effect/Effect"
|
|
4
|
+
import * as SqlClient from "effect/unstable/sql/SqlClient"
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Indexes `flows_trigger_fires` by `run_id`, so a fires listing filtered to
|
|
8
|
+
* one run and the prune's active-run check read an index instead of the
|
|
9
|
+
* whole ledger.
|
|
10
|
+
*
|
|
11
|
+
* A named export rather than `export default`: the CommonJS build reads a
|
|
12
|
+
* default import of a sibling module as the whole exports object, so the
|
|
13
|
+
* migrator received `{ default }` instead of this Effect.
|
|
14
|
+
*
|
|
15
|
+
* @category migrations
|
|
16
|
+
* @since 1.0.0-rc.1
|
|
17
|
+
*/
|
|
18
|
+
export const fireRunIndex: Effect.Effect<void, unknown, SqlClient.SqlClient> = Effect.gen(function*() {
|
|
19
|
+
const sql = yield* SqlClient.SqlClient
|
|
20
|
+
yield* sql`CREATE INDEX IF NOT EXISTS flows_trigger_fires_run_id ON flows_trigger_fires (run_id)`
|
|
21
|
+
})
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/** @since 0.1.0 */
|
|
2
|
+
|
|
3
|
+
import * as Layer from "effect/Layer"
|
|
4
|
+
import * as Migrator from "effect/unstable/sql/Migrator"
|
|
5
|
+
import { triggers } from "./0001_triggers.ts"
|
|
6
|
+
import { reservationLease } from "./0002_reservation_lease.ts"
|
|
7
|
+
import { schedulerHeartbeat } from "./0003_heartbeat.ts"
|
|
8
|
+
import { fireRunIndex } from "./0004_fire_run_index.ts"
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* The migration record {@link run} applies, keyed by migration file name.
|
|
12
|
+
*
|
|
13
|
+
* Exported so a test and the release smoke can assert that every entry is the
|
|
14
|
+
* migration Effect itself in both the ESM and the CommonJS build.
|
|
15
|
+
*
|
|
16
|
+
* @category migrations
|
|
17
|
+
* @since 1.0.0-rc.0
|
|
18
|
+
*/
|
|
19
|
+
export const migrations = {
|
|
20
|
+
"0001_triggers": triggers,
|
|
21
|
+
"0002_reservation_lease": reservationLease,
|
|
22
|
+
"0003_heartbeat": schedulerHeartbeat,
|
|
23
|
+
"0004_fire_run_index": fireRunIndex
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Applies the triggers schema migrations.
|
|
28
|
+
*
|
|
29
|
+
* @category migrations
|
|
30
|
+
* @since 0.1.0
|
|
31
|
+
*/
|
|
32
|
+
export const run = Migrator.make({})({ loader: Migrator.fromRecord(migrations), table: "flows_trigger_migrations" })
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Runs {@link run} once as a layer.
|
|
36
|
+
*
|
|
37
|
+
* @category layers
|
|
38
|
+
* @since 0.1.0
|
|
39
|
+
*/
|
|
40
|
+
export const layer = Layer.effectDiscard(run)
|