socketduct 0.1.25 → 0.1.26

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 (56) hide show
  1. package/AGENTS.md +2 -2
  2. package/changelog.d/20261010130509-bound-log-frame-compression-memory.md +1 -0
  3. package/docs/runbooks/jsonl-integrity-rollout.md +8 -6
  4. package/package.json +2 -2
  5. package/scripts/test.js +9 -14
  6. package/src/logging/compressed-log-writer.js +1 -1
  7. package/src/logging/zstd-frame-codec.js +15 -1
  8. package/test/e2e/gateway-process.test.js +93 -92
  9. package/test/e2e/logger-shutdown-process.test.js +40 -37
  10. package/test/e2e/reverse-client-recovery-process.test.js +107 -103
  11. package/test/e2e/reverse-gateway-process.test.js +328 -318
  12. package/test/integration/initial-target-recovery.test.js +333 -334
  13. package/test/integration/logging-cli.test.js +121 -119
  14. package/test/integration/logging-compressed-recovery.test.js +96 -95
  15. package/test/integration/multiplexed-compatibility.test.js +178 -177
  16. package/test/integration/multiplexed-corrections.test.js +360 -359
  17. package/test/integration/multiplexed-failures.test.js +253 -251
  18. package/test/integration/multiplexed-transport-set.test.js +334 -322
  19. package/test/integration/multiplexed-transport.test.js +135 -134
  20. package/test/integration/reverse-gateway-stream-id-reset.test.js +90 -89
  21. package/test/integration/reverse-gateway.test.js +2309 -2218
  22. package/test/integration/reverse-resume-continuity.test.js +219 -218
  23. package/test/integration/reverse-route-class.test.js +358 -341
  24. package/test/integration/socketduct-http-agent.test.js +314 -312
  25. package/test/integration/socketduct-https-agent.test.js +516 -485
  26. package/test/integration/stream-compression.test.js +862 -824
  27. package/test/integration/tcp-forwarding.test.js +2550 -2447
  28. package/test/integration/tls-forwarding.test.js +593 -592
  29. package/test/unit/auth/auth.test.js +43 -44
  30. package/test/unit/auth/static-token-store.test.js +9 -8
  31. package/test/unit/client/connect.test.js +41 -40
  32. package/test/unit/client/deferred-virtual-socket.test.js +95 -94
  33. package/test/unit/client/multiplexed-spool-budget.test.js +155 -154
  34. package/test/unit/client/multiplexed-transport-set.test.js +830 -748
  35. package/test/unit/client/socketduct-socket.test.js +768 -771
  36. package/test/unit/client/virtual-socket.test.js +198 -168
  37. package/test/unit/config/docker-gateway-files.test.js +224 -224
  38. package/test/unit/config/environment.test.js +472 -492
  39. package/test/unit/index.test.js +53 -52
  40. package/test/unit/logging/compressed-log-worker.test.js +23 -22
  41. package/test/unit/logging/compressed-log-writer.test.js +155 -154
  42. package/test/unit/logging/log-retention.test.js +52 -47
  43. package/test/unit/logging/log-segment-index.test.js +84 -81
  44. package/test/unit/logging/zstd-frame-codec.test.js +28 -19
  45. package/test/unit/protocol/compression.test.js +254 -298
  46. package/test/unit/protocol/frame.test.js +280 -276
  47. package/test/unit/protocol/v3-compression.test.js +21 -23
  48. package/test/unit/protocol/v3-frame.test.js +42 -41
  49. package/test/unit/release-configuration.test.js +15 -12
  50. package/test/unit/reverse/disconnect-attribution.test.js +65 -64
  51. package/test/unit/reverse-terminal-outcomes.test.js +53 -50
  52. package/test/unit/server/control-handler.test.js +232 -231
  53. package/test/unit/server/primary.test.js +51 -49
  54. package/test/unit/server/relay-runtime.test.js +280 -294
  55. package/test/unit/sessions/session.test.js +48 -62
  56. 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
  })