pipework 0.211.1 → 0.242.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/CHANGELOG.md +140 -0
- package/REFERENCE.md +95 -2
- package/dist/async/jobs/claims.d.ts +1 -1
- package/dist/async/jobs/claims.d.ts.map +1 -1
- package/dist/async/jobs/claims.js +2 -1
- package/dist/async/jobs/claims.js.map +1 -1
- package/dist/async/jobs/queue.d.ts +11 -2
- package/dist/async/jobs/queue.d.ts.map +1 -1
- package/dist/async/jobs/queue.js +93 -25
- package/dist/async/jobs/queue.js.map +1 -1
- package/dist/async/jobs/table.d.ts +4 -0
- package/dist/async/jobs/table.d.ts.map +1 -1
- package/dist/async/jobs/table.js +12 -1
- package/dist/async/jobs/table.js.map +1 -1
- package/dist/cli/commands/openapi.d.ts +8 -0
- package/dist/cli/commands/openapi.d.ts.map +1 -0
- package/dist/cli/commands/openapi.js +49 -0
- package/dist/cli/commands/openapi.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +8 -0
- package/dist/cli/commands/serve.d.ts.map +1 -1
- package/dist/cli/commands/serve.js +22 -3
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/dev-bootstrap.js +6 -1
- package/dist/cli/dev-bootstrap.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +15 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/surface-kinds.d.ts +5 -0
- package/dist/cli/surface-kinds.d.ts.map +1 -0
- package/dist/cli/surface-kinds.js +15 -0
- package/dist/cli/surface-kinds.js.map +1 -0
- package/dist/core/config/load.d.ts +1 -0
- package/dist/core/config/load.d.ts.map +1 -1
- package/dist/core/config/load.js +1 -0
- package/dist/core/config/load.js.map +1 -1
- package/dist/core/config/namespace.d.ts +6 -0
- package/dist/core/config/namespace.d.ts.map +1 -1
- package/dist/core/config/schema.d.ts +15 -0
- package/dist/core/config/schema.d.ts.map +1 -1
- package/dist/core/config/schema.js +11 -2
- package/dist/core/config/schema.js.map +1 -1
- package/dist/core/lifecycle/health.js +2 -2
- package/dist/core/lifecycle/health.js.map +1 -1
- package/dist/core/lifecycle/types.d.ts +2 -0
- package/dist/core/lifecycle/types.d.ts.map +1 -1
- package/dist/core/pipework.d.ts +14 -1
- package/dist/core/pipework.d.ts.map +1 -1
- package/dist/core/pipework.js +18 -2
- package/dist/core/pipework.js.map +1 -1
- package/dist/core/surface/http.d.ts +3 -0
- package/dist/core/surface/http.d.ts.map +1 -1
- package/dist/core/surface/http.js +27 -8
- package/dist/core/surface/http.js.map +1 -1
- package/dist/core/surface/start.d.ts.map +1 -1
- package/dist/core/surface/start.js +19 -3
- package/dist/core/surface/start.js.map +1 -1
- package/dist/core/surface/types.d.ts +9 -1
- package/dist/core/surface/types.d.ts.map +1 -1
- package/dist/data/db/filter.d.ts +3 -0
- package/dist/data/db/filter.d.ts.map +1 -1
- package/dist/data/db/filter.js +3 -0
- package/dist/data/db/filter.js.map +1 -1
- package/dist/data/db/in-list.d.ts +15 -0
- package/dist/data/db/in-list.d.ts.map +1 -0
- package/dist/data/db/in-list.js +51 -0
- package/dist/data/db/in-list.js.map +1 -0
- package/dist/data/db/namespace.d.ts +2 -0
- package/dist/data/db/namespace.d.ts.map +1 -1
- package/dist/data/db/pool.d.ts +1 -1
- package/dist/data/db/pool.d.ts.map +1 -1
- package/dist/data/db/pool.js +4 -2
- package/dist/data/db/pool.js.map +1 -1
- package/dist/data/db/reservation.d.ts +40 -0
- package/dist/data/db/reservation.d.ts.map +1 -0
- package/dist/data/db/reservation.js +108 -0
- package/dist/data/db/reservation.js.map +1 -0
- package/dist/data/domain/build-table.js +32 -1
- package/dist/data/domain/build-table.js.map +1 -1
- package/dist/data/domain/index.d.ts +2 -1
- package/dist/data/domain/index.d.ts.map +1 -1
- package/dist/data/domain/types.d.ts +9 -1
- package/dist/data/domain/types.d.ts.map +1 -1
- package/dist/data/domain/types.js.map +1 -1
- package/dist/data/migrate/apply.d.ts.map +1 -1
- package/dist/data/migrate/apply.js +3 -11
- package/dist/data/migrate/apply.js.map +1 -1
- package/dist/data/migrate/check.d.ts.map +1 -1
- package/dist/data/migrate/check.js +3 -6
- package/dist/data/migrate/check.js.map +1 -1
- package/dist/data/migrate/diff.d.ts +16 -0
- package/dist/data/migrate/diff.d.ts.map +1 -1
- package/dist/data/migrate/diff.js +44 -4
- package/dist/data/migrate/diff.js.map +1 -1
- package/dist/data/migrate/generate.d.ts +1 -1
- package/dist/data/migrate/generate.d.ts.map +1 -1
- package/dist/data/migrate/generate.js +19 -51
- package/dist/data/migrate/generate.js.map +1 -1
- package/dist/data/migrate/history.d.ts +36 -0
- package/dist/data/migrate/history.d.ts.map +1 -0
- package/dist/data/migrate/history.js +185 -0
- package/dist/data/migrate/history.js.map +1 -0
- package/dist/data/migrate/internal-definitions.d.ts.map +1 -1
- package/dist/data/migrate/internal-definitions.js +22 -1
- package/dist/data/migrate/internal-definitions.js.map +1 -1
- package/dist/data/migrate/provision-framework.d.ts +2 -0
- package/dist/data/migrate/provision-framework.d.ts.map +1 -1
- package/dist/data/migrate/provision-framework.js +11 -3
- package/dist/data/migrate/provision-framework.js.map +1 -1
- package/dist/data/migrate/snapshot.d.ts +4 -0
- package/dist/data/migrate/snapshot.d.ts.map +1 -1
- package/dist/data/migrate/snapshot.js +2 -0
- package/dist/data/migrate/snapshot.js.map +1 -1
- package/dist/data/migrate/sql-emit.js +66 -12
- package/dist/data/migrate/sql-emit.js.map +1 -1
- package/dist/data/query/pg-core/foreign-keys.d.ts +5 -0
- package/dist/data/query/pg-core/foreign-keys.d.ts.map +1 -1
- package/dist/data/query/pg-core/foreign-keys.js +9 -0
- package/dist/data/query/pg-core/foreign-keys.js.map +1 -1
- package/dist/data/query/pg-core/indexes.d.ts +5 -0
- package/dist/data/query/pg-core/indexes.d.ts.map +1 -1
- package/dist/data/query/pg-core/indexes.js +7 -0
- package/dist/data/query/pg-core/indexes.js.map +1 -1
- package/dist/data/schema/json-schema.js +29 -1
- package/dist/data/schema/json-schema.js.map +1 -1
- package/dist/data/schema/types.d.ts +2 -2
- package/dist/data/schema/types.d.ts.map +1 -1
- package/dist/index.d.ts +18 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/infra/alerts/handle.d.ts +33 -5
- package/dist/infra/alerts/handle.d.ts.map +1 -1
- package/dist/infra/alerts/handle.js +56 -12
- package/dist/infra/alerts/handle.js.map +1 -1
- package/dist/infra/alerts/http.d.ts +2 -2
- package/dist/infra/alerts/http.d.ts.map +1 -1
- package/dist/infra/alerts/http.js +21 -3
- package/dist/infra/alerts/http.js.map +1 -1
- package/dist/infra/alerts/index.d.ts +1 -1
- package/dist/infra/alerts/index.d.ts.map +1 -1
- package/dist/infra/alerts/schema.d.ts +5 -0
- package/dist/infra/alerts/schema.d.ts.map +1 -1
- package/dist/infra/alerts/schema.js +1 -0
- package/dist/infra/alerts/schema.js.map +1 -1
- package/dist/infra/crawl/audit.d.ts +6 -0
- package/dist/infra/crawl/audit.d.ts.map +1 -0
- package/dist/infra/crawl/audit.js +38 -0
- package/dist/infra/crawl/audit.js.map +1 -0
- package/dist/infra/crawl/errors.d.ts +14 -0
- package/dist/infra/crawl/errors.d.ts.map +1 -0
- package/dist/infra/crawl/errors.js +22 -0
- package/dist/infra/crawl/errors.js.map +1 -0
- package/dist/infra/crawl/handle.d.ts +149 -0
- package/dist/infra/crawl/handle.d.ts.map +1 -0
- package/dist/infra/crawl/handle.js +550 -0
- package/dist/infra/crawl/handle.js.map +1 -0
- package/dist/infra/crawl/index.d.ts +7 -0
- package/dist/infra/crawl/index.d.ts.map +1 -0
- package/dist/infra/crawl/index.js +5 -0
- package/dist/infra/crawl/index.js.map +1 -0
- package/dist/infra/crawl/links.d.ts +9 -0
- package/dist/infra/crawl/links.d.ts.map +1 -0
- package/dist/infra/crawl/links.js +194 -0
- package/dist/infra/crawl/links.js.map +1 -0
- package/dist/infra/crawl/namespace.d.ts +36 -0
- package/dist/infra/crawl/namespace.d.ts.map +1 -0
- package/dist/infra/crawl/namespace.js +36 -0
- package/dist/infra/crawl/namespace.js.map +1 -0
- package/dist/infra/crawl/robots.d.ts +16 -0
- package/dist/infra/crawl/robots.d.ts.map +1 -0
- package/dist/infra/crawl/robots.js +98 -0
- package/dist/infra/crawl/robots.js.map +1 -0
- package/dist/infra/crawl/schema.d.ts +222 -0
- package/dist/infra/crawl/schema.d.ts.map +1 -0
- package/dist/infra/crawl/schema.js +84 -0
- package/dist/infra/crawl/schema.js.map +1 -0
- package/dist/infra/credit-line/handle.d.ts +250 -0
- package/dist/infra/credit-line/handle.d.ts.map +1 -0
- package/dist/infra/credit-line/handle.js +618 -0
- package/dist/infra/credit-line/handle.js.map +1 -0
- package/dist/infra/credit-line/index.d.ts +3 -0
- package/dist/infra/credit-line/index.d.ts.map +1 -0
- package/dist/infra/credit-line/index.js +2 -0
- package/dist/infra/credit-line/index.js.map +1 -0
- package/dist/infra/credit-line/namespace.d.ts +7 -0
- package/dist/infra/credit-line/namespace.d.ts.map +1 -0
- package/dist/infra/credit-line/namespace.js +7 -0
- package/dist/infra/credit-line/namespace.js.map +1 -0
- package/dist/infra/credit-line/schema.d.ts +194 -0
- package/dist/infra/credit-line/schema.d.ts.map +1 -0
- package/dist/infra/credit-line/schema.js +89 -0
- package/dist/infra/credit-line/schema.js.map +1 -0
- package/dist/infra/email/inbound.d.ts +14 -2
- package/dist/infra/email/inbound.d.ts.map +1 -1
- package/dist/infra/email/inbound.js +5 -1
- package/dist/infra/email/inbound.js.map +1 -1
- package/dist/infra/email/index.d.ts +2 -2
- package/dist/infra/email/index.d.ts.map +1 -1
- package/dist/infra/email/index.js.map +1 -1
- package/dist/infra/email/mail.d.ts +43 -5
- package/dist/infra/email/mail.d.ts.map +1 -1
- package/dist/infra/email/mail.js +124 -9
- package/dist/infra/email/mail.js.map +1 -1
- package/dist/infra/email/mime.d.ts +6 -0
- package/dist/infra/email/mime.d.ts.map +1 -1
- package/dist/infra/email/mime.js +10 -2
- package/dist/infra/email/mime.js.map +1 -1
- package/dist/infra/email/schema.d.ts +17 -3
- package/dist/infra/email/schema.d.ts.map +1 -1
- package/dist/infra/email/schema.js +15 -4
- package/dist/infra/email/schema.js.map +1 -1
- package/dist/infra/email/sns.js +2 -2
- package/dist/infra/email/sns.js.map +1 -1
- package/dist/infra/email/unsubscribe.d.ts +13 -0
- package/dist/infra/email/unsubscribe.d.ts.map +1 -0
- package/dist/infra/email/unsubscribe.js +43 -0
- package/dist/infra/email/unsubscribe.js.map +1 -0
- package/dist/infra/fetch/handle.d.ts +20 -1
- package/dist/infra/fetch/handle.d.ts.map +1 -1
- package/dist/infra/fetch/handle.js +60 -28
- package/dist/infra/fetch/handle.js.map +1 -1
- package/dist/infra/fetch/index.d.ts +2 -2
- package/dist/infra/fetch/index.d.ts.map +1 -1
- package/dist/infra/fetch/index.js +1 -1
- package/dist/infra/fetch/index.js.map +1 -1
- package/dist/infra/fetch/namespace.d.ts +20 -2
- package/dist/infra/fetch/namespace.d.ts.map +1 -1
- package/dist/infra/fetch/namespace.js +20 -2
- package/dist/infra/fetch/namespace.js.map +1 -1
- package/dist/infra/join-requests/handle.d.ts +86 -0
- package/dist/infra/join-requests/handle.d.ts.map +1 -0
- package/dist/infra/join-requests/handle.js +233 -0
- package/dist/infra/join-requests/handle.js.map +1 -0
- package/dist/infra/join-requests/index.d.ts +3 -0
- package/dist/infra/join-requests/index.d.ts.map +1 -0
- package/dist/infra/join-requests/index.js +2 -0
- package/dist/infra/join-requests/index.js.map +1 -0
- package/dist/infra/join-requests/namespace.d.ts +7 -0
- package/dist/infra/join-requests/namespace.d.ts.map +1 -0
- package/dist/infra/join-requests/namespace.js +7 -0
- package/dist/infra/join-requests/namespace.js.map +1 -0
- package/dist/infra/join-requests/schema.d.ts +58 -0
- package/dist/infra/join-requests/schema.d.ts.map +1 -0
- package/dist/infra/join-requests/schema.js +31 -0
- package/dist/infra/join-requests/schema.js.map +1 -0
- package/dist/infra/outbox/core.d.ts +9 -0
- package/dist/infra/outbox/core.d.ts.map +1 -1
- package/dist/infra/outbox/core.js +14 -0
- package/dist/infra/outbox/core.js.map +1 -1
- package/dist/infra/support/handle.d.ts +43 -0
- package/dist/infra/support/handle.d.ts.map +1 -1
- package/dist/infra/support/handle.js +35 -7
- package/dist/infra/support/handle.js.map +1 -1
- package/dist/infra/support/http.d.ts +28 -0
- package/dist/infra/support/http.d.ts.map +1 -0
- package/dist/infra/support/http.js +217 -0
- package/dist/infra/support/http.js.map +1 -0
- package/dist/infra/support/index.d.ts +2 -0
- package/dist/infra/support/index.d.ts.map +1 -1
- package/dist/infra/support/index.js +1 -0
- package/dist/infra/support/index.js.map +1 -1
- package/dist/infra/support/namespace.d.ts +3 -0
- package/dist/infra/support/namespace.d.ts.map +1 -1
- package/dist/infra/support/namespace.js +3 -0
- package/dist/infra/support/namespace.js.map +1 -1
- package/dist/infra/support/schema.d.ts +4 -4
- package/dist/infra/webhook/outbound.d.ts +16 -0
- package/dist/infra/webhook/outbound.d.ts.map +1 -1
- package/dist/infra/webhook/outbound.js +78 -27
- package/dist/infra/webhook/outbound.js.map +1 -1
- package/dist/request/di/builder.d.ts +24 -1
- package/dist/request/di/builder.d.ts.map +1 -1
- package/dist/request/di/builder.js +35 -0
- package/dist/request/di/builder.js.map +1 -1
- package/dist/request/di/types.d.ts +30 -0
- package/dist/request/di/types.d.ts.map +1 -1
- package/dist/request/http/server.d.ts.map +1 -1
- package/dist/request/http/server.js +111 -20
- package/dist/request/http/server.js.map +1 -1
- package/dist/test/auto-setup.js +2 -2
- package/dist/test/auto-setup.js.map +1 -1
- package/dist/test/crawl-fixture.d.ts +53 -0
- package/dist/test/crawl-fixture.d.ts.map +1 -0
- package/dist/test/crawl-fixture.js +130 -0
- package/dist/test/crawl-fixture.js.map +1 -0
- package/dist/test/index.d.ts +2 -1
- package/dist/test/index.d.ts.map +1 -1
- package/dist/test/index.js +2 -1
- package/dist/test/index.js.map +1 -1
- package/dist/test/progress.d.ts +7 -1
- package/dist/test/progress.d.ts.map +1 -1
- package/dist/test/progress.js +6 -0
- package/dist/test/progress.js.map +1 -1
- package/dist/test/reap-after-run.d.ts +3 -0
- package/dist/test/reap-after-run.d.ts.map +1 -0
- package/dist/test/reap-after-run.js +29 -0
- package/dist/test/reap-after-run.js.map +1 -0
- package/dist/test/reap.d.ts +11 -2
- package/dist/test/reap.d.ts.map +1 -1
- package/dist/test/reap.js +19 -12
- package/dist/test/reap.js.map +1 -1
- package/dist/test/setup.d.ts +2 -0
- package/dist/test/setup.d.ts.map +1 -1
- package/dist/test/setup.js +87 -30
- package/dist/test/setup.js.map +1 -1
- package/dist/test/vitest-plugin.d.ts.map +1 -1
- package/dist/test/vitest-plugin.js +8 -1
- package/dist/test/vitest-plugin.js.map +1 -1
- package/dist/test/vitest-workspace.d.ts +1 -0
- package/dist/test/vitest-workspace.d.ts.map +1 -1
- package/dist/test/vitest-workspace.js +1 -1
- package/dist/test/vitest-workspace.js.map +1 -1
- package/dist/test/vitest.d.ts +20 -0
- package/dist/test/vitest.d.ts.map +1 -1
- package/dist/test/vitest.js +41 -1
- package/dist/test/vitest.js.map +1 -1
- package/dist/trace/partition/sync.d.ts +8 -2
- package/dist/trace/partition/sync.d.ts.map +1 -1
- package/dist/trace/partition/sync.js +6 -3
- package/dist/trace/partition/sync.js.map +1 -1
- package/dist/workspace/generate.d.ts.map +1 -1
- package/dist/workspace/generate.js +1 -0
- package/dist/workspace/generate.js.map +1 -1
- package/package.json +1 -1
package/dist/test/auto-setup.js
CHANGED
|
@@ -4,7 +4,7 @@ import { discoverForTestFork } from './discover-fork.js';
|
|
|
4
4
|
import { setupTestDatabases } from './setup.js';
|
|
5
5
|
import { beginTestIsolation, endTestIsolation } from './plugin.js';
|
|
6
6
|
import { _setTestState, teardownAfterAll, useTestDb } from './vitest.js';
|
|
7
|
-
import { logSlowPhases } from './progress.js';
|
|
7
|
+
import { logSlowPhases, SETUP_HOOK_TIMEOUT_MS } from './progress.js';
|
|
8
8
|
import { TEARDOWN_HOOK_TIMEOUT_MS } from '../trace/runtime/pending-writes.js';
|
|
9
9
|
loadEnvFiles();
|
|
10
10
|
let _testContext = null;
|
|
@@ -20,7 +20,7 @@ if (dbNames.length === 1) {
|
|
|
20
20
|
// because a fixed wall clock elapsed while it queued behind peer forks (#380).
|
|
21
21
|
beforeAll(async () => {
|
|
22
22
|
await setupTestDatabases(instance, { onProgress: logSlowPhases() });
|
|
23
|
-
});
|
|
23
|
+
}, SETUP_HOOK_TIMEOUT_MS);
|
|
24
24
|
afterAll(async () => {
|
|
25
25
|
await teardownAfterAll(instance);
|
|
26
26
|
}, TEARDOWN_HOOK_TIMEOUT_MS);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-setup.js","sourceRoot":"","sources":["../../src/test/auto-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAoB,MAAM,aAAa,CAAA;AACpF,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"auto-setup.js","sourceRoot":"","sources":["../../src/test/auto-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAoB,MAAM,aAAa,CAAA;AACpF,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACxE,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAA;AAE7E,YAAY,EAAE,CAAA;AAEd,IAAI,YAAY,GAAuB,IAAI,CAAA;AAE3C,MAAM,QAAQ,GAAG,MAAM,mBAAmB,EAAE,CAAA;AAE5C,aAAa,CAAC,QAAQ,CAAC,CAAA;AAEvB,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,CAAA;AAC/C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;IACzB,CAAC;IAAC,UAAsC,CAAC,IAAI,CAAC,GAAG,SAAS,EAAE,CAAA;AAC9D,CAAC;AAED,+EAA+E;AAC/E,8EAA8E;AAC9E,+EAA+E;AAC/E,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,MAAM,kBAAkB,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,aAAa,EAAE,EAAE,CAAC,CAAA;AACrE,CAAC,EAAE,qBAAqB,CAAC,CAAA;AAEzB,QAAQ,CAAC,KAAK,IAAI,EAAE;IAClB,MAAM,gBAAgB,CAAC,QAAQ,CAAC,CAAA;AAClC,CAAC,EAAE,wBAAwB,CAAC,CAAA;AAE5B,UAAU,CAAC,KAAK,IAAI,EAAE;IACpB,YAAY,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAA;IACjD,aAAa,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;AACvC,CAAC,CAAC,CAAA;AAEF,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;QAC9C,YAAY,GAAG,IAAI,CAAA;QACnB,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IAC/B,CAAC;AACH,CAAC,EAAE,wBAAwB,CAAC,CAAA"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { type IncomingHttpHeaders } from 'node:http';
|
|
2
|
+
import { type Socket } from 'node:net';
|
|
3
|
+
import type { FetchTarget } from '../infra/fetch/index.js';
|
|
4
|
+
/** What one path of a fixture site does instead of serving a file. */
|
|
5
|
+
export interface CrawlFixtureRoute {
|
|
6
|
+
/** Answer with a redirect to this URL (status 302 unless `status` is given). */
|
|
7
|
+
readonly redirect?: string;
|
|
8
|
+
/** Answer with this status and no body (with `redirect`: the redirect's status). */
|
|
9
|
+
readonly status?: number;
|
|
10
|
+
/** Wait this long before answering. */
|
|
11
|
+
readonly delayMs?: number;
|
|
12
|
+
/** Answer 200 with this many generated bytes, streamed and never on disk, without a Content-Length. */
|
|
13
|
+
readonly bytes?: number;
|
|
14
|
+
/** Content type of the generated bytes; default `application/pdf`. */
|
|
15
|
+
readonly contentType?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface CrawlFixtureOptions {
|
|
18
|
+
/** The directory served as every host's site: `/` is `index.html`, `/robots.txt` is the file of that name. Files carry an ETag and Last-Modified, and an `If-None-Match` that matches is answered 304. */
|
|
19
|
+
readonly root: string;
|
|
20
|
+
/** The names that resolve, each to a fake public address (or the address given); any other name does not resolve. */
|
|
21
|
+
readonly hosts: readonly string[] | Readonly<Record<string, string>>;
|
|
22
|
+
/** Per-path behaviour, keyed by the URL's path (`/big.pdf`), or by host and path (`example.test/`) for one host only; the host form wins. */
|
|
23
|
+
readonly routes?: Readonly<Record<string, CrawlFixtureRoute>>;
|
|
24
|
+
}
|
|
25
|
+
/** One request the fixture server received. */
|
|
26
|
+
export interface CrawlFixtureRequest {
|
|
27
|
+
readonly method: string;
|
|
28
|
+
/** The Host header without the port. */
|
|
29
|
+
readonly host: string;
|
|
30
|
+
/** Path and query. */
|
|
31
|
+
readonly path: string;
|
|
32
|
+
/** `Date.now()` when the request arrived. */
|
|
33
|
+
readonly at: number;
|
|
34
|
+
readonly headers: IncomingHttpHeaders;
|
|
35
|
+
}
|
|
36
|
+
export interface CrawlFixtureSite {
|
|
37
|
+
/** Pass as the `network` option of `crawl.create` (or `untrustedFetch.get`'s `resolve` and `connect`). */
|
|
38
|
+
readonly network: {
|
|
39
|
+
resolve: (hostname: string) => Promise<string[]>;
|
|
40
|
+
connect: (target: FetchTarget) => Socket;
|
|
41
|
+
};
|
|
42
|
+
/** Every request received, oldest first. */
|
|
43
|
+
readonly requests: CrawlFixtureRequest[];
|
|
44
|
+
close(): Promise<void>;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Serves a directory as a website on a local server, for testing a crawl with no outside fetch. `network` makes the
|
|
48
|
+
* hosts in `hosts` resolve to a fake public address and sends their connections to the local server, so the real
|
|
49
|
+
* address rules still run: a host not in `hosts` (such as `127.0.0.1`) is refused as it would be live. Use plain
|
|
50
|
+
* `http://<host>/` URLs; the port is the fixture's. Every request is recorded in `requests`.
|
|
51
|
+
*/
|
|
52
|
+
export declare function crawlFixtureSite(options: CrawlFixtureOptions): Promise<CrawlFixtureSite>;
|
|
53
|
+
//# sourceMappingURL=crawl-fixture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crawl-fixture.d.ts","sourceRoot":"","sources":["../../src/test/crawl-fixture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,mBAAmB,EAA6C,MAAM,WAAW,CAAA;AAC7G,OAAO,EAA2C,KAAK,MAAM,EAAE,MAAM,UAAU,CAAA;AAG/E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAU1D,sEAAsE;AACtE,MAAM,WAAW,iBAAiB;IAChC,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,oFAAoF;IACpF,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,uCAAuC;IACvC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,uGAAuG;IACvG,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,sEAAsE;IACtE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAClC,0MAA0M;IAC1M,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,qHAAqH;IACrH,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IACpE,6IAA6I;IAC7I,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAA;CAC9D;AAED,+CAA+C;AAC/C,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,wCAAwC;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,sBAAsB;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAA;CACtC;AAED,MAAM,WAAW,gBAAgB;IAC/B,0GAA0G;IAC1G,QAAQ,CAAC,OAAO,EAAE;QAChB,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;QAChD,OAAO,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,MAAM,CAAA;KACzC,CAAA;IACD,4CAA4C;IAC5C,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,EAAE,CAAA;IACxC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AA+CD;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA6C9F"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { createServer } from 'node:http';
|
|
2
|
+
import { connect as netConnect } from 'node:net';
|
|
3
|
+
import { readFile, stat } from 'node:fs/promises';
|
|
4
|
+
import { extname, join, normalize, sep } from 'node:path';
|
|
5
|
+
const PUBLIC_ADDRESS = '93.184.216.34';
|
|
6
|
+
const TYPES = {
|
|
7
|
+
'.html': 'text/html', '.htm': 'text/html', '.xhtml': 'application/xhtml+xml', '.txt': 'text/plain',
|
|
8
|
+
'.pdf': 'application/pdf', '.xml': 'application/xml', '.css': 'text/css', '.js': 'text/javascript',
|
|
9
|
+
'.json': 'application/json', '.png': 'image/png', '.jpg': 'image/jpeg',
|
|
10
|
+
};
|
|
11
|
+
function safePath(root, urlPath) {
|
|
12
|
+
let decoded;
|
|
13
|
+
try {
|
|
14
|
+
decoded = decodeURIComponent(urlPath);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
const full = normalize(join(root, decoded));
|
|
20
|
+
const base = normalize(root);
|
|
21
|
+
return full === base || full.startsWith(base.endsWith(sep) ? base : base + sep) ? full : null;
|
|
22
|
+
}
|
|
23
|
+
async function serveFile(root, pathname, req, res) {
|
|
24
|
+
let file = safePath(root, pathname);
|
|
25
|
+
if (file === null) {
|
|
26
|
+
res.statusCode = 400;
|
|
27
|
+
res.end();
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
if ((await stat(file)).isDirectory())
|
|
32
|
+
file = join(file, 'index.html');
|
|
33
|
+
const info = await stat(file);
|
|
34
|
+
const etag = `"${info.size.toString(16)}-${Math.floor(info.mtimeMs).toString(16)}"`;
|
|
35
|
+
res.setHeader('etag', etag);
|
|
36
|
+
res.setHeader('last-modified', info.mtime.toUTCString());
|
|
37
|
+
if (req.headers['if-none-match'] === etag) {
|
|
38
|
+
res.statusCode = 304;
|
|
39
|
+
res.end();
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const body = await readFile(file);
|
|
43
|
+
res.setHeader('content-type', TYPES[extname(file).toLowerCase()] ?? 'application/octet-stream');
|
|
44
|
+
res.end(body);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
res.statusCode = 404;
|
|
48
|
+
res.setHeader('content-type', 'text/plain');
|
|
49
|
+
res.end('not found');
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function streamBytes(res, total, contentType) {
|
|
53
|
+
res.setHeader('content-type', contentType);
|
|
54
|
+
const chunk = Buffer.alloc(64 * 1024, 0x25);
|
|
55
|
+
let sent = 0;
|
|
56
|
+
let closed = false;
|
|
57
|
+
res.on('close', () => { closed = true; });
|
|
58
|
+
const pump = () => {
|
|
59
|
+
while (!closed && sent < total) {
|
|
60
|
+
const piece = sent + chunk.length <= total ? chunk : chunk.subarray(0, total - sent);
|
|
61
|
+
sent += piece.length;
|
|
62
|
+
if (!res.write(piece)) {
|
|
63
|
+
res.once('drain', pump);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (!closed)
|
|
68
|
+
res.end();
|
|
69
|
+
};
|
|
70
|
+
pump();
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Serves a directory as a website on a local server, for testing a crawl with no outside fetch. `network` makes the
|
|
74
|
+
* hosts in `hosts` resolve to a fake public address and sends their connections to the local server, so the real
|
|
75
|
+
* address rules still run: a host not in `hosts` (such as `127.0.0.1`) is refused as it would be live. Use plain
|
|
76
|
+
* `http://<host>/` URLs; the port is the fixture's. Every request is recorded in `requests`.
|
|
77
|
+
*/
|
|
78
|
+
export async function crawlFixtureSite(options) {
|
|
79
|
+
const addresses = Array.isArray(options.hosts)
|
|
80
|
+
? Object.fromEntries(options.hosts.map(h => [h, PUBLIC_ADDRESS]))
|
|
81
|
+
: { ...options.hosts };
|
|
82
|
+
const requests = [];
|
|
83
|
+
const sockets = new Set();
|
|
84
|
+
const server = createServer((req, res) => {
|
|
85
|
+
const url = new URL(req.url ?? '/', 'http://fixture.invalid');
|
|
86
|
+
const host = (req.headers.host ?? '').replace(/:\d+$/, '');
|
|
87
|
+
requests.push({ method: req.method ?? 'GET', host, path: url.pathname + url.search, at: Date.now(), headers: req.headers });
|
|
88
|
+
const route = options.routes?.[`${host}${url.pathname}`] ?? options.routes?.[url.pathname];
|
|
89
|
+
const respond = async () => {
|
|
90
|
+
if (route?.redirect !== undefined) {
|
|
91
|
+
res.statusCode = route.status ?? 302;
|
|
92
|
+
res.setHeader('location', route.redirect);
|
|
93
|
+
res.end();
|
|
94
|
+
}
|
|
95
|
+
else if (route?.bytes !== undefined) {
|
|
96
|
+
streamBytes(res, route.bytes, route.contentType ?? 'application/pdf');
|
|
97
|
+
}
|
|
98
|
+
else if (route?.status !== undefined) {
|
|
99
|
+
res.statusCode = route.status;
|
|
100
|
+
res.end();
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
await serveFile(options.root, url.pathname, req, res);
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
if (route?.delayMs !== undefined)
|
|
107
|
+
setTimeout(() => { void respond(); }, route.delayMs);
|
|
108
|
+
else
|
|
109
|
+
void respond();
|
|
110
|
+
});
|
|
111
|
+
server.on('connection', s => { sockets.add(s); s.on('close', () => sockets.delete(s)); });
|
|
112
|
+
await new Promise(resolve => server.listen(0, '127.0.0.1', resolve));
|
|
113
|
+
const port = server.address().port;
|
|
114
|
+
return {
|
|
115
|
+
network: {
|
|
116
|
+
resolve: (hostname) => {
|
|
117
|
+
const found = addresses[hostname];
|
|
118
|
+
return found === undefined ? Promise.reject(new Error('ENOTFOUND')) : Promise.resolve([found]);
|
|
119
|
+
},
|
|
120
|
+
connect: () => netConnect(port, '127.0.0.1'),
|
|
121
|
+
},
|
|
122
|
+
requests,
|
|
123
|
+
close: async () => {
|
|
124
|
+
for (const s of sockets)
|
|
125
|
+
s.destroy();
|
|
126
|
+
await new Promise(resolve => server.close(() => resolve()));
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=crawl-fixture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crawl-fixture.js","sourceRoot":"","sources":["../../src/test/crawl-fixture.ts"],"names":[],"mappings":"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"}
|
package/dist/test/index.d.ts
CHANGED
|
@@ -2,10 +2,11 @@ export { setupTestDatabases, teardownTestDatabases, getTestDatabase, getTestData
|
|
|
2
2
|
export { flushPendingDrops, TEST_DROP_LOG_PREFIX, TEST_REAP_LOG_PREFIX } from './setup.js';
|
|
3
3
|
export { SetupStalled, logSlowPhases, SETUP_PROGRESS_LOG_PREFIX, type SetupPhase, type SetupProgress, type SetupProgressListener, } from './progress.js';
|
|
4
4
|
export { beginTestIsolation, endTestIsolation, type TestContext, type TestDatabaseConnections } from './plugin.js';
|
|
5
|
-
export { setupPipeworkTests, useTestDb, useSetupDb, useTestInstance, closeSetupConnections, SetupConnectionCloseError, teardownAfterAll, withFlow, type WithFlowOptions } from './vitest.js';
|
|
5
|
+
export { setupPipeworkTests, useTestDb, useSetupDb, useTestInstance, useTestClient, type UseTestClientOptions, closeSetupConnections, SetupConnectionCloseError, teardownAfterAll, withFlow, type WithFlowOptions } from './vitest.js';
|
|
6
6
|
export { mockAuth, asTenant } from './auth.js';
|
|
7
7
|
export { withContext, withJobContext, type WithContextOptions } from './context.js';
|
|
8
8
|
export { pipework as vitestPlugin, type PipeworkVitestOptions } from './vitest-plugin.js';
|
|
9
9
|
export { resolveVitestConfig, resolveVitestModules } from './vitest-workspace.js';
|
|
10
10
|
export { tap, type ManagedConnection, type ConnectOptions } from '../data/db/pool.js';
|
|
11
|
+
export { crawlFixtureSite, type CrawlFixtureOptions, type CrawlFixtureRoute, type CrawlFixtureRequest, type CrawlFixtureSite } from './crawl-fixture.js';
|
|
11
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/test/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,eAAe,EAAE,gBAAgB,EAAE,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAA;AAC/I,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAC1F,OAAO,EACL,YAAY,EACZ,aAAa,EACb,yBAAyB,EACzB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,qBAAqB,GAC3B,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,KAAK,WAAW,EAAE,KAAK,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAClH,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,eAAe,EAAE,gBAAgB,EAAE,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAA;AAC/I,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAC1F,OAAO,EACL,YAAY,EACZ,aAAa,EACb,yBAAyB,EACzB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,qBAAqB,GAC3B,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,KAAK,WAAW,EAAE,KAAK,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAClH,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAA;AACtO,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACnF,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AACzF,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AACjF,OAAO,EAAE,GAAG,EAAE,KAAK,iBAAiB,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACrF,OAAO,EAAE,gBAAgB,EAAE,KAAK,mBAAmB,EAAE,KAAK,iBAAiB,EAAE,KAAK,mBAAmB,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAA"}
|
package/dist/test/index.js
CHANGED
|
@@ -2,10 +2,11 @@ export { setupTestDatabases, teardownTestDatabases, getTestDatabase, getTestData
|
|
|
2
2
|
export { flushPendingDrops, TEST_DROP_LOG_PREFIX, TEST_REAP_LOG_PREFIX } from './setup.js';
|
|
3
3
|
export { SetupStalled, logSlowPhases, SETUP_PROGRESS_LOG_PREFIX, } from './progress.js';
|
|
4
4
|
export { beginTestIsolation, endTestIsolation } from './plugin.js';
|
|
5
|
-
export { setupPipeworkTests, useTestDb, useSetupDb, useTestInstance, closeSetupConnections, SetupConnectionCloseError, teardownAfterAll, withFlow } from './vitest.js';
|
|
5
|
+
export { setupPipeworkTests, useTestDb, useSetupDb, useTestInstance, useTestClient, closeSetupConnections, SetupConnectionCloseError, teardownAfterAll, withFlow } from './vitest.js';
|
|
6
6
|
export { mockAuth, asTenant } from './auth.js';
|
|
7
7
|
export { withContext, withJobContext } from './context.js';
|
|
8
8
|
export { pipework as vitestPlugin } from './vitest-plugin.js';
|
|
9
9
|
export { resolveVitestConfig, resolveVitestModules } from './vitest-workspace.js';
|
|
10
10
|
export { tap } from '../data/db/pool.js';
|
|
11
|
+
export { crawlFixtureSite } from './crawl-fixture.js';
|
|
11
12
|
//# sourceMappingURL=index.js.map
|
package/dist/test/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,eAAe,EAAE,gBAAgB,EAAwC,MAAM,YAAY,CAAA;AAC/I,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAC1F,OAAO,EACL,YAAY,EACZ,aAAa,EACb,yBAAyB,GAI1B,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAkD,MAAM,aAAa,CAAA;AAClH,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,QAAQ,EAAwB,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,eAAe,EAAE,gBAAgB,EAAwC,MAAM,YAAY,CAAA;AAC/I,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAC1F,OAAO,EACL,YAAY,EACZ,aAAa,EACb,yBAAyB,GAI1B,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAkD,MAAM,aAAa,CAAA;AAClH,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,EAA6B,qBAAqB,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,QAAQ,EAAwB,MAAM,aAAa,CAAA;AACtO,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,cAAc,EAA2B,MAAM,cAAc,CAAA;AACnF,OAAO,EAAE,QAAQ,IAAI,YAAY,EAA8B,MAAM,oBAAoB,CAAA;AACzF,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AACjF,OAAO,EAAE,GAAG,EAA+C,MAAM,oBAAoB,CAAA;AACrF,OAAO,EAAE,gBAAgB,EAAqG,MAAM,oBAAoB,CAAA"}
|
package/dist/test/progress.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Steps `setupTestDatabases` passes through, in the order it reaches them. */
|
|
2
|
-
export type SetupPhase = 'rls-probe' | 'run-prepare' | 'template-pin' | 'template-wait' | 'template-build' | 'template-migrate' | 'template-ready' | 'queue-check' | 'clone-start' | 'clone-done' | 'ready';
|
|
2
|
+
export type SetupPhase = 'rls-probe' | 'run-prepare' | 'run-reap' | 'template-pin' | 'template-wait' | 'template-build' | 'template-migrate' | 'template-framework' | 'template-partitions' | 'template-grants' | 'template-ready' | 'queue-check' | 'clone-start' | 'clone-done' | 'ready';
|
|
3
3
|
export interface SetupProgress {
|
|
4
4
|
readonly phase: SetupPhase;
|
|
5
5
|
/** The configured database this step is about, or null for whole-run steps. */
|
|
@@ -43,6 +43,12 @@ export declare class PhaseTracker {
|
|
|
43
43
|
reached(phase: SetupPhase, database?: string | null, detail?: string): void;
|
|
44
44
|
}
|
|
45
45
|
export declare const DEFAULT_SETUP_STALL_MS = 120000;
|
|
46
|
+
/**
|
|
47
|
+
* Timeout for the `beforeAll` that runs setup: setTimeout's ceiling, so vitest's
|
|
48
|
+
* hookTimeout never bounds a setup that is still advancing. Only the stall
|
|
49
|
+
* watchdog fails setup.
|
|
50
|
+
*/
|
|
51
|
+
export declare const SETUP_HOOK_TIMEOUT_MS: number;
|
|
46
52
|
export interface StallWatchOptions {
|
|
47
53
|
stallMs?: number;
|
|
48
54
|
/** How often the watchdog looks. Defaults to a tenth of the bound. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/test/progress.ts"],"names":[],"mappings":"AAQA,+EAA+E;AAC/E,MAAM,MAAM,UAAU,GAClB,WAAW,GACX,aAAa,GACb,cAAc,GACd,eAAe,GACf,gBAAgB,GAChB,kBAAkB,GAClB,gBAAgB,GAChB,aAAa,GACb,aAAa,GACb,YAAY,GACZ,OAAO,CAAA;AAEX,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;IAC1B,+EAA+E;IAC/E,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,sEAAsE;IACtE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,wCAAwC;IACxC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,6EAA6E;IAC7E,QAAQ,CAAC,QAAQ,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;QAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;CACpH;AAED,MAAM,MAAM,qBAAqB,GAAG,CAAC,QAAQ,EAAE,aAAa,KAAK,IAAI,CAAA;AAErE,qFAAqF;AACrF,qBAAa,YAAa,SAAQ,KAAK;IAEnC,QAAQ,CAAC,KAAK,EAAE,UAAU;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM;gBAHjB,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM;CAe7B;AAED;;;GAGG;AACH,qBAAa,YAAY;IAQrB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK;IARxB,KAAK,EAAE,UAAU,CAAgB;IACjC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAO;IAC9B,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,EAAE,CAAQ;IAClB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;gBAGX,QAAQ,GAAE,qBAAgC,EAC1C,KAAK,GAAE,MAAM,MAAyB;IAMzD,2CAA2C;IAC3C,MAAM,IAAI,MAAM;IAIhB,SAAS,IAAI,MAAM;IAInB,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,GAAE,MAAM,GAAG,IAAW,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;CAiBlF;AAED,eAAO,MAAM,sBAAsB,SAAU,CAAA;AAE7C,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACtB,OAAO,EAAE,YAAY,EACrB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,CAAC,CAAC,CAoBZ;AAED,yEAAyE;AACzE,eAAO,MAAM,yBAAyB,wBAAwB,CAAA;AAE9D;;;GAGG;AACH,eAAO,MAAM,aAAa,QAAS,CAAA;AAEnC;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,KAAK,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAuC,EAChE,MAAM,GAAE,MAAsB,GAC7B,qBAAqB,CAUvB"}
|
|
1
|
+
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/test/progress.ts"],"names":[],"mappings":"AAQA,+EAA+E;AAC/E,MAAM,MAAM,UAAU,GAClB,WAAW,GACX,aAAa,GACb,UAAU,GACV,cAAc,GACd,eAAe,GACf,gBAAgB,GAChB,kBAAkB,GAClB,oBAAoB,GACpB,qBAAqB,GACrB,iBAAiB,GACjB,gBAAgB,GAChB,aAAa,GACb,aAAa,GACb,YAAY,GACZ,OAAO,CAAA;AAEX,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;IAC1B,+EAA+E;IAC/E,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,sEAAsE;IACtE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,wCAAwC;IACxC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,6EAA6E;IAC7E,QAAQ,CAAC,QAAQ,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;QAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;CACpH;AAED,MAAM,MAAM,qBAAqB,GAAG,CAAC,QAAQ,EAAE,aAAa,KAAK,IAAI,CAAA;AAErE,qFAAqF;AACrF,qBAAa,YAAa,SAAQ,KAAK;IAEnC,QAAQ,CAAC,KAAK,EAAE,UAAU;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM;gBAHjB,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM;CAe7B;AAED;;;GAGG;AACH,qBAAa,YAAY;IAQrB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK;IARxB,KAAK,EAAE,UAAU,CAAgB;IACjC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAO;IAC9B,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,EAAE,CAAQ;IAClB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;gBAGX,QAAQ,GAAE,qBAAgC,EAC1C,KAAK,GAAE,MAAM,MAAyB;IAMzD,2CAA2C;IAC3C,MAAM,IAAI,MAAM;IAIhB,SAAS,IAAI,MAAM;IAInB,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,GAAE,MAAM,GAAG,IAAW,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;CAiBlF;AAED,eAAO,MAAM,sBAAsB,SAAU,CAAA;AAE7C;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,QAAc,CAAA;AAEhD,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACtB,OAAO,EAAE,YAAY,EACrB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,CAAC,CAAC,CAoBZ;AAED,yEAAyE;AACzE,eAAO,MAAM,yBAAyB,wBAAwB,CAAA;AAE9D;;;GAGG;AACH,eAAO,MAAM,aAAa,QAAS,CAAA;AAEnC;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,KAAK,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAuC,EAChE,MAAM,GAAE,MAAsB,GAC7B,qBAAqB,CAUvB"}
|
package/dist/test/progress.js
CHANGED
|
@@ -72,6 +72,12 @@ export class PhaseTracker {
|
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
74
|
export const DEFAULT_SETUP_STALL_MS = 120_000;
|
|
75
|
+
/**
|
|
76
|
+
* Timeout for the `beforeAll` that runs setup: setTimeout's ceiling, so vitest's
|
|
77
|
+
* hookTimeout never bounds a setup that is still advancing. Only the stall
|
|
78
|
+
* watchdog fails setup.
|
|
79
|
+
*/
|
|
80
|
+
export const SETUP_HOOK_TIMEOUT_MS = 2 ** 31 - 1;
|
|
75
81
|
/**
|
|
76
82
|
* Run `work`, failing it if `tracker` reports no phase advance for `stallMs`.
|
|
77
83
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/test/progress.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,8EAA8E;AAC9E,8EAA8E;AAC9E,+EAA+E;AAC/E,gFAAgF;AAChF,4EAA4E;AAC5E,8EAA8E;
|
|
1
|
+
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/test/progress.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reap-after-run.d.ts","sourceRoot":"","sources":["../../src/test/reap-after-run.ts"],"names":[],"mappings":"AAUA,wBAAgB,KAAK,IAAI,IAAI,CAAG;AAEhC,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAe9C"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { loadEnvFiles } from '../core/config/env.js';
|
|
2
|
+
import { discoverInstance } from '../core/config/discover.js';
|
|
3
|
+
import { reapConfiguredTestDatabases } from './reap.js';
|
|
4
|
+
import { TEST_REAP_LOG_PREFIX } from './setup.js';
|
|
5
|
+
// Vitest globalSetup, added by the pipework plugin. `teardown` runs in the
|
|
6
|
+
// parent after every worker has stopped, so the clones a SIGTERMed fork left
|
|
7
|
+
// queued are orphans by then: their run locks died with the workers. Clones
|
|
8
|
+
// only (templates outlive runs), and only those whose run lock is free, so a
|
|
9
|
+
// concurrent run's live clones are never touched. Best effort, never fails a run.
|
|
10
|
+
export function setup() { }
|
|
11
|
+
export async function teardown() {
|
|
12
|
+
try {
|
|
13
|
+
loadEnvFiles();
|
|
14
|
+
const instance = await discoverInstance();
|
|
15
|
+
try {
|
|
16
|
+
const { droppedDatabases } = await reapConfiguredTestDatabases(instance, { clonesOnly: true });
|
|
17
|
+
if (droppedDatabases.length > 0) {
|
|
18
|
+
process.stderr.write(`${TEST_REAP_LOG_PREFIX} dropped ${String(droppedDatabases.length)} leftover clone(s): ${droppedDatabases.join(', ')}\n`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
finally {
|
|
22
|
+
await instance.pool.closeAll();
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// Best effort — the next run's reaper drops what this missed.
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=reap-after-run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reap-after-run.js","sourceRoot":"","sources":["../../src/test/reap-after-run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAC7D,OAAO,EAAE,2BAA2B,EAAE,MAAM,WAAW,CAAA;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAEjD,2EAA2E;AAC3E,6EAA6E;AAC7E,4EAA4E;AAC5E,6EAA6E;AAC7E,kFAAkF;AAClF,MAAM,UAAU,KAAK,KAAU,CAAC;AAEhC,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,IAAI,CAAC;QACH,YAAY,EAAE,CAAA;QACd,MAAM,QAAQ,GAAG,MAAM,gBAAgB,EAAE,CAAA;QACzC,IAAI,CAAC;YACH,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,2BAA2B,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAA;YAC9F,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,oBAAoB,YAAY,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,uBAAuB,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAChJ,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAA;QAChC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,8DAA8D;IAChE,CAAC;AACH,CAAC"}
|
package/dist/test/reap.d.ts
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
import postgres from 'postgres';
|
|
2
2
|
import type { Manifold } from '../core/pipework.js';
|
|
3
|
+
export interface ReapOptions {
|
|
4
|
+
/**
|
|
5
|
+
* Called before each candidate database is handled, `index` counting 1..`total`
|
|
6
|
+
* across the clones and the stale templates together, so a hung drop is named.
|
|
7
|
+
*/
|
|
8
|
+
onReap?: (datname: string, index: number, total: number) => void;
|
|
9
|
+
/** Leave shared templates alone: only per-run clones are candidates. */
|
|
10
|
+
clonesOnly?: boolean;
|
|
11
|
+
}
|
|
3
12
|
export interface ReapResult {
|
|
4
13
|
readonly droppedDatabases: readonly string[];
|
|
5
14
|
/**
|
|
@@ -36,10 +45,10 @@ export declare function getAdminUrl(databaseUrl: string): string;
|
|
|
36
45
|
* All three only ever make the reaper more conservative, so it can never drop a
|
|
37
46
|
* database belonging to a live or still-provisioning run, or to anyone else.
|
|
38
47
|
*/
|
|
39
|
-
export declare function reapOrphanTestDatabases(admin: postgres.Sql, liveTemplates?: ReadonlySet<string
|
|
48
|
+
export declare function reapOrphanTestDatabases(admin: postgres.Sql, liveTemplates?: ReadonlySet<string>, options?: ReapOptions): Promise<ReapResult>;
|
|
40
49
|
/**
|
|
41
50
|
* Reap orphan test databases across every Postgres server referenced by the
|
|
42
51
|
* manifold's database config. Used by `pipework test --reap`.
|
|
43
52
|
*/
|
|
44
|
-
export declare function reapConfiguredTestDatabases(instance: Manifold): Promise<ReapResult>;
|
|
53
|
+
export declare function reapConfiguredTestDatabases(instance: Manifold, options?: ReapOptions): Promise<ReapResult>;
|
|
45
54
|
//# sourceMappingURL=reap.d.ts.map
|
package/dist/test/reap.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reap.d.ts","sourceRoot":"","sources":["../../src/test/reap.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,UAAU,CAAA;AAC/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAuBnD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAA;IAC5C;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAA;CAC7C;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AA0BD,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,6DAA6D;AAC7D,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAIvD;AAcD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,QAAQ,CAAC,GAAG,EACnB,aAAa,GAAE,WAAW,CAAC,MAAM,CAAa,
|
|
1
|
+
{"version":3,"file":"reap.d.ts","sourceRoot":"","sources":["../../src/test/reap.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,UAAU,CAAA;AAC/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAuBnD,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAChE,wEAAwE;IACxE,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAA;IAC5C;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAA;CAC7C;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AA0BD,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,6DAA6D;AAC7D,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAIvD;AAcD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,QAAQ,CAAC,GAAG,EACnB,aAAa,GAAE,WAAW,CAAC,MAAM,CAAa,EAC9C,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC,CAyCrB;AAsED;;;GAGG;AACH,wBAAsB,2BAA2B,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,CAkBpH"}
|
package/dist/test/reap.js
CHANGED
|
@@ -82,15 +82,19 @@ const TEMPLATE_FINGERPRINT_SUFFIX = /_([0-9a-f]{16})$/;
|
|
|
82
82
|
* All three only ever make the reaper more conservative, so it can never drop a
|
|
83
83
|
* database belonging to a live or still-provisioning run, or to anyone else.
|
|
84
84
|
*/
|
|
85
|
-
export async function reapOrphanTestDatabases(admin, liveTemplates = new Set()) {
|
|
85
|
+
export async function reapOrphanTestDatabases(admin, liveTemplates = new Set(), options = {}) {
|
|
86
86
|
const rows = await admin `
|
|
87
87
|
SELECT datname, numbackends
|
|
88
88
|
FROM pg_stat_database
|
|
89
89
|
WHERE datname LIKE ${testDbLikePattern()}
|
|
90
90
|
`;
|
|
91
|
+
const templateRows = options.clonesOnly === true ? [] : await staleTemplateCandidates(admin);
|
|
92
|
+
const total = rows.length + templateRows.length;
|
|
93
|
+
const { onReap } = options;
|
|
91
94
|
const droppedDatabases = [];
|
|
92
95
|
const skippedDatabases = [];
|
|
93
|
-
for (const { datname, numbackends } of rows) {
|
|
96
|
+
for (const [i, { datname, numbackends }] of rows.entries()) {
|
|
97
|
+
onReap?.(datname, i + 1, total);
|
|
94
98
|
// A name in this prefix that pipework did not write. It could be anything —
|
|
95
99
|
// a control database, a hand-made fixture, another tool's namespace that
|
|
96
100
|
// happens to collide. Dropping it because the prefix matched is what #391
|
|
@@ -115,7 +119,7 @@ export async function reapOrphanTestDatabases(admin, liveTemplates = new Set())
|
|
|
115
119
|
await admin `SELECT pg_advisory_unlock(${key.toString()}::bigint)`;
|
|
116
120
|
}
|
|
117
121
|
}
|
|
118
|
-
const templates = await reapStaleTemplates(admin, liveTemplates);
|
|
122
|
+
const templates = await reapStaleTemplates(admin, liveTemplates, templateRows, (datname, i) => onReap?.(datname, rows.length + i, total));
|
|
119
123
|
droppedDatabases.push(...templates.droppedDatabases);
|
|
120
124
|
skippedDatabases.push(...templates.skippedDatabases);
|
|
121
125
|
return { droppedDatabases, skippedDatabases };
|
|
@@ -144,15 +148,11 @@ export async function reapOrphanTestDatabases(admin, liveTemplates = new Set())
|
|
|
144
148
|
* means "drop every template not currently in use", which is the right reading
|
|
145
149
|
* of an explicit cleanup command.
|
|
146
150
|
*/
|
|
147
|
-
async function reapStaleTemplates(admin, liveTemplates) {
|
|
148
|
-
const rows = await admin `
|
|
149
|
-
SELECT datname, numbackends
|
|
150
|
-
FROM pg_stat_database
|
|
151
|
-
WHERE datname LIKE ${templateDbLikePattern()}
|
|
152
|
-
`;
|
|
151
|
+
async function reapStaleTemplates(admin, liveTemplates, rows, onEach) {
|
|
153
152
|
const droppedDatabases = [];
|
|
154
153
|
const skippedDatabases = [];
|
|
155
|
-
for (const { datname, numbackends } of rows) {
|
|
154
|
+
for (const [i, { datname, numbackends }] of rows.entries()) {
|
|
155
|
+
onEach(datname, i + 1);
|
|
156
156
|
const fingerprint = TEMPLATE_FINGERPRINT_SUFFIX.exec(datname)?.[1];
|
|
157
157
|
// A name in the template namespace without a fingerprint was not written by
|
|
158
158
|
// this scheme. Leave it alone rather than guess at its owner — and say so.
|
|
@@ -179,11 +179,18 @@ async function reapStaleTemplates(admin, liveTemplates) {
|
|
|
179
179
|
}
|
|
180
180
|
return { droppedDatabases, skippedDatabases };
|
|
181
181
|
}
|
|
182
|
+
async function staleTemplateCandidates(admin) {
|
|
183
|
+
return [...await admin `
|
|
184
|
+
SELECT datname, numbackends
|
|
185
|
+
FROM pg_stat_database
|
|
186
|
+
WHERE datname LIKE ${templateDbLikePattern()}
|
|
187
|
+
`];
|
|
188
|
+
}
|
|
182
189
|
/**
|
|
183
190
|
* Reap orphan test databases across every Postgres server referenced by the
|
|
184
191
|
* manifold's database config. Used by `pipework test --reap`.
|
|
185
192
|
*/
|
|
186
|
-
export async function reapConfiguredTestDatabases(instance) {
|
|
193
|
+
export async function reapConfiguredTestDatabases(instance, options = {}) {
|
|
187
194
|
const adminUrls = new Set();
|
|
188
195
|
for (const [, dbConfig] of instance.config.databases()) {
|
|
189
196
|
adminUrls.add(getAdminUrl(dbConfig.url));
|
|
@@ -193,7 +200,7 @@ export async function reapConfiguredTestDatabases(instance) {
|
|
|
193
200
|
for (const adminUrl of adminUrls) {
|
|
194
201
|
const client = postgres(adminUrl, { max: 1, onnotice: () => { } });
|
|
195
202
|
try {
|
|
196
|
-
const result = await reapOrphanTestDatabases(client);
|
|
203
|
+
const result = await reapOrphanTestDatabases(client, new Set(), options);
|
|
197
204
|
droppedDatabases.push(...result.droppedDatabases);
|
|
198
205
|
skippedDatabases.push(...result.skippedDatabases);
|
|
199
206
|
}
|
package/dist/test/reap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reap.js","sourceRoot":"","sources":["../../src/test/reap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,QAAQ,MAAM,UAAU,CAAA;AAE/B,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAC3D,OAAO,EACL,YAAY,EACZ,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,gBAAgB,CAAA;AAGvB,+EAA+E;AAC/E,oFAAoF;AACpF,2EAA2E;AAC3E,mFAAmF;AACnF,qEAAqE;AACrE,EAAE;AACF,gFAAgF;AAChF,6EAA6E;AAC7E,gFAAgF;AAChF,8EAA8E;AAC9E,MAAM,YAAY,GAAG,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"reap.js","sourceRoot":"","sources":["../../src/test/reap.ts"],"names":[],"mappings":"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"}
|
package/dist/test/setup.d.ts
CHANGED
|
@@ -89,6 +89,8 @@ export interface TemplateRetryOptions {
|
|
|
89
89
|
now?: () => number;
|
|
90
90
|
/** Names the operation the lines are about. Defaults to the clone prefix. */
|
|
91
91
|
prefix?: string;
|
|
92
|
+
/** Called with the retry number before each backoff sleep. */
|
|
93
|
+
onRetry?: (n: number) => void;
|
|
92
94
|
}
|
|
93
95
|
/**
|
|
94
96
|
* Run `attempt`, retrying only on SQLSTATE 55006 with capped exponential
|
package/dist/test/setup.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/test/setup.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,UAAU,CAAA;AAG/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAUnD,OAAO,EAIL,KAAK,qBAAqB,EAC3B,MAAM,eAAe,CAAA;AAGtB,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAA;CACjB;AAsDD,+DAA+D;AAC/D,eAAO,MAAM,oBAAoB,uBAAuB,CAAA;AAqBxD,MAAM,WAAW,YAAY;IAC3B,iEAAiE;IACjE,UAAU,CAAC,EAAE,qBAAqB,CAAA;IAClC,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,gEAAgE;IAChE,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,QAAQ,EAClB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAUpC;
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/test/setup.ts"],"names":[],"mappings":"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"}
|