@knpkv/herdr-fleet 0.2.0

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/dist/store.js ADDED
@@ -0,0 +1,209 @@
1
+ import { Effect, FileSystem, Path, Schema } from "effect";
2
+ import { DatabaseSync } from "node:sqlite";
3
+ import { FleetJobConflictError, FleetStoreError, FleetTransitionConflictError } from "./errors.js";
4
+ import { JobRecord } from "./model.js";
5
+ const storeError = (operation) => (cause) => new FleetStoreError({ operation, detail: String(cause), cause });
6
+ const decodeRecord = (text) => Effect.try({
7
+ try: () => Schema.decodeUnknownSync(JobRecord)(JSON.parse(text)),
8
+ catch: storeError("decode")
9
+ });
10
+ const encodeRecord = (record) => JSON.stringify(Schema.encodeSync(JobRecord)(record));
11
+ const decodeRows = (operation, rows) => Effect.forEach(rows, (row) => Schema.decodeUnknownEffect(Schema.Struct({ record: Schema.String }))(row).pipe(Effect.mapError(storeError(operation)), Effect.flatMap(({ record }) => decodeRecord(record))));
12
+ export class JobStore {
13
+ #database;
14
+ #fileSystem;
15
+ path;
16
+ constructor(path, fileSystem) {
17
+ this.path = path;
18
+ this.#fileSystem = fileSystem;
19
+ this.#database = new DatabaseSync(path);
20
+ try {
21
+ this.#database.exec(`
22
+ PRAGMA journal_mode = WAL;
23
+ CREATE TABLE IF NOT EXISTS jobs (
24
+ id TEXT PRIMARY KEY,
25
+ created_at INTEGER NOT NULL,
26
+ record TEXT NOT NULL
27
+ );
28
+ CREATE INDEX IF NOT EXISTS jobs_record_status_idx ON jobs (
29
+ CASE
30
+ WHEN json_valid(record)
31
+ THEN json_extract(record, '$.status')
32
+ END
33
+ );
34
+ `);
35
+ }
36
+ catch (error) {
37
+ this.#database.close();
38
+ throw error;
39
+ }
40
+ }
41
+ static open = Effect.fn("JobStore.open")(function* (path) {
42
+ const fileSystem = yield* FileSystem.FileSystem;
43
+ const paths = yield* Path.Path;
44
+ const directory = paths.dirname(path);
45
+ yield* fileSystem.makeDirectory(directory, { recursive: true, mode: 0o700 }).pipe(Effect.mapError(storeError("open.makeDirectory")));
46
+ yield* fileSystem.chmod(directory, 0o700).pipe(Effect.mapError(storeError("open.secureDirectory")));
47
+ const store = yield* Effect.try({
48
+ try: () => new JobStore(path, fileSystem),
49
+ catch: storeError("open.database")
50
+ });
51
+ yield* store.secureFiles();
52
+ return store;
53
+ });
54
+ put = Effect.fn("JobStore.put")(function* (record) {
55
+ const database = this.#database;
56
+ const inserted = yield* Effect.try({
57
+ try: () => database
58
+ .prepare("INSERT OR IGNORE INTO jobs (id, created_at, record) VALUES (?, ?, ?)")
59
+ .run(record.id, record.createdAt, encodeRecord(record)).changes,
60
+ catch: storeError("put")
61
+ });
62
+ if (inserted !== 1) {
63
+ return yield* new FleetJobConflictError({ jobId: record.id });
64
+ }
65
+ yield* this.secureFiles();
66
+ return record;
67
+ });
68
+ transition = Effect.fn("JobStore.transition")(function* (current, next) {
69
+ const database = this.#database;
70
+ const changed = yield* Effect.try({
71
+ try: () => database
72
+ .prepare(`
73
+ UPDATE jobs
74
+ SET record = ?
75
+ WHERE id = ?
76
+ AND record = ?
77
+ `)
78
+ .run(encodeRecord(next), current.id, encodeRecord(current)).changes,
79
+ catch: storeError("transition")
80
+ });
81
+ if (changed !== 1) {
82
+ return yield* new FleetTransitionConflictError({ jobId: current.id });
83
+ }
84
+ yield* this.secureFiles();
85
+ return next;
86
+ });
87
+ get = Effect.fn("JobStore.get")(function* (id) {
88
+ const database = this.#database;
89
+ const row = yield* Effect.try({
90
+ try: () => database.prepare("SELECT record FROM jobs WHERE id = ?").get(id),
91
+ catch: storeError("get")
92
+ });
93
+ if (row === undefined)
94
+ return undefined;
95
+ const stored = yield* Schema.decodeUnknownEffect(Schema.Struct({ record: Schema.String }))(row).pipe(Effect.mapError(storeError("get")));
96
+ return yield* decodeRecord(stored.record);
97
+ });
98
+ list = Effect.fn("JobStore.list")(function* (limit) {
99
+ const database = this.#database;
100
+ const rows = yield* Effect.try({
101
+ try: () => database
102
+ .prepare("SELECT record FROM jobs ORDER BY created_at DESC LIMIT ?")
103
+ .all(limit),
104
+ catch: storeError("list")
105
+ });
106
+ return yield* decodeRows("list", rows);
107
+ });
108
+ listPending = Effect.fn("JobStore.listPending")(function* (cursor, limit) {
109
+ const database = this.#database;
110
+ const rows = yield* Effect.try({
111
+ try: () => cursor === null
112
+ ? database.prepare(`
113
+ SELECT record
114
+ FROM jobs
115
+ WHERE CASE
116
+ WHEN json_valid(record)
117
+ THEN json_extract(record, '$.status')
118
+ END = ?
119
+ ORDER BY created_at DESC, id DESC
120
+ LIMIT ?
121
+ `).all("pending_approval", limit)
122
+ : database.prepare(`
123
+ SELECT record
124
+ FROM jobs
125
+ WHERE CASE
126
+ WHEN json_valid(record)
127
+ THEN json_extract(record, '$.status')
128
+ END = ?
129
+ AND (created_at < ? OR (created_at = ? AND id < ?))
130
+ ORDER BY created_at DESC, id DESC
131
+ LIMIT ?
132
+ `).all("pending_approval", cursor.createdAt, cursor.createdAt, cursor.id, limit),
133
+ catch: storeError("listPending")
134
+ });
135
+ return yield* decodeRows("listPending", rows);
136
+ });
137
+ listHistory = Effect.fn("JobStore.listHistory")(function* (cursor, limit) {
138
+ const database = this.#database;
139
+ const rows = yield* Effect.try({
140
+ try: () => cursor === null
141
+ ? database.prepare(`
142
+ SELECT record
143
+ FROM jobs
144
+ ORDER BY created_at DESC, id DESC
145
+ LIMIT ?
146
+ `).all(limit)
147
+ : database.prepare(`
148
+ SELECT record
149
+ FROM jobs
150
+ WHERE created_at < ? OR (created_at = ? AND id < ?)
151
+ ORDER BY created_at DESC, id DESC
152
+ LIMIT ?
153
+ `).all(cursor.createdAt, cursor.createdAt, cursor.id, limit),
154
+ catch: storeError("listHistory")
155
+ });
156
+ return yield* decodeRows("listHistory", rows);
157
+ });
158
+ listRecoverable = Effect.fn("JobStore.listRecoverable")(function* () {
159
+ const database = this.#database;
160
+ const rows = yield* Effect.try({
161
+ try: () => database
162
+ .prepare(`
163
+ SELECT record
164
+ FROM jobs
165
+ WHERE CASE
166
+ WHEN json_valid(record)
167
+ THEN json_extract(record, '$.status')
168
+ END IN (?, ?, ?)
169
+ ORDER BY created_at ASC
170
+ `)
171
+ .all("pending_approval", "queued", "running"),
172
+ catch: storeError("listRecoverable")
173
+ });
174
+ return yield* decodeRows("listRecoverable", rows);
175
+ });
176
+ listWorkers = Effect.fn("JobStore.listWorkers")(function* (limit) {
177
+ const database = this.#database;
178
+ const rows = yield* Effect.try({
179
+ try: () => database
180
+ .prepare(`
181
+ SELECT record FROM (
182
+ SELECT id, created_at, record
183
+ FROM jobs
184
+ WHERE CASE
185
+ WHEN json_valid(record)
186
+ THEN json_type(record, '$.worker')
187
+ END = 'object'
188
+ ORDER BY created_at DESC, id DESC
189
+ LIMIT ?
190
+ )
191
+ ORDER BY created_at ASC, id ASC
192
+ `)
193
+ .all(limit),
194
+ catch: storeError("listWorkers")
195
+ });
196
+ return yield* decodeRows("listWorkers", rows);
197
+ });
198
+ secureFiles() {
199
+ const fileSystem = this.#fileSystem;
200
+ const files = [this.path, `${this.path}-wal`, `${this.path}-shm`];
201
+ return Effect.forEach(files, (path) => fileSystem.exists(path).pipe(Effect.mapError(storeError("secure.exists")), Effect.flatMap((exists) => exists
202
+ ? fileSystem.chmod(path, 0o600).pipe(Effect.mapError(storeError("secure.chmod")))
203
+ : Effect.void)), { discard: true });
204
+ }
205
+ close() {
206
+ this.#database.close();
207
+ }
208
+ }
209
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@knpkv/herdr-fleet",
3
+ "version": "0.2.0",
4
+ "description": "Typed job protocol and local authority runtime for Herdr fleets",
5
+ "license": "MIT",
6
+ "author": "knpkv",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/knpkv/npm.git",
10
+ "directory": "packages/herdr-fleet"
11
+ },
12
+ "type": "module",
13
+ "sideEffects": false,
14
+ "main": "./dist/index.js",
15
+ "types": "./dist/index.d.ts",
16
+ "exports": {
17
+ ".": {
18
+ "types": "./dist/index.d.ts",
19
+ "import": "./dist/index.js"
20
+ },
21
+ "./model": {
22
+ "types": "./dist/model.d.ts",
23
+ "import": "./dist/model.js"
24
+ },
25
+ "./response": {
26
+ "types": "./dist/response.d.ts",
27
+ "import": "./dist/response.js"
28
+ }
29
+ },
30
+ "files": [
31
+ "dist",
32
+ "README.md"
33
+ ],
34
+ "publishConfig": {
35
+ "access": "public"
36
+ },
37
+ "engines": {
38
+ "node": ">=26"
39
+ },
40
+ "dependencies": {
41
+ "effect": "4.0.0-rc.109"
42
+ },
43
+ "devDependencies": {
44
+ "@effect/platform-node": "4.0.0-rc.109",
45
+ "@effect/vitest": "4.0.0-rc.109",
46
+ "@types/node": "^26.2.0",
47
+ "rimraf": "^6.1.3",
48
+ "typescript": "npm:@typescript/typescript6@^6.0.2",
49
+ "vitest": "^4.1.10"
50
+ },
51
+ "scripts": {
52
+ "build": "rimraf dist && tsc -b --force",
53
+ "check": "tsc -b tsconfig.json",
54
+ "clean": "rimraf dist *.tsbuildinfo",
55
+ "lint": "eslint \"{src,test}/**/*.ts\"",
56
+ "pack:deterministic": "pnpm build && node ../../scripts/pack-herdr.mjs .",
57
+ "test": "vitest run"
58
+ }
59
+ }