@bongos/core 1.19.1073 → 1.19.1074
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/.bongos-core.json +320 -465
- package/.claude/skills/feedback/SKILL.md +2 -2
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +4 -60
- package/clients/bongos-client/index.cjs +4 -60
- package/clients/bongos-client/index.d.ts +5 -90
- package/clients/bongos-client/index.mjs +4 -60
- package/config/branding.neutral.json +1 -5
- package/config/modules.neutral.json +2 -3
- package/config/scheduled-routines.json +0 -2
- package/docs/adr/0145-free-hosted-project-tier-isolation-and-domain-separation.md +1 -0
- package/docs/adr/0285-a-shared-box-holds-about-twelve-projects-per-gb-and-memory-is-the-wall.md +1 -0
- package/docs/adr/0323-hosting-is-three-shapes-and-we-are-not-the-landlord.md +1 -1
- package/docs/adr/0327-a-cloud-host-runs-on-the-owners-account-and-the-key-is-borrowed.md +1 -1
- package/docs/adr/0341-the-page-is-the-unit-of-tweak-mode.md +2 -0
- package/docs/adr/0345-we-host-every-projects-hall-and-its-app-deploys-where-the-owner-chooses.md +94 -0
- package/docs/adr/README.md +1 -0
- package/docs/api/openapi.json +171 -1661
- package/docs/api-reference.md +9 -41
- package/docs/architecture.md +16 -1
- package/docs/branding-contract.md +0 -3
- package/docs/copy-inventory.md +454 -479
- package/docs/copy-registry.json +746 -978
- package/docs/file-map.md +5 -34
- package/docs/module-api-changelog.md +2 -0
- package/docs/modules-contract.md +13 -1
- package/docs/onboarding/diagrams/04-architecture.mmd +11 -22
- package/docs/onboarding/diagrams/README.md +3 -3
- package/docs/onboarding/diagrams/assertions.json +2 -22
- package/docs/onboarding/primer.md +9 -28
- package/docs/page-inventory.json +4 -1
- package/docs/page-readings.json +1032 -1077
- package/docs/recipes/render-pilot.md +29 -10
- package/migrations/core_257_module_store_registry.sql +87 -0
- package/migrations/core_258_drop_dev_box_tables.sql +55 -0
- package/modules/agents/module.json +1 -0
- package/modules/autonomy/module.json +1 -0
- package/modules/builder-settings/module.json +1 -0
- package/modules/builder-settings/render-prefs.js +4 -5
- package/modules/copy-desk/docx.js +78 -5
- package/modules/copy-desk/module.json +1 -0
- package/modules/copy-desk/routes/copy-desk.js +9 -9
- package/modules/copy-desk/tests/copy_docx.mjs +107 -1
- package/modules/copy-desk/tests/fixtures/word-docx.mjs +30 -0
- package/modules/discord/module.json +1 -0
- package/modules/economy/module.json +1 -0
- package/modules/economy/routes/credits.js +1 -2
- package/modules/government/catalog.js +13 -17
- package/modules/government/migrations/government_019_retire_box_permissions.sql +33 -0
- package/modules/government/module.json +1 -0
- package/modules/government/protected-surfaces.json +3 -11
- package/modules/government/resolver.js +3 -46
- package/modules/government/routes/government.js +0 -2
- package/modules/government/session-scopes.js +43 -83
- package/modules/government/session-scopes.json +8 -18
- package/modules/grading/module.json +1 -0
- package/modules/hall-ui/module.json +1 -0
- package/modules/hall-ui/public/board-lib.js +2 -2
- package/modules/hall-ui/public/builders.js +29 -40
- package/modules/hall-ui/public/collab.html +1 -1
- package/modules/hall-ui/public/collab.js +1 -1
- package/modules/hall-ui/public/diagrams.html +3 -3
- package/modules/hall-ui/public/dom-utils.js +1 -1
- package/modules/hall-ui/public/gate.js +2 -2
- package/modules/hall-ui/public/gate.states.json +1 -1
- package/modules/hall-ui/public/hall-render.js +43 -79
- package/modules/hall-ui/public/index.html +5 -1
- package/modules/hall-ui/public/modules.js +1 -0
- package/modules/hall-ui/public/oversight.css +5 -5
- package/modules/hall-ui/public/palette.js +0 -11
- package/modules/hall-ui/public/primer.js +1 -1
- package/modules/hall-ui/public/sessions.html +1 -1
- package/modules/hall-ui/public/settings-sessions.js +1 -1
- package/modules/hall-ui/public/settings.css +0 -1
- package/modules/hall-ui/public/settings.html +4 -33
- package/modules/hall-ui/public/settings.js +3 -33
- package/modules/hall-ui/public/settings.states.json +2 -2
- package/modules/hall-ui/public/studio.html +1 -1
- package/modules/hall-ui/public/style.css +10 -13
- package/modules/hall-ui/public/task.html +4 -1
- package/modules/hall-ui/public/task.js +36 -1
- package/modules/hall-ui/public/tweak-editor-lib.js +18 -1
- package/modules/hall-ui/public/tweak-editor.css +16 -0
- package/modules/hall-ui/public/tweak-editor.html +26 -3
- package/modules/hall-ui/public/tweak-editor.js +32 -1
- package/modules/hall-ui/public/work.js +1 -1
- package/modules/hall-ui/records/tweak-editor.md +1 -0
- package/modules/ideas/module.json +1 -0
- package/modules/lifecycle/db-claim-reads.js +1 -58
- package/modules/lifecycle/db-ship.js +0 -5
- package/modules/lifecycle/db.js +0 -4
- package/modules/lifecycle/kickoff-checklist.js +0 -4
- package/modules/lifecycle/lifecycle.js +0 -8
- package/modules/lifecycle/module.json +1 -0
- package/modules/lifecycle/routes/tasks.js +5 -7
- package/modules/memory/module.json +1 -0
- package/modules/npm-release/module.json +1 -0
- package/modules/onboarding/module.json +1 -0
- package/modules/onboarding/onboarding-state.js +17 -36
- package/modules/onboarding/routes/access-requests.js +3 -3
- package/modules/platform-identity/module.json +1 -0
- package/modules/platform-identity/platform-identity.js +13 -5
- package/modules/platform-identity/routes/sso.js +2 -2
- package/modules/platform-identity/tests/platform-identity.mjs +17 -3
- package/modules/provisioning/module.json +1 -0
- package/modules/provisioning/provisioning.js +2 -2
- package/modules/provisioning/starter-bundles.js +5 -25
- package/modules/public-landing/module.json +1 -0
- package/modules/public-landing/public/assets/cosmos.css +1 -1
- package/modules/public-landing/public/contact.html +1 -1
- package/modules/public-landing/public/privacy.html +1 -1
- package/modules/public-landing/public/projects.html +101 -32
- package/modules/public-landing/public/projects.probes.json +2 -2
- package/modules/public-landing/public/projects.states.json +4 -3
- package/modules/public-landing/public/terms.html +1 -1
- package/modules/security/module.json +1 -0
- package/modules/sessions/module.json +1 -0
- package/modules/specialities/module.json +1 -0
- package/modules/status-ui/module.json +1 -0
- package/modules/ui-design/module.json +1 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +78 -0
- package/scripts/gds/artifact-format.js +203 -0
- package/scripts/gds/audit-authorship.sh +1 -13
- package/scripts/gds/claim.js +0 -15
- package/scripts/gds/cli-lib.js +8 -8
- package/scripts/gds/diagram-facts.js +12 -23
- package/scripts/gds/do-api.js +13 -80
- package/scripts/gds/doc-cli-guard.js +2 -0
- package/scripts/gds/doctor.js +1 -1
- package/scripts/gds/feedback-latest.js +139 -9
- package/scripts/gds/fitness-checks-identity.js +2 -7
- package/scripts/gds/fitness-checks-write-validation.js +4 -0
- package/scripts/gds/fitness-ratchets.js +4 -4
- package/scripts/gds/fitness.js +10 -10
- package/scripts/gds/gen-diagrams.js +49 -71
- package/scripts/gds/http-api-client.js +12 -19
- package/scripts/gds/init.js +1 -1
- package/scripts/gds/lint-infra-exec.js +1 -1
- package/scripts/gds/local-preview-lib.js +8 -39
- package/scripts/gds/local-preview.js +2 -15
- package/scripts/gds/migration-namespace.js +3 -3
- package/scripts/gds/module-artifact.js +212 -0
- package/scripts/gds/module.js +95 -6
- package/scripts/gds/package-core.js +5 -116
- package/scripts/gds/provision-config.js +2 -2
- package/scripts/gds/provision-net.js +2 -3
- package/scripts/gds/provision.js +9 -9
- package/scripts/gds/publish-manifest.js +1 -2
- package/scripts/gds/regen-instance-docs.js +1 -1
- package/scripts/gds/run-unit-tests.js +2 -16
- package/scripts/gds/sandbox-stage.js +39 -341
- package/scripts/gds/ship-flow.js +6 -6
- package/scripts/gds/ship-land.js +3 -4
- package/scripts/gds/ship-regen.js +10 -41
- package/scripts/gds/ship.js +4 -24
- package/scripts/gds/start.js +0 -15
- package/scripts/hall-preview/README.md +5 -5
- package/scripts/hall-preview/server.js +6 -6
- package/scripts/render-diagrams.sh +1 -1
- package/src/bongos/api-errors.js +1 -1
- package/src/bongos/auth-github.js +2 -3
- package/src/bongos/auth.js +51 -126
- package/src/bongos/db-kernel.js +2 -3
- package/src/bongos/db.js +5 -28
- package/src/bongos/module-scope-map.js +14 -29
- package/src/bongos/module-store.js +141 -0
- package/src/bongos/route-rank-check.js +3 -16
- package/src/bongos/routes/auth.js +0 -116
- package/src/bongos/routes/builders.js +5 -15
- package/src/bongos/routes/instance.js +8 -14
- package/src/bongos/routes/me.js +6 -22
- package/src/bongos/routes/modules.js +83 -0
- package/src/bongos/routes.js +5 -0
- package/src/module-api.js +13 -6
- package/src/module-loader/catalog.js +3 -0
- package/src/module-loader/loader.js +4 -4
- package/src/module-loader/manifest-schema.js +15 -7
- package/src/module-seams.js +2 -3
- package/src/modules.js +42 -14
- package/tests/agents_spend_guard.mjs +1 -1
- package/tests/api_client.mjs +0 -15
- package/tests/auth_page_gate.mjs +10 -10
- package/tests/canonical_profile_url.mjs +1 -3
- package/tests/claim_action.mjs +4 -1
- package/tests/claim_from_task_and_home.mjs +127 -0
- package/tests/consumer_layout_boot.mjs +2 -0
- package/tests/copy_desk_page_docx.mjs +33 -2
- package/tests/core_upgrade_runner.mjs +6 -6
- package/tests/deploy_divergence_line.mjs +11 -11
- package/tests/diagram_facts_offset.mjs +1 -1
- package/tests/do_api.mjs +106 -0
- package/tests/feedback_latest.mjs +122 -0
- package/tests/fitness.mjs +44 -42
- package/tests/gate_approvals.mjs +0 -1
- package/tests/go_live.mjs +3 -3
- package/tests/government_abuse_matrix.mjs +20 -19
- package/tests/government_ownership_scope.mjs +33 -35
- package/tests/government_parity.mjs +2 -2
- package/tests/government_protected_surfaces.mjs +56 -37
- package/tests/government_require_permission.mjs +3 -3
- package/tests/government_seed.mjs +37 -4
- package/tests/government_session_scope.mjs +92 -366
- package/tests/hall_error_envelope.mjs +4 -0
- package/tests/hall_landing_boot.mjs +4 -1
- package/tests/hall_palette.mjs +1 -16
- package/tests/hall_record_world.mjs +6 -0
- package/tests/hall_tweak_editor.mjs +52 -1
- package/tests/host_topology_skips.mjs +1 -2
- package/tests/html_comment_nesting.mjs +137 -0
- package/tests/infra_exec_paths.mjs +9 -10
- package/tests/init.mjs +4 -5
- package/tests/instance_manifest.mjs +18 -25
- package/tests/kickoff_checklist.mjs +1 -1
- package/tests/lib_sh_resolution.mjs +0 -221
- package/tests/local_preview.mjs +0 -12
- package/tests/module-scope-map.mjs +9 -9
- package/tests/module_catalog.mjs +1 -1
- package/tests/module_cli.mjs +15 -15
- package/tests/module_contributions.mjs +6 -6
- package/tests/module_loader.mjs +6 -6
- package/tests/module_manifest.mjs +13 -4
- package/tests/module_store_publish.mjs +307 -0
- package/tests/module_store_publish_route.mjs +121 -0
- package/tests/module_store_registry_migration.mjs +70 -0
- package/tests/modules.mjs +56 -26
- package/tests/onboarding_route_signals.mjs +21 -31
- package/tests/onboarding_state.mjs +35 -49
- package/tests/permission_path.mjs +0 -3
- package/tests/platform_boot.mjs +1 -2
- package/tests/profile_route.mjs +1 -6
- package/tests/projects_hub.mjs +5 -5
- package/tests/projects_hub_app_step.mjs +138 -0
- package/tests/projects_hub_module_picker.mjs +2 -2
- package/tests/projects_hub_pre_uat.mjs +4 -5
- package/tests/provision.mjs +7 -7
- package/tests/provisioning_starter_bundles.mjs +0 -22
- package/tests/publish_branch_route.mjs +10 -18
- package/tests/publish_manifest.mjs +1 -2
- package/tests/rank_tier_single_source.mjs +1 -13
- package/tests/repo_map.mjs +3 -4
- package/tests/runner_drift.mjs +3 -21
- package/tests/sandbox_stage.mjs +57 -390
- package/tests/session_rename_fallback.mjs +0 -21
- package/tests/ship_error_shape.mjs +1 -1
- package/tests/task_visual_slots.mjs +31 -0
- package/tests/terms_acceptance.mjs +1 -1
- package/tests/upgrade.mjs +4 -4
- package/tests/watch_sealed_floor.mjs +0 -1
- package/tests/wizard_draft_resume.mjs +2 -2
- package/tests/wizard_intent_resume.mjs +21 -10
- package/tests/wizard_preselect_why.mjs +18 -18
- package/docs/onboarding/browser-terminal-guide.md +0 -73
- package/docs/recipes/managed-settings-remote-control.md +0 -416
- package/modules/dev-box/CLAUDE.md +0 -15
- package/modules/dev-box/box-access.js +0 -623
- package/modules/dev-box/box-credential.js +0 -94
- package/modules/dev-box/box-onboard.js +0 -486
- package/modules/dev-box/boxes.js +0 -1038
- package/modules/dev-box/db.js +0 -39
- package/modules/dev-box/module.json +0 -19
- package/modules/dev-box/routes/box.js +0 -1223
- package/scripts/gds/box-auth-check.js +0 -160
- package/scripts/gds/box-infra.js +0 -321
- package/scripts/gds/box-sync.js +0 -216
- package/scripts/gds/box.js +0 -1332
- package/scripts/gds/cf-tunnel.js +0 -558
- package/scripts/gds/smoke-box.sh +0 -150
- package/scripts/gds/tree-preflight.js +0 -241
- package/src/bongos/app-pair.js +0 -172
- package/tests/app_pair.mjs +0 -168
- package/tests/box_access.mjs +0 -578
- package/tests/box_auth_check.mjs +0 -114
- package/tests/box_code_staleness.mjs +0 -129
- package/tests/box_connect_e2e.mjs +0 -196
- package/tests/box_cost.mjs +0 -70
- package/tests/box_credential.mjs +0 -125
- package/tests/box_dns_repoint.mjs +0 -153
- package/tests/box_env.mjs +0 -64
- package/tests/box_host_keys.mjs +0 -126
- package/tests/box_infra_resolve.mjs +0 -246
- package/tests/box_onboard.mjs +0 -317
- package/tests/box_scope_session.mjs +0 -119
- package/tests/box_sweep_docs.mjs +0 -119
- package/tests/box_sync.mjs +0 -55
- package/tests/box_sync_scope_report.mjs +0 -126
- package/tests/box_task_scope.mjs +0 -169
- package/tests/box_task_scope_pause.mjs +0 -66
- package/tests/box_terminal_ssrf.mjs +0 -96
- package/tests/boxes.mjs +0 -1585
- package/tests/cf_ruleset_preflight.mjs +0 -142
- package/tests/cf_tunnel.mjs +0 -496
- package/tests/docs_scrubber_damage.mjs +0 -111
- package/tests/module_scope_active_claims.mjs +0 -94
- package/tests/ship_api_client_pathspec.mjs +0 -100
- package/tests/tree_preflight.mjs +0 -243
package/tests/app_pair.mjs
DELETED
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
// tests/app_pair.mjs
|
|
2
|
-
//
|
|
3
|
-
// Hermetic unit tests for the Dev Box desktop app's pairing store (#904,
|
|
4
|
-
// ADR 0045) — src/bongos/app-pair.js. Pure in-memory, injected clock, no DB,
|
|
5
|
-
// no network. Locks down the security-load-bearing behaviors: one-shot token
|
|
6
|
-
// delivery, no-oracle expiry/unknown responses, TTL, the pending→approved
|
|
7
|
-
// state machine, code normalization, and the memory cap.
|
|
8
|
-
//
|
|
9
|
-
// Run: node tests/app_pair.mjs
|
|
10
|
-
|
|
11
|
-
import { strict as assert } from 'node:assert';
|
|
12
|
-
import { createRequire } from 'node:module';
|
|
13
|
-
|
|
14
|
-
const require = createRequire(import.meta.url);
|
|
15
|
-
const { createPairStore, normalizeCode } = require('../src/bongos/app-pair.js');
|
|
16
|
-
|
|
17
|
-
let passed = 0;
|
|
18
|
-
let failed = 0;
|
|
19
|
-
function t(name, fn) {
|
|
20
|
-
try { fn(); passed++; console.log(` PASS ${name}`); }
|
|
21
|
-
catch (e) { failed++; console.log(` FAIL ${name}\n ${e.message}`); }
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
const NOW = Date.parse('2026-06-10T12:00:00Z');
|
|
25
|
-
function storeAt(opts = {}) {
|
|
26
|
-
let now = NOW;
|
|
27
|
-
const store = createPairStore({ nowMs: () => now, ...opts });
|
|
28
|
-
return { store, tick: (ms) => { now += ms; } };
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
console.log('normalizeCode:');
|
|
32
|
-
|
|
33
|
-
t('accepts canonical XXXX-XXXX and returns it unchanged', () => {
|
|
34
|
-
assert.equal(normalizeCode('ABCD-EFGH'), 'ABCD-EFGH');
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
t('normalizes case, spaces, and a missing dash', () => {
|
|
38
|
-
assert.equal(normalizeCode(' abcd efgh '), 'ABCD-EFGH');
|
|
39
|
-
assert.equal(normalizeCode('abcdefgh'), 'ABCD-EFGH');
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
t('rejects wrong length, off-alphabet chars (0/O/1/I/L/U/V), and non-strings', () => {
|
|
43
|
-
assert.equal(normalizeCode('ABC-DEFG'), null);
|
|
44
|
-
assert.equal(normalizeCode('ABCD-EFG0'), null); // 0 not in alphabet
|
|
45
|
-
assert.equal(normalizeCode('ABCD-EFGI'), null); // I not in alphabet
|
|
46
|
-
assert.equal(normalizeCode('ABCD-EFGU'), null); // U not in alphabet
|
|
47
|
-
assert.equal(normalizeCode(null), null);
|
|
48
|
-
assert.equal(normalizeCode(12345678), null);
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
console.log('start:');
|
|
52
|
-
|
|
53
|
-
t('start returns a well-formed pairing', () => {
|
|
54
|
-
const { store } = storeAt();
|
|
55
|
-
const out = store.start({ deviceName: 'OTB Dev Box', platform: 'mac' });
|
|
56
|
-
assert.match(out.pairCode, /^[A-HJ-NP-TW-Z2-9]{4}-[A-HJ-NP-TW-Z2-9]{4}$/);
|
|
57
|
-
assert.match(out.pollToken, /^[0-9a-f]{64}$/);
|
|
58
|
-
assert.equal(out.expiresIn, 600);
|
|
59
|
-
assert.equal(out.interval, 5);
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
t('start truncates oversized device names and defaults missing fields', () => {
|
|
63
|
-
const { store } = storeAt();
|
|
64
|
-
const out = store.start({ deviceName: 'x'.repeat(500) });
|
|
65
|
-
const info = store.info(out.pairCode);
|
|
66
|
-
assert.equal(info.deviceName.length, 80);
|
|
67
|
-
assert.equal(info.platform, 'unknown');
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
t('start refuses beyond the memory cap with error:busy', () => {
|
|
71
|
-
const { store } = storeAt({ maxPending: 3 });
|
|
72
|
-
for (let i = 0; i < 3; i++) assert.ok(store.start({}).pairCode);
|
|
73
|
-
assert.deepEqual(store.start({}), { error: 'busy' });
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
t('expired entries free cap space (lazy purge)', () => {
|
|
77
|
-
const { store, tick } = storeAt({ maxPending: 2, ttlMs: 1000 });
|
|
78
|
-
store.start({});
|
|
79
|
-
store.start({});
|
|
80
|
-
tick(1001);
|
|
81
|
-
assert.ok(store.start({}).pairCode, 'cap should free after expiry');
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
console.log('info:');
|
|
85
|
-
|
|
86
|
-
t('info shows device details for a live pending code (any input form)', () => {
|
|
87
|
-
const { store } = storeAt();
|
|
88
|
-
const { pairCode } = store.start({ deviceName: 'OTB Dev Box', platform: 'windows' });
|
|
89
|
-
const info = store.info(pairCode.toLowerCase().replace('-', ' '));
|
|
90
|
-
assert.equal(info.deviceName, 'OTB Dev Box');
|
|
91
|
-
assert.equal(info.platform, 'windows');
|
|
92
|
-
assert.equal(info.status, 'pending');
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
t('info: unknown and expired are indistinguishable (both null)', () => {
|
|
96
|
-
const { store, tick } = storeAt({ ttlMs: 1000 });
|
|
97
|
-
const { pairCode } = store.start({});
|
|
98
|
-
tick(1001);
|
|
99
|
-
assert.equal(store.info(pairCode), null);
|
|
100
|
-
assert.equal(store.info('ABCD-EFGH'), null);
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
console.log('approve:');
|
|
104
|
-
|
|
105
|
-
t('approve parks the grant exactly once', () => {
|
|
106
|
-
const { store } = storeAt();
|
|
107
|
-
const { pairCode } = store.start({});
|
|
108
|
-
assert.deepEqual(store.approve(pairCode, { token: 'tok1' }), { ok: true });
|
|
109
|
-
assert.deepEqual(store.approve(pairCode, { token: 'tok2' }), { error: 'already_approved' });
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
t('approve on unknown or expired code → not_found', () => {
|
|
113
|
-
const { store, tick } = storeAt({ ttlMs: 1000 });
|
|
114
|
-
const { pairCode } = store.start({});
|
|
115
|
-
assert.deepEqual(store.approve('ABCD-EFGH', { token: 't' }), { error: 'not_found' });
|
|
116
|
-
tick(1001);
|
|
117
|
-
assert.deepEqual(store.approve(pairCode, { token: 't' }), { error: 'not_found' });
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
console.log('poll:');
|
|
121
|
-
|
|
122
|
-
t('poll is pending before approval, delivers the grant once, then expired', () => {
|
|
123
|
-
const { store } = storeAt();
|
|
124
|
-
const { pairCode, pollToken } = store.start({});
|
|
125
|
-
assert.deepEqual(store.poll(pollToken), { status: 'pending', interval: 5 });
|
|
126
|
-
const grant = { token: 'sess-token', builder: { github_login: 'larstest' } };
|
|
127
|
-
store.approve(pairCode, grant);
|
|
128
|
-
const out = store.poll(pollToken);
|
|
129
|
-
assert.equal(out.status, 'approved');
|
|
130
|
-
assert.deepEqual(out.grant, grant);
|
|
131
|
-
// One-shot: the entry is gone; replay of the SAME poll token yields expired.
|
|
132
|
-
assert.deepEqual(store.poll(pollToken), { status: 'expired' });
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
t('poll: unknown token and expired pairing are indistinguishable', () => {
|
|
136
|
-
const { store, tick } = storeAt({ ttlMs: 1000 });
|
|
137
|
-
const { pollToken } = store.start({});
|
|
138
|
-
assert.deepEqual(store.poll('f'.repeat(64)), { status: 'expired' });
|
|
139
|
-
tick(1001);
|
|
140
|
-
assert.deepEqual(store.poll(pollToken), { status: 'expired' });
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
t('an approved-but-never-polled grant still dies at TTL', () => {
|
|
144
|
-
const { store, tick } = storeAt({ ttlMs: 1000 });
|
|
145
|
-
const { pairCode, pollToken } = store.start({});
|
|
146
|
-
store.approve(pairCode, { token: 'sess' });
|
|
147
|
-
tick(1001);
|
|
148
|
-
assert.deepEqual(store.poll(pollToken), { status: 'expired' });
|
|
149
|
-
assert.equal(store._size(), 0, 'expired entry purged');
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
t('a delivered grant leaves no residue in the store', () => {
|
|
153
|
-
const { store } = storeAt();
|
|
154
|
-
const { pairCode, pollToken } = store.start({});
|
|
155
|
-
store.approve(pairCode, { token: 'sess' });
|
|
156
|
-
store.poll(pollToken);
|
|
157
|
-
assert.equal(store._size(), 0);
|
|
158
|
-
});
|
|
159
|
-
|
|
160
|
-
t('pair code cannot poll; poll token cannot approve (credential separation)', () => {
|
|
161
|
-
const { store } = storeAt();
|
|
162
|
-
const { pairCode, pollToken } = store.start({});
|
|
163
|
-
assert.deepEqual(store.poll(pairCode), { status: 'expired' });
|
|
164
|
-
assert.deepEqual(store.approve(pollToken, { token: 't' }), { error: 'not_found' });
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
console.log(`\n${passed} passed, ${failed} failed`);
|
|
168
|
-
process.exit(failed === 0 ? 0 : 1);
|