pipework 0.92.0 → 0.92.1
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 +4 -0
- package/dist/audit/query/cursor.d.ts +2 -1
- package/dist/audit/query/cursor.d.ts.map +1 -1
- package/dist/audit/query/cursor.js +8 -8
- package/dist/audit/query/cursor.js.map +1 -1
- package/dist/audit/query/query.d.ts.map +1 -1
- package/dist/audit/query/query.js +20 -9
- package/dist/audit/query/query.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.92.1
|
|
4
|
+
|
|
5
|
+
- **Fixed: `audit.query`'s cursor keeps the record's time to the microsecond** (#547). The cursor held the last row's `occurredAt` as a JS Date (milliseconds), while records keep microseconds. So records later in the same millisecond as a page's last record were lost on the next page (newest first) or returned again (`asc: true`), and a loop paging until `cursor` is null could fail to end. Now every matching record comes back exactly once. Cursors issued by earlier versions still decode. `AuditCursor.occurredAt` is now a `string` (UTC, `YYYY-MM-DDTHH:MM:SS.ffffffZ`).
|
|
6
|
+
|
|
3
7
|
## 0.92.0
|
|
4
8
|
|
|
5
9
|
- **New: read and remove one item's step records (`graph.results`, `graph.removeItem`)** (#545). For deletion on request. `graph.results(db, item, { tenant })` returns the results recorded for one item (`step`, `version`, `instance`, `value`, `createdAt`), so the app can collect the file references it put in them. `graph.removeItem(db, item, { tenant, running })` deletes the item's runs, tasks and results in the caller's transaction and tenant, and returns `{ runs, tasks, results }`. A run still in progress is refused by default with `StepItemRunningError` (`STEP_ITEM_RUNNING`, 409) and nothing is deleted; `running: 'cancel'` cancels it first, and a step still running then records no result. Both refuse when neither `options.tenant` nor the Flow gives a tenant. A done run whose `onDone` has not yet fired gets none.
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export interface AuditCursor {
|
|
2
|
-
|
|
2
|
+
/** The row's time in UTC to the microsecond: `YYYY-MM-DDTHH:MM:SS.ffffffZ`. Older cursors carry milliseconds; both decode. */
|
|
3
|
+
readonly occurredAt: string;
|
|
3
4
|
readonly id: string;
|
|
4
5
|
}
|
|
5
6
|
export declare function encodeAuditCursor(cursor: AuditCursor): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../../src/audit/query/cursor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../../src/audit/query/cursor.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,WAAW;IAC1B,8HAA8H;IAC9H,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CACpB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAE7D;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAe1D"}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
// Opaque cursor for audit-trail keyset pagination. Encodes `(occurredAt, id)`
|
|
2
2
|
// as a base64url JSON tuple — the same encoding the rest of pipework's
|
|
3
|
-
// cursor-paginated surfaces use. `
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
3
|
+
// cursor-paginated surfaces use. `occurredAt` is the row's time as text,
|
|
4
|
+
// UTC to the microsecond, because a JS Date holds only milliseconds and rows
|
|
5
|
+
// within one millisecond would be lost or repeated. `id` breaks ties between
|
|
6
|
+
// rows with the same time (a single CTE can emit N audit rows for fan-out
|
|
7
|
+
// targets), so the (occurredAt, id) pair is unique and totally ordered.
|
|
7
8
|
import { encodeCursor, decodeCursor } from '../../request/fixture/paginate.js';
|
|
8
9
|
import { ValidationError } from '../../core/errors/index.js';
|
|
9
10
|
export function encodeAuditCursor(cursor) {
|
|
10
|
-
return encodeCursor([cursor.occurredAt
|
|
11
|
+
return encodeCursor([cursor.occurredAt, cursor.id]);
|
|
11
12
|
}
|
|
12
13
|
export function decodeAuditCursor(raw) {
|
|
13
14
|
const parts = decodeCursor(raw);
|
|
@@ -15,11 +16,10 @@ export function decodeAuditCursor(raw) {
|
|
|
15
16
|
throw new ValidationError('Invalid audit cursor: expected [occurredAt, id] tuple. ' +
|
|
16
17
|
'Cursors are opaque — pass the value returned by audit.query unchanged.');
|
|
17
18
|
}
|
|
18
|
-
|
|
19
|
-
if (Number.isNaN(occurredAt.getTime())) {
|
|
19
|
+
if (Number.isNaN(new Date(parts[0]).getTime())) {
|
|
20
20
|
throw new ValidationError(`Invalid audit cursor: "${parts[0]}" is not a valid ISO timestamp. ` +
|
|
21
21
|
'Cursors are opaque — pass the value returned by audit.query unchanged.');
|
|
22
22
|
}
|
|
23
|
-
return { occurredAt, id: parts[1] };
|
|
23
|
+
return { occurredAt: parts[0], id: parts[1] };
|
|
24
24
|
}
|
|
25
25
|
//# sourceMappingURL=cursor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../src/audit/query/cursor.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,uEAAuE;AACvE,6EAA6E;AAC7E,6EAA6E;AAC7E,
|
|
1
|
+
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../src/audit/query/cursor.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,uEAAuE;AACvE,yEAAyE;AACzE,6EAA6E;AAC7E,6EAA6E;AAC7E,0EAA0E;AAC1E,wEAAwE;AAExE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAA;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAQ5D,MAAM,UAAU,iBAAiB,CAAC,MAAmB;IACnD,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;AACrD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAA;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;QACvF,MAAM,IAAI,eAAe,CACvB,yDAAyD;YACzD,wEAAwE,CACzE,CAAA;IACH,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,eAAe,CACvB,0BAA0B,KAAK,CAAC,CAAC,CAAC,kCAAkC;YACpE,wEAAwE,CACzE,CAAA;IACH,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;AAC/C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/audit/query/query.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/audit/query/query.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAyBvD;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,WAAW,CAAC,MAAM,CAAA;AAEtD,MAAM,WAAW,iBAAiB;IAChC,2FAA2F;IAC3F,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAA;IAC5C;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,yFAAyF;IACzF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAA;IAC1C,sFAAsF;IACtF,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,iDAAiD;IACjD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,8DAA8D;IAC9D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,mHAAmH;IACnH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,2CAA2C;IAC3C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,6CAA6C;IAC7C,QAAQ,CAAC,YAAY,CAAC,EAAE,IAAI,CAAA;IAC5B,6CAA6C;IAC7C,QAAQ,CAAC,UAAU,CAAC,EAAE,IAAI,CAAA;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,0EAA0E;IAC1E,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,mDAAmD;IACnD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,2EAA2E;IAC3E,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,SAAS,cAAc,EAAE,CAAA;IACxC,0EAA0E;IAC1E,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,kDAAkD;IAClD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAC1B;AAOD;;;;GAIG;AACH,wBAAsB,KAAK,CACzB,OAAO,GAAE,iBAAsB,EAC/B,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CA4D3B"}
|
|
@@ -13,11 +13,14 @@
|
|
|
13
13
|
import { auditRecord } from '../schema/audit-record.js';
|
|
14
14
|
import { pipeRaw } from '../../data/db/db.js';
|
|
15
15
|
import { getContext } from '../../request/context/store.js';
|
|
16
|
-
import { and, eq, gt, gte, lt, lte, inArray, desc, asc, or, } from '../../data/query/index.js';
|
|
16
|
+
import { and, eq, gt, gte, lt, lte, inArray, desc, asc, or, getTableColumns, } from '../../data/query/index.js';
|
|
17
|
+
import { sql } from '../../data/db/sql.js';
|
|
17
18
|
import { ValidationError } from '../../core/errors/index.js';
|
|
18
19
|
import { encodeAuditCursor, decodeAuditCursor, } from './cursor.js';
|
|
19
20
|
const DEFAULT_LIMIT = 50;
|
|
20
21
|
const MAX_LIMIT = 500;
|
|
22
|
+
/** Selected alongside the table's columns: the row's time to the microsecond, which a JS Date cannot hold. */
|
|
23
|
+
const EXACT_TIME = '__occurredAtExact';
|
|
21
24
|
/**
|
|
22
25
|
* Returns a page of `audit_record` rows matching `filters`, ordered by
|
|
23
26
|
* `(occurredAt, id)`. Pass `result.cursor` back as `options.cursor` to get
|
|
@@ -59,20 +62,26 @@ export async function query(filters = {}, options = {}) {
|
|
|
59
62
|
if (tenant !== null) {
|
|
60
63
|
conditions.push(eq(cols['tenantId'], tenant));
|
|
61
64
|
}
|
|
65
|
+
const exactTime = sql `to_char(${cols['occurredAt']} AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.US"Z"')`;
|
|
62
66
|
const orderBy = ascending
|
|
63
67
|
? [asc(cols['occurredAt']), asc(cols['id'])]
|
|
64
68
|
: [desc(cols['occurredAt']), desc(cols['id'])];
|
|
65
69
|
const db = pipeRaw(auditRecord.$options.database);
|
|
66
70
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Drizzle's select/from/where chain is deeply generic; the column lookup is validated against the audit_record table at call time
|
|
67
|
-
let q = db.select().from(table);
|
|
71
|
+
let q = db.select({ ...getTableColumns(table), [EXACT_TIME]: exactTime }).from(table);
|
|
68
72
|
if (conditions.length > 0) {
|
|
69
73
|
q = q.where(conditions.length === 1 ? conditions[0] : and(...conditions));
|
|
70
74
|
}
|
|
71
75
|
q = q.orderBy(...orderBy).limit(limit + 1);
|
|
72
|
-
const
|
|
73
|
-
const hasMore =
|
|
74
|
-
const
|
|
75
|
-
const cursor = buildNextCursor(
|
|
76
|
+
const fetched = (await q);
|
|
77
|
+
const hasMore = fetched.length > limit;
|
|
78
|
+
const page = hasMore ? fetched.slice(0, limit) : fetched;
|
|
79
|
+
const cursor = buildNextCursor(page, hasMore);
|
|
80
|
+
const items = page.map(row => {
|
|
81
|
+
const rest = { ...row };
|
|
82
|
+
delete rest[EXACT_TIME];
|
|
83
|
+
return rest;
|
|
84
|
+
});
|
|
76
85
|
return { rows: items, cursor, hasMore };
|
|
77
86
|
}
|
|
78
87
|
function resolveLimit(requested) {
|
|
@@ -107,19 +116,21 @@ function buildInOrEq(column, value) {
|
|
|
107
116
|
* ascending). Postgres supports tuple comparison, but drizzle's operator set
|
|
108
117
|
* doesn't expose it directly, so we expand to the lexicographic form:
|
|
109
118
|
* occurredAt < $0 OR (occurredAt = $0 AND id < $1)
|
|
119
|
+
* The time is bound as text and cast in SQL so it keeps its microseconds.
|
|
110
120
|
*/
|
|
111
121
|
function buildCursorClause(cursor, cols, ascending) {
|
|
112
122
|
const occurredAt = cols['occurredAt'];
|
|
113
123
|
const id = cols['id'];
|
|
124
|
+
const at = sql `${cursor.occurredAt}::timestamptz`;
|
|
114
125
|
if (ascending) {
|
|
115
|
-
return or(
|
|
126
|
+
return or(sql `${occurredAt} > ${at}`, and(sql `${occurredAt} = ${at}`, gt(id, cursor.id)));
|
|
116
127
|
}
|
|
117
|
-
return or(
|
|
128
|
+
return or(sql `${occurredAt} < ${at}`, and(sql `${occurredAt} = ${at}`, lt(id, cursor.id)));
|
|
118
129
|
}
|
|
119
130
|
function buildNextCursor(items, hasMore) {
|
|
120
131
|
if (!hasMore || items.length === 0)
|
|
121
132
|
return null;
|
|
122
133
|
const last = items[items.length - 1];
|
|
123
|
-
return encodeAuditCursor({ occurredAt: last
|
|
134
|
+
return encodeAuditCursor({ occurredAt: last[EXACT_TIME], id: last.id });
|
|
124
135
|
}
|
|
125
136
|
//# sourceMappingURL=query.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/audit/query/query.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,wEAAwE;AACxE,0EAA0E;AAC1E,mDAAmD;AACnD,EAAE;AACF,6EAA6E;AAC7E,6EAA6E;AAC7E,yDAAyD;AACzD,EAAE;AACF,wEAAwE;AACxE,yEAAyE;AACzE,uDAAuD;AAEvD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAC3D,OAAO,EACL,GAAG,EACH,EAAE,EACF,EAAE,EACF,GAAG,EACH,EAAE,EACF,GAAG,EACH,OAAO,EACP,IAAI,EACJ,GAAG,EACH,EAAE,
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/audit/query/query.ts"],"names":[],"mappings":"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"}
|