socketduct 0.1.25 → 0.1.27

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.
Files changed (58) hide show
  1. package/AGENTS.md +2 -2
  2. package/changelog.d/20261010130509-bound-log-frame-compression-memory.md +1 -0
  3. package/changelog.d/20261025070000-reclaim-unreadable-retention-lock.md +14 -0
  4. package/docs/runbooks/jsonl-integrity-rollout.md +8 -6
  5. package/package.json +2 -2
  6. package/scripts/test.js +9 -14
  7. package/src/logging/compressed-log-writer.js +1 -1
  8. package/src/logging/log-retention.js +36 -1
  9. package/src/logging/zstd-frame-codec.js +15 -1
  10. package/test/e2e/gateway-process.test.js +93 -92
  11. package/test/e2e/logger-shutdown-process.test.js +40 -37
  12. package/test/e2e/reverse-client-recovery-process.test.js +107 -103
  13. package/test/e2e/reverse-gateway-process.test.js +328 -318
  14. package/test/integration/initial-target-recovery.test.js +333 -334
  15. package/test/integration/logging-cli.test.js +121 -119
  16. package/test/integration/logging-compressed-recovery.test.js +96 -95
  17. package/test/integration/multiplexed-compatibility.test.js +178 -177
  18. package/test/integration/multiplexed-corrections.test.js +360 -359
  19. package/test/integration/multiplexed-failures.test.js +253 -251
  20. package/test/integration/multiplexed-transport-set.test.js +334 -322
  21. package/test/integration/multiplexed-transport.test.js +135 -134
  22. package/test/integration/reverse-gateway-stream-id-reset.test.js +90 -89
  23. package/test/integration/reverse-gateway.test.js +2309 -2218
  24. package/test/integration/reverse-resume-continuity.test.js +219 -218
  25. package/test/integration/reverse-route-class.test.js +358 -341
  26. package/test/integration/socketduct-http-agent.test.js +314 -312
  27. package/test/integration/socketduct-https-agent.test.js +516 -485
  28. package/test/integration/stream-compression.test.js +862 -824
  29. package/test/integration/tcp-forwarding.test.js +2550 -2447
  30. package/test/integration/tls-forwarding.test.js +593 -592
  31. package/test/unit/auth/auth.test.js +43 -44
  32. package/test/unit/auth/static-token-store.test.js +9 -8
  33. package/test/unit/client/connect.test.js +41 -40
  34. package/test/unit/client/deferred-virtual-socket.test.js +95 -94
  35. package/test/unit/client/multiplexed-spool-budget.test.js +155 -154
  36. package/test/unit/client/multiplexed-transport-set.test.js +830 -748
  37. package/test/unit/client/socketduct-socket.test.js +768 -771
  38. package/test/unit/client/virtual-socket.test.js +198 -168
  39. package/test/unit/config/docker-gateway-files.test.js +224 -224
  40. package/test/unit/config/environment.test.js +472 -492
  41. package/test/unit/index.test.js +53 -52
  42. package/test/unit/logging/compressed-log-worker.test.js +23 -22
  43. package/test/unit/logging/compressed-log-writer.test.js +155 -154
  44. package/test/unit/logging/log-retention.test.js +71 -48
  45. package/test/unit/logging/log-segment-index.test.js +84 -81
  46. package/test/unit/logging/zstd-frame-codec.test.js +28 -19
  47. package/test/unit/protocol/compression.test.js +254 -298
  48. package/test/unit/protocol/frame.test.js +280 -276
  49. package/test/unit/protocol/v3-compression.test.js +21 -23
  50. package/test/unit/protocol/v3-frame.test.js +42 -41
  51. package/test/unit/release-configuration.test.js +15 -12
  52. package/test/unit/reverse/disconnect-attribution.test.js +65 -64
  53. package/test/unit/reverse-terminal-outcomes.test.js +53 -50
  54. package/test/unit/server/control-handler.test.js +232 -231
  55. package/test/unit/server/primary.test.js +51 -49
  56. package/test/unit/server/relay-runtime.test.js +280 -294
  57. package/test/unit/sessions/session.test.js +48 -62
  58. package/test/unit/spool/spool-file.test.js +401 -385
@@ -1,5 +1,4 @@
1
- import assert from "node:assert/strict"
2
- import test from "node:test"
1
+ import {describe, expect, it} from "@velocious/testing"
3
2
 
4
3
  import {
5
4
  createSession,
@@ -8,77 +7,64 @@ import {
8
7
  SessionStore
9
8
  } from "../../../src/sessions/session.js"
10
9
 
11
- test("createSession creates a named creating session with an opaque identifier", () => {
12
- const session = createSession({name: "Office link", ownerId: "user-1", target: {host: "127.0.0.1", port: 22}})
10
+ describe("session store", () => {
11
+ it("createSession creates a named creating session with an opaque identifier", () => {
12
+ const session = createSession({name: "Office link", ownerId: "user-1", target: {host: "127.0.0.1", port: 22}})
13
13
 
14
- assert.equal(session.name, "Office link")
15
- assert.equal(session.ownerId, "user-1")
16
- assert.equal(session.state, "creating")
17
- assert.match(session.identifier, /^[a-zA-Z0-9_-]{32,}$/)
18
- assert.equal(session.clientSequence, 0)
19
- assert.equal(session.relaySequence, 0)
20
- assert.deepEqual(session.target, {host: "127.0.0.1", port: 22})
21
- })
14
+ expect(session.name).toBe("Office link")
15
+ expect(session.ownerId).toBe("user-1")
16
+ expect(session.state).toBe("creating")
17
+ expect(session.identifier).toMatch(/^[a-zA-Z0-9_-]{32,}$/)
18
+ expect(session.clientSequence).toBe(0)
19
+ expect(session.relaySequence).toBe(0)
20
+ expect(session.target).toEqual({host: "127.0.0.1", port: 22})
21
+ })
22
22
 
23
- test("transitionSession only allows legal lifecycle transitions", () => {
24
- const session = createSession({name: "Flaky line", ownerId: "user-1", target: {host: "127.0.0.1", port: 22}, identifier: "session_123456789012345678901234567890"})
23
+ it("transitionSession only allows legal lifecycle transitions", () => {
24
+ const session = createSession({name: "Flaky line", ownerId: "user-1", target: {host: "127.0.0.1", port: 22}, identifier: "session_123456789012345678901234567890"})
25
25
 
26
- assert.equal(transitionSession(session, "active").state, "active")
27
- assert.equal(transitionSession({...session, state: "interrupted"}, "resuming").state, "resuming")
28
- assert.equal(transitionSession({...session, state: "resuming"}, "active").state, "active")
26
+ expect(transitionSession(session, "active").state).toBe("active")
27
+ expect(transitionSession({...session, state: "interrupted"}, "resuming").state).toBe("resuming")
28
+ expect(transitionSession({...session, state: "resuming"}, "active").state).toBe("active")
29
29
 
30
- assert.throws(
31
- () => transitionSession({...session, state: "active"}, "resuming"),
32
- /illegal session state transition/i
33
- )
34
- })
30
+ expect(() => transitionSession({...session, state: "active"}, "resuming")).toThrow(/illegal session state transition/i)
31
+ })
35
32
 
36
- test("SessionStore resumes sessions by identifier for the owning user", () => {
37
- const store = new SessionStore()
38
- const session = store.create({name: "Müggelheim relay", ownerId: "kasper", target: {host: "127.0.0.1", port: 22}})
39
- store.transition(session.identifier, "active")
40
- store.transition(session.identifier, "interrupted")
33
+ it("SessionStore resumes sessions by identifier for the owning user", () => {
34
+ const store = new SessionStore()
35
+ const session = store.create({name: "Müggelheim relay", ownerId: "kasper", target: {host: "127.0.0.1", port: 22}})
36
+ store.transition(session.identifier, "active")
37
+ store.transition(session.identifier, "interrupted")
41
38
 
42
- const resumed = resumeSession(store, {
43
- identifier: session.identifier,
44
- ownerId: "kasper"
45
- })
39
+ const resumed = resumeSession(store, {
40
+ identifier: session.identifier,
41
+ ownerId: "kasper"
42
+ })
46
43
 
47
- assert.equal(resumed.identifier, session.identifier)
48
- assert.equal(resumed.state, "resuming")
49
- })
44
+ expect(resumed.identifier).toBe(session.identifier)
45
+ expect(resumed.state).toBe("resuming")
46
+ })
50
47
 
51
- test("SessionStore rejects resume for a missing or expired session", () => {
52
- const store = new SessionStore({now: () => 2_000})
53
- store.create({name: "Expired", ownerId: "user-1", target: {host: "127.0.0.1", port: 22}, identifier: "expired_session_12345678901234567890", expiresAt: 1_000})
48
+ it("SessionStore rejects resume for a missing or expired session", () => {
49
+ const store = new SessionStore({now: () => 2_000})
50
+ store.create({name: "Expired", ownerId: "user-1", target: {host: "127.0.0.1", port: 22}, identifier: "expired_session_12345678901234567890", expiresAt: 1_000})
54
51
 
55
- assert.throws(
56
- () => resumeSession(store, {identifier: "missing_session_12345678901234567890", ownerId: "user-1"}),
57
- /not found/i
58
- )
59
- assert.throws(
60
- () => resumeSession(store, {identifier: "expired_session_12345678901234567890", ownerId: "user-1"}),
61
- /expired/i
62
- )
63
- })
52
+ expect(() => resumeSession(store, {identifier: "missing_session_12345678901234567890", ownerId: "user-1"})).toThrow(/not found/i)
53
+ expect(() => resumeSession(store, {identifier: "expired_session_12345678901234567890", ownerId: "user-1"})).toThrow(/expired/i)
54
+ })
64
55
 
65
- test("SessionStore rejects resume while initial target acquisition is still creating", () => {
66
- const store = new SessionStore()
67
- const session = store.create({name: "Pending", ownerId: "user-1", target: {host: "127.0.0.1", port: 22}})
56
+ it("SessionStore rejects resume while initial target acquisition is still creating", () => {
57
+ const store = new SessionStore()
58
+ const session = store.create({name: "Pending", ownerId: "user-1", target: {host: "127.0.0.1", port: 22}})
68
59
 
69
- assert.throws(
70
- () => resumeSession(store, {identifier: session.identifier, ownerId: "user-1"}),
71
- /not resumable/i
72
- )
73
- assert.equal(store.get(session.identifier)?.state, "creating")
74
- })
60
+ expect(() => resumeSession(store, {identifier: session.identifier, ownerId: "user-1"})).toThrow(/not resumable/i)
61
+ expect(store.get(session.identifier)?.state).toBe("creating")
62
+ })
75
63
 
76
- test("SessionStore prevents a different user from resuming a session", () => {
77
- const store = new SessionStore()
78
- const session = store.create({name: "Private", ownerId: "owner", target: {host: "127.0.0.1", port: 22}})
64
+ it("SessionStore prevents a different user from resuming a session", () => {
65
+ const store = new SessionStore()
66
+ const session = store.create({name: "Private", ownerId: "owner", target: {host: "127.0.0.1", port: 22}})
79
67
 
80
- assert.throws(
81
- () => resumeSession(store, {identifier: session.identifier, ownerId: "other-user"}),
82
- /does not belong/i
83
- )
68
+ expect(() => resumeSession(store, {identifier: session.identifier, ownerId: "other-user"})).toThrow(/does not belong/i)
69
+ })
84
70
  })