Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
313 commits
Select commit Hold shift + click to select a range
813c278
bench(compression): algorithms.js — deflate, Brotli and zstd by level…
Alex-Dolid Sep 19, 2026
e27f7a9
feat(compression): the platform codecs by name — 'brotli', 'zstd' — a…
Alex-Dolid Sep 19, 2026
2771bf4
feat(compression): a codec preference list, negotiated per direction
Alex-Dolid Sep 19, 2026
9b95156
feat(http): `encodings` — Brotli, zstd or an application's own Conten…
Alex-Dolid Sep 19, 2026
e8fd7fe
docs(compression): which algorithm — the table that decides, and what…
Alex-Dolid Sep 19, 2026
186b803
fix(client): a Bearer token is not lifted into an empty subprotocol o…
Alex-Dolid Sep 19, 2026
c4dcb5b
feat(rpc): the ws handshake reads declared headers/meta from subproto…
Alex-Dolid Sep 19, 2026
685745b
feat(client)!: ws headers/meta leave as real handshake headers, not i…
Alex-Dolid Sep 19, 2026
ae39c1d
feat(encryption): the primitives — AEAD, X25519, HKDF and a keyring b…
Alex-Dolid Sep 20, 2026
c1abc57
feat(encryption): `rooms.encryption` / `cluster.encryption` — sealed …
Alex-Dolid Sep 20, 2026
afd1a2f
feat(encryption): `sealedStore()` — a session store that holds nothin…
Alex-Dolid Sep 20, 2026
f6578b7
feat(encryption): session encryption — a Noise handshake on the WebSo…
Alex-Dolid Sep 20, 2026
53a9fc6
feat(encryption): session encryption over WebTransport
Alex-Dolid Sep 20, 2026
b434bcf
feat(encryption): sealed HTTP requests — HPKE per request
Alex-Dolid Sep 20, 2026
f2e1089
feat(encryption): sealed Server-Sent Events
Alex-Dolid Sep 20, 2026
6abef53
feat(encryption): sealed broker messages — `encryption` on every brok…
Alex-Dolid Sep 20, 2026
9ae1c10
feat(rooms): room events with bytes cross the backplane
Alex-Dolid Sep 20, 2026
ac726c3
feat(encryption): end-to-end helpers — createIdentity, createSealer, …
Alex-Dolid Sep 20, 2026
da22251
docs(encryption): the encryption guide — do you need it, what it is b…
Alex-Dolid Sep 20, 2026
b4e78ae
fix(webrtc): roster data cannot shadow peer/room/claims; members() is…
Alex-Dolid Sep 26, 2026
dd88c86
fix(webrtc): an empty continuation fragment is a framing error; the f…
Alex-Dolid Sep 26, 2026
b6487be
fix(webrtc): a peer demanding fragments under 1 KiB is refused
Alex-Dolid Sep 26, 2026
9ef5f63
fix(webrtc): a trust assertion binds to every a=fingerprint line, not…
Alex-Dolid Sep 26, 2026
0feb272
fix(attachments): toJSON() objects are opaque; a cyclic packet is JSO…
Alex-Dolid Sep 26, 2026
2e13803
fix(client): the worker proxy routes attachments frames, and answers …
Alex-Dolid Sep 26, 2026
beaa2db
fix(encryption): an injected Cipher no longer seals envelopes under a…
Alex-Dolid Sep 26, 2026
3f26e75
fix(encryption): a Noise client delivers nothing after a frame that d…
Alex-Dolid Sep 26, 2026
132cf9b
fix(encryption): a sealed event stream's key is salted with a server …
Alex-Dolid Sep 26, 2026
43b93fa
fix(encryption): a sealed request cannot declare what the proxy knows…
Alex-Dolid Sep 26, 2026
8b6bc2f
fix(encryption): required reaches the fastify adapter's native REST r…
Alex-Dolid Sep 26, 2026
4feabcf
fix(broker): the binding's goodbye is sealed like every other frame
Alex-Dolid Sep 26, 2026
b47c0a8
fix(encryption): the sealing seams refuse and log instead of crashing
Alex-Dolid Sep 26, 2026
6ca2de7
fix(sse): a server-drawn channel secret authorizes the channel; the i…
Alex-Dolid Sep 26, 2026
0b63b12
fix(http): response headers are validated at every seam; a refused re…
Alex-Dolid Sep 26, 2026
e63c484
fix(client): a hook refusing the first transport candidate rejects co…
Alex-Dolid Sep 26, 2026
db79189
fix(encryption): required no longer breaks attachConsumers and attach…
Alex-Dolid Sep 26, 2026
b20e2d7
fix(kafka): close() keeps the queue's durable group; reader groups go…
Alex-Dolid Sep 26, 2026
7e76764
fix(broker): a feed read is positioned at ready and released before i…
Alex-Dolid Sep 26, 2026
76e3d4d
fix(broker): a signed feed id is bound to the topic it was issued for
Alex-Dolid Sep 26, 2026
6034f0c
fix(wt): an inbound stream is held no further than its first read, ca…
Alex-Dolid Sep 26, 2026
e993701
fix(wt): sessions are accepted concurrently, under one deadline, with…
Alex-Dolid Sep 26, 2026
a27cf18
fix(wt): declare DEFAULT_MAX_PENDING in wt.d.ts
Alex-Dolid Sep 26, 2026
8aa77c5
docs(changelog): a Changed (breaking) section with the attachments en…
Alex-Dolid Sep 26, 2026
3c3a1ff
feat(core)!: generateId throws on a bad value on RpcServer, WrpcClien…
Alex-Dolid Sep 26, 2026
3633c4c
docs(stability): @alexify/wrpc/encryption is @experimental whole, wit…
Alex-Dolid Sep 26, 2026
8d92645
style(tests): format attachments and signaling suites
Alex-Dolid Sep 26, 2026
ea27114
fix(webrtc): WrpcPeer takes the shared peer-id bound; the stale-leave…
Alex-Dolid Sep 26, 2026
4a8ae82
fix(broker): an evicted token client finishes its deliveries before c…
Alex-Dolid Sep 26, 2026
f6601bf
fix(broker)!: token consumer clients are re-validated after tokenTtl,…
Alex-Dolid Sep 26, 2026
d315928
fix(broker): a dead-letter reason is folded to one bounded header lin…
Alex-Dolid Sep 26, 2026
db4de92
fix(broker): MemoryBroker retries a delivery whose handler threw, wit…
Alex-Dolid Sep 26, 2026
e83d598
fix(broker): the Redis, NATS, RabbitMQ and Kafka adapters retry a del…
Alex-Dolid Sep 26, 2026
3dcbec4
docs(encryption): a retired broker key stays in the ring until the ba…
Alex-Dolid Sep 26, 2026
0729871
fix(broker): an unknown key id is retried, refusals are counted, a fe…
Alex-Dolid Sep 26, 2026
501feca
fix(broker): attachBrokerRpc caps its sessions and never hands a live…
Alex-Dolid Sep 26, 2026
72d31ca
fix(broker)!: a sealed RPC session takes no plaintext frame
Alex-Dolid Sep 26, 2026
4da503d
fix(broker)!: a sealed request carries the sender's clock; a shared r…
Alex-Dolid Sep 26, 2026
468abfd
feat(broker): sealed dead letters open for onDeadLetter, a re-drive b…
Alex-Dolid Sep 26, 2026
f681d37
fix(broker): adapter numeric options are TypeErrors at construction; …
Alex-Dolid Sep 26, 2026
87ec26c
fix(amqp)!: one direct exchange with the address as routing key, not …
Alex-Dolid Sep 26, 2026
31f33ff
fix(amqp): a channel the server closed is forgotten; a consumer re-op…
Alex-Dolid Sep 26, 2026
f54ce7d
fix(amqp): the backplane multiplexes every room over one consumer cha…
Alex-Dolid Sep 26, 2026
0de777e
fix(broker): consumers.healthy follows a RabbitMQ channel loss and a …
Alex-Dolid Sep 26, 2026
b06668e
fix(broker): a settlement Kafka or RabbitMQ refuses is retried, then …
Alex-Dolid Sep 26, 2026
0dc82a4
fix(broker): a feed's catch-up pages until the tip, not until a slow …
Alex-Dolid Sep 26, 2026
530a313
fix(broker): a feed's live read the broker ends is replaced, and the …
Alex-Dolid Sep 26, 2026
e0e2267
fix(redis): a delayed retry is one set member per message, promoted a…
Alex-Dolid Sep 26, 2026
145bbaa
fix(redis): an RPC group's presence is per member; close() stops hear…
Alex-Dolid Sep 26, 2026
b0463ea
fix(amqp): a nacked direct publish is the same 503, and an inbox unbi…
Alex-Dolid Sep 26, 2026
48a67a3
fix(nats): the lease keepalive runs every third of ackWait, and the t…
Alex-Dolid Sep 26, 2026
767febe
fix(nats): prefetch is per instance and maxAckPending the group cap; …
Alex-Dolid Sep 26, 2026
9ddc02f
fix(kafka): topics are created with the broker's default replication …
Alex-Dolid Sep 26, 2026
efc1302
test(broker): the queue contract's concurrency case holds a delivery …
Alex-Dolid Sep 26, 2026
d58f557
fix(wt): every false from send()/write() is followed by a drain; held…
Alex-Dolid Sep 26, 2026
688f282
fix(wt): pause() stops the side streams too, and their bytes keep the…
Alex-Dolid Sep 26, 2026
c9d5e17
fix(webrtc): a false from write() under an asynchronous codec is foll…
Alex-Dolid Sep 26, 2026
cca953e
feat(wt, webrtc): a consumer that never drains is disconnected at max…
Alex-Dolid Sep 26, 2026
1e6f756
fix(webrtc): a send() the channel throws from cannot desynchronise th…
Alex-Dolid Sep 26, 2026
a8604f1
fix(rpc): attach checks the transport contract whole, and nothing a p…
Alex-Dolid Sep 26, 2026
894229d
fix(compression): an inflate is never an unhandled rejection, and no …
Alex-Dolid Sep 26, 2026
9a41b3d
fix(client): createBlobUploader().upload() honours backpressure, and …
Alex-Dolid Sep 26, 2026
a4f07bb
fix(webrtc): one link per peer under a racing connect(), and no unhan…
Alex-Dolid Sep 26, 2026
c829ae5
fix(webrtc): a responder no longer burns its redial budget or kills t…
Alex-Dolid Sep 26, 2026
47a2b92
fix(webrtc): one failure of keys() no longer poisons the assertion ve…
Alex-Dolid Sep 26, 2026
51369c1
feat(webrtc): the signaling relay has ceilings, one lookup per room, …
Alex-Dolid Sep 26, 2026
2152f18
fix(ws): the inbound inflate queue has backpressure
Alex-Dolid Sep 26, 2026
06c00f8
fix(ws): permessage-deflate level and memLevel apply on every deflate…
Alex-Dolid Sep 26, 2026
f115880
fix(encryption): sealedStore refuses a sealed record under the raw to…
Alex-Dolid Sep 26, 2026
aff0602
fix(encryption): sealedStore requires kids() of a key provider, and s…
Alex-Dolid Sep 26, 2026
7892e9a
fix(sessions): a session finalized on one connection or instance is n…
Alex-Dolid Sep 26, 2026
7ffed8d
fix(client): the declared bags share one query budget as the server m…
Alex-Dolid Sep 26, 2026
0bd12a1
fix(client): the worker proxy drops an answer for a tab that left, an…
Alex-Dolid Sep 26, 2026
044be90
fix(encryption): the sealed-request replay memory refuses at its cap,…
Alex-Dolid Sep 26, 2026
71038c0
fix(rpc): the declared ws headers refuse the identity-aware proxy nam…
Alex-Dolid Sep 26, 2026
270d9cb
fix(rpc): a refusal is one log line at the level it deserves, and the…
Alex-Dolid Sep 26, 2026
d744bb3
docs(cluster): cluster.secret authenticates authorship, not freshness…
Alex-Dolid Sep 26, 2026
6e8c1e2
fix(deflate): a dynamic block's decoding table is bounded by its head…
Alex-Dolid Sep 27, 2026
e7f996c
docs(encryption): no dangerous promises — cookies stay outside a seal…
Alex-Dolid Sep 27, 2026
b986f43
docs(encryption): rekeyAfter is a per-deployment constant, not negoti…
Alex-Dolid Sep 27, 2026
55ca44c
fix(cluster): sendTo with bytes for a client on another instance is r…
Alex-Dolid Sep 27, 2026
8a6a344
fix(rooms): the backplane's per-channel publish counters are bounded …
Alex-Dolid Sep 27, 2026
0176031
fix(encryption): a broadcast flood during a client's handshake is dro…
Alex-Dolid Sep 27, 2026
b9ebce9
fix(http): Accept-Encoding is read in one pass and capped at 256 bytes
Alex-Dolid Sep 27, 2026
2d8fb95
perf(rpc): the compiled-serializer fast path walks a result for bytes…
Alex-Dolid Sep 27, 2026
e26d71b
fix(webrtc): a raw channel's maxMessageSize is validated where it is …
Alex-Dolid Sep 27, 2026
196b873
test(broker): the feed's resume, gap and snapshot scenarios are one s…
Alex-Dolid Sep 27, 2026
b8ac2b9
docs(bench): the numbers price what actually runs — a sealed fan-out,…
Alex-Dolid Sep 27, 2026
aa357af
test: one log recorder that keeps a child's bindings, one in-memory m…
Alex-Dolid Sep 27, 2026
d4c2f50
fix(telemetry): the backplane-gap counter is labelled by channel kind…
Alex-Dolid Sep 27, 2026
36a42a2
fix(broker): trace context on a message rides as traceparent/tracesta…
Alex-Dolid Sep 27, 2026
be36523
fix(engine): a connection that dies on an engine leaves a line — the …
Alex-Dolid Sep 27, 2026
bfac654
docs(client): what the client could not declare is visible only with …
Alex-Dolid Sep 27, 2026
ec298e7
fix(webrtc): the assertions counter carries the verifier's refusal co…
Alex-Dolid Sep 27, 2026
00a3cdf
fix(encryption): a refused session handshake names the peer, says why…
Alex-Dolid Sep 27, 2026
8eac2c1
fix(client): a sealed request the server refused is a typed error, an…
Alex-Dolid Sep 27, 2026
7d60898
fix(encryption): a key provider that throws while opening is an error…
Alex-Dolid Sep 27, 2026
cc9c030
fix(broker): a broker RPC session's end is logged at the level its re…
Alex-Dolid Sep 27, 2026
402084a
fix(wt): the server half of WebTransport logs a session's death
Alex-Dolid Sep 27, 2026
8ded308
test(package): the types and the runtime are checked both ways, on ev…
Alex-Dolid Sep 27, 2026
f2af4a4
docs(security): SECURITY.md covers the cryptography and the new parse…
Alex-Dolid Sep 27, 2026
3317f2b
ci: the NATS job runs JetStream through compose, a missing client fai…
Alex-Dolid Sep 27, 2026
23f7c55
fix(http): compression.async is validated by the one normalizer every…
Alex-Dolid Sep 27, 2026
d359e6a
types(broker): the injected client interfaces accept the real clients…
Alex-Dolid Sep 27, 2026
2104fa3
docs(readme): the Exports table is whole again, the size tables are c…
Alex-Dolid Sep 27, 2026
7de7576
fix(broker): the bindings log through the server's writer; feed.* and…
Alex-Dolid Sep 27, 2026
18dfee2
fix(rooms): compression and encryption validate without a backplane, …
Alex-Dolid Sep 27, 2026
2203b36
test(broker): the adapters' recovery branches run against faults the …
Alex-Dolid Sep 27, 2026
dbad66a
chore(size): the main browser entry's budget follows the bytes the ob…
Alex-Dolid Sep 27, 2026
1e012e1
feat(webrtc): a link's goodbye says why — reason on the wire, in the …
Alex-Dolid Sep 27, 2026
e675f12
docs(changelog): WebRTC ships stable, signaling included — the releas…
Alex-Dolid Sep 27, 2026
920817a
docs(protocol): the wire reference at revision 2.0 — three tiers, sin…
Alex-Dolid Sep 27, 2026
ed972b5
test(websocket): the inflate-burst waits are time-bound, as the infla…
Alex-Dolid Sep 27, 2026
052621c
feat(cluster)!: a signed envelope is counted, bound to its channel an…
Alex-Dolid Oct 1, 2026
85d34ff
feat(cluster): bytes cross the cluster channels — sendTo, node events…
Alex-Dolid Oct 1, 2026
227c8b9
fix(encryption): a sealed envelope's sender is known by its suite too…
Alex-Dolid Oct 1, 2026
c6dd3b0
fix(client): `static encrypts` is checked by deed, and a per-request …
Alex-Dolid Oct 1, 2026
d72f076
fix(encryption): a kid withdrawn from a live key provider stops worki…
Alex-Dolid Oct 1, 2026
1cc9d87
perf(encryption): a sealed fan-out builds its plaintext inner frame o…
Alex-Dolid Oct 1, 2026
b589fa3
fix(ws)!: close() delivers what send() accepted — with context takeov…
Alex-Dolid Oct 1, 2026
3741190
feat(observability): a compression codec that fails is said once and …
Alex-Dolid Oct 1, 2026
7da0166
perf(deflate): a codec prepares its dictionary once — a message costs…
Alex-Dolid Oct 1, 2026
3ff559b
fix(wt): close() delivers what was sent before it — the stream first,…
Alex-Dolid Oct 1, 2026
0c40083
fix(wt): an unreliable datagram the session has not kept up with is d…
Alex-Dolid Oct 1, 2026
1c8a191
fix(wt): the types match the runtime, and an onError that throws does…
Alex-Dolid Oct 1, 2026
905ebb3
perf(wt): the stream mux reads a chunk's header once; the per-chunk p…
Alex-Dolid Oct 1, 2026
f617133
refactor(wt): one channel core for the server socket and the client t…
Alex-Dolid Oct 1, 2026
992550e
fix(webrtc): the port contract requires send() to copy; the declarati…
Alex-Dolid Oct 1, 2026
cbe771e
fix(webrtc): a mesh dials a lost edge again while the member is still…
Alex-Dolid Oct 1, 2026
0cccb8c
perf(webrtc): a fan-out prepares its message once for every link — on…
Alex-Dolid Oct 1, 2026
41f72e9
refactor(webrtc): PeerLink in its own file; WrpcPeer's internals are …
Alex-Dolid Oct 1, 2026
ac0dd05
docs(broker): what a retry delay means on RabbitMQ, and how to drain …
Alex-Dolid Oct 1, 2026
48ca4ab
fix(broker/kafka): a resume storm is queued — maxCatchUp pages at a t…
Alex-Dolid Oct 1, 2026
fc9392b
feat(observability): broker RPC session ends are counted by reason; a…
Alex-Dolid Oct 1, 2026
788fdd0
feat(broker): attachBrokerRpc().healthy is its listeners' own word — …
Alex-Dolid Oct 1, 2026
87ce170
perf(broker): a durable feed opens and signs an entry once for all it…
Alex-Dolid Oct 1, 2026
1f06821
test(broker/kafka): every broker is closed by t.after; CI's test run …
Alex-Dolid Oct 1, 2026
c6fd6f2
refactor(broker): the four adapters share one leaf — src/broker/adapt…
Alex-Dolid Oct 1, 2026
a20d9e4
refactor(broker/rpc): one frameBody and one sessionFrame for both end…
Alex-Dolid Oct 1, 2026
9ebffac
test(rpc): the channel-close assertions wait for 'closed', not for th…
Alex-Dolid Oct 1, 2026
743cc85
refactor(rpc): one #identify for the five request-shaped entry points…
Alex-Dolid Oct 1, 2026
4cbac45
test: one waitFor; quiet windows of the queue contract scale with the…
Alex-Dolid Oct 1, 2026
581c334
docs(logging): the catalogue names every event the source writes — an…
Alex-Dolid Oct 1, 2026
256aadc
ci(coverage): per-file floors for the directories new in 2.0 — script…
Alex-Dolid Oct 1, 2026
0ce1479
test(scaling): the Redis session stores run against a real Redis — TT…
Alex-Dolid Oct 1, 2026
f37cca7
chore(examples): lint and format cover examples/; a smoke test checks…
Alex-Dolid Oct 1, 2026
ee62aba
docs(claude): symbols instead of file:line, the src/webtransport/ map…
Alex-Dolid Oct 1, 2026
9b3b966
docs(a11y): a heading's permalink label is its text — the badge's in …
Alex-Dolid Oct 1, 2026
95b344d
docs(size): the README and browser-guide size tables, regenerated fro…
Alex-Dolid Oct 1, 2026
29cc7ed
fix(scripts): the Autobahn runner fails a run the fuzzing client cut …
Alex-Dolid Oct 1, 2026
d1c151d
test(interop): the published 1.0 as a peer — a devDependency alias an…
Alex-Dolid Oct 2, 2026
e661ca9
feat(protocol): wrpc.v2 is negotiated on a WebSocket — a 1.0 peer is …
Alex-Dolid Oct 2, 2026
052b6f8
feat(client): a page's labels reach a 1.0 server — one redial with th…
Alex-Dolid Oct 2, 2026
d143d2e
feat(protocol): revision 2 over HTTP — the server says it in wrpc-ver…
Alex-Dolid Oct 2, 2026
b08e084
feat(sse): the ready frame carries the whole channel reference — a 1.…
Alex-Dolid Oct 2, 2026
9608af2
feat(protocol): a worker port negotiates the revision on its first pi…
Alex-Dolid Oct 2, 2026
4072c04
docs(protocol): the page describes revision 2 — what is negotiated, w…
Alex-Dolid Oct 2, 2026
9544da7
test(client): the redial in the tree's own modules; bench(rooms): a f…
Alex-Dolid Oct 2, 2026
dab41c3
fix(http): what throws while a request is routed is answered 500; an …
Alex-Dolid Oct 3, 2026
4b27246
fix(rpc): a packet id is a string of at most 255 characters or a numb…
Alex-Dolid Oct 3, 2026
cc1e07f
fix(ws): bytes sent with the upgrade request are read after the conne…
Alex-Dolid Oct 3, 2026
823f5d0
fix(encryption): a sealed request cannot declare what an identity-awa…
Alex-Dolid Oct 3, 2026
1264f4c
fix(sse): an SSE channel speaks revision 1 to every client — bytes tr…
Alex-Dolid Oct 3, 2026
79bf48d
fix(client): a worker port under a packet codec sends its revision pi…
Alex-Dolid Oct 3, 2026
91d5e15
fix(client): an HTTP frame refused by a server that does not say 2 is…
Alex-Dolid Oct 3, 2026
2a3f433
fix(client): the ws redial names every declared header it puts in the…
Alex-Dolid Oct 3, 2026
547d23d
fix(rpc): revision.mismatch is a warn once, then debug
Alex-Dolid Oct 3, 2026
9b2faaf
fix(http): an answer whose form follows Accept says Vary: Accept
Alex-Dolid Oct 3, 2026
9366eb4
feat(telemetry): connections are counted by the protocol revision the…
Alex-Dolid Oct 3, 2026
ae9485e
fix(wt): WebTransport negotiates the revision in its capabilities mes…
Alex-Dolid Oct 3, 2026
3c560a0
fix(types): the d.ts files declare the revision members; the parity g…
Alex-Dolid Oct 3, 2026
53f4f3a
style(tests): the member parity guard passes lint
Alex-Dolid Oct 3, 2026
734d5df
fix(webrtc): a peer's descriptions carry the revision of each half — …
Alex-Dolid Oct 3, 2026
6cb6431
fix(broker): a session negotiates the revision on hello/welcome; a st…
Alex-Dolid Oct 3, 2026
bf74134
docs(engine): socket.protocol decides the revision — said in the cont…
Alex-Dolid Oct 3, 2026
046464a
ci(interop): a missing wrpc-v1 alias fails under WRPC_INTEGRATION_STR…
Alex-Dolid Oct 3, 2026
5940684
fix(sessions): a logout ends the session on every connection of the i…
Alex-Dolid Oct 3, 2026
c09899f
fix(encryption): a full replay memory answers 503, not a 409 that tel…
Alex-Dolid Oct 3, 2026
ce63568
fix(rpc): a declared header name must be an RFC 9110 token, and _ cou…
Alex-Dolid Oct 3, 2026
a702664
fix(rpc): subscribe.refused clips the peer's id
Alex-Dolid Oct 3, 2026
5d92761
feat(rpc): maxStreams caps the binary streams one connection holds open
Alex-Dolid Oct 3, 2026
8094ba1
fix(client): the worker proxy opens one upstream connection, and answ…
Alex-Dolid Oct 3, 2026
809f6b8
fix(client): upload() of a blob uploader runs once — a second call re…
Alex-Dolid Oct 3, 2026
321889b
fix(wt): a WtSocket whose option is refused leaves no idle timer behind
Alex-Dolid Oct 3, 2026
fb36780
fix(wt): acceptSessions checks the per-session options at the call
Alex-Dolid Oct 3, 2026
1737ffe
fix(wt): what the peer sent before a graceful close is delivered unde…
Alex-Dolid Oct 3, 2026
e732886
fix(wt): a session cut off past maxBackpressure is a wt.backpressure …
Alex-Dolid Oct 3, 2026
b07655f
fix(webrtc): a message larger than maxBackpressure goes on an empty c…
Alex-Dolid Oct 3, 2026
a31e377
fix(webrtc): the signaling unit's maxRooms holds for joins sent together
Alex-Dolid Oct 3, 2026
3aaf5c4
test(webrtc): wait for the refusing half's channel to close instead o…
Alex-Dolid Oct 3, 2026
52a4b88
fix(webrtc): a mesh does not dial again a link an application closed
Alex-Dolid Oct 3, 2026
f94163d
fix(webrtc): the assertion verifier backs off a failed key load, and …
Alex-Dolid Oct 3, 2026
60fcfde
fix(encryption): the sealed-envelope sender memory evicts the least r…
Alex-Dolid Oct 3, 2026
a640c8b
fix(cluster): a refused backplane or cluster envelope is a warn once,…
Alex-Dolid Oct 3, 2026
0cb98f7
feat(cluster): what replay: 'accept' lets through is counted and said
Alex-Dolid Oct 3, 2026
a88629f
feat(cluster): a node isolated by its clock is named — skew on the li…
Alex-Dolid Oct 3, 2026
b5afbe5
fix(cluster): bytes as deep as a direct send carries them cross the c…
Alex-Dolid Oct 3, 2026
cc066ea
fix(ws): a connection closed while its inflate queue holds the socket…
Alex-Dolid Oct 3, 2026
92ccd52
fix(broker/amqp): a retry or a dead letter on a consumer channel that…
Alex-Dolid Oct 3, 2026
fafb577
test(broker/amqp): what the adapter reads off a channel or a connecti…
Alex-Dolid Oct 3, 2026
eb89ff6
fix(broker/nats): a feed reader's consumer is reaped 30 s after its r…
Alex-Dolid Oct 3, 2026
ab25b21
fix(sessions): a session store that fails is a 503, not a 403 — so a …
Alex-Dolid Oct 3, 2026
c2da603
fix(broker/amqp): a paused consumer stays paused across a re-open; th…
Alex-Dolid Oct 3, 2026
02b898c
fix(broker/amqp): a direct listener the server cancelled, or whose ch…
Alex-Dolid Oct 3, 2026
f8790bb
fix(broker): a sealed delivery whose key provider threw is retried, n…
Alex-Dolid Oct 3, 2026
1e01b42
fix(broker): a sealed dead letter carries its code outside the seal, …
Alex-Dolid Oct 3, 2026
eddf89e
test(scaling): the live Redis suite's stub socket negotiated wrpc.v2
Alex-Dolid Oct 3, 2026
e88b4cc
docs: the CHANGELOG and the guides say what the code does
Alex-Dolid Oct 3, 2026
1bc6271
docs(contributing): the tree's own CLI is `node bin/wrpc.js`
Alex-Dolid Oct 3, 2026
92b2a72
test(broker/kafka): the join watcher's failure paths are driven directly
Alex-Dolid Oct 3, 2026
85ce95d
test(broker/amqp): the down state is held while the test looks at it
Alex-Dolid Oct 3, 2026
9a1b14f
test(package): only a breaking section with entries must carry a migr…
Alex-Dolid Oct 3, 2026
35022e6
fix(webrtc): a closed link stays closed when the other side sees its …
Alex-Dolid Oct 3, 2026
b9f6f08
chore(release): 2.0.0
Alex-Dolid Oct 3, 2026
fb979ef
fix(types): @alexify/wrpc/query type-checks in a project without Node…
Alex-Dolid Oct 3, 2026
7abc19f
test: the suites pass on Node 22 — the loop is held where a test awai…
Alex-Dolid Oct 3, 2026
da46244
docs: present the project as wRPC — Web RPC, where it is described
Alex-Dolid Oct 3, 2026
89dde0e
docs: the home page shows every transport — 16 tiles and one matrix
Alex-Dolid Oct 3, 2026
10ce4d6
bench: wrpc over WebTransport and WebRTC, end to end
Alex-Dolid Oct 3, 2026
0d0e07b
docs(performance): across transports — WebTransport and WebRTC, measured
Alex-Dolid Oct 3, 2026
b9e0b89
docs: the way in names every transport — getting started and the refe…
Alex-Dolid Oct 3, 2026
2471fe7
docs: the transport lists name the transports 2.0 has
Alex-Dolid Oct 3, 2026
7319ff2
docs: the name in prose is wRPC
Alex-Dolid Oct 3, 2026
396ea04
docs: why wRPC — one router over every transport, compared with five …
Alex-Dolid Oct 3, 2026
315425a
docs(changelog): wRPC — Web RPC, and the transports measured
Alex-Dolid Oct 3, 2026
bf5c421
fix(wt): the datagram check never reads the deprecated datagrams.writ…
Alex-Dolid Oct 3, 2026
e99f830
fix(streams): a finished WrpcWritable lets go of its transport; serve…
Alex-Dolid Oct 3, 2026
c1fd4a4
fix(client): a connection refused by authenticate no longer resets th…
Alex-Dolid Oct 3, 2026
e03b5a2
bench: a gRPC row, and wRPC over HTTP against fastify, express and tRPC
Alex-Dolid Oct 3, 2026
c9ebaad
docs: benchmark charts before the tables, and wRPC against its neighb…
Alex-Dolid Oct 3, 2026
23feef1
perf(http): an HTTP request costs wRPC about half what it did
Alex-Dolid Oct 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
137 changes: 136 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,15 @@ on:
branches: [main]
pull_request:

# Nothing here writes to the repository: a read token is all a leaked action
# could use.
permissions:
contents: read

jobs:
lint:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
Expand Down Expand Up @@ -38,9 +44,138 @@ jobs:
node-version: ${{ matrix.node-version }}
cache: pnpm
- run: pnpm install --frozen-lockfile
- run: pnpm test:coverage
# test:coverage with a guard: a file that outlives its tests (a leaked
# listen socket, a timer nobody cleared) is cut off and FAILS here in
# minutes, where it used to hang until the job's own timeout with no
# summary. `pnpm test` and `pnpm test:coverage` stay without it — a
# leak must stay visible locally. WRPC_INTEGRATION_STRICT turns a
# suite that would SKIP for a missing devDependency (the interop
# suite's `wrpc-v1` alias) into a failure: here, everything is installed.
- run: pnpm test:ci
env:
WRPC_INTEGRATION_STRICT: 1
# The global thresholds are an average; the directories new in 2.0 are
# also held per file (scripts/coverage-floors.js). Reads the coverage
# the step above left behind — same job, same workspace.
- run: pnpm test:coverage:floors
- run: pnpm test:types

# The Redis leg of the scaling suites against a real server — the fake in
# tests/scaling/redis.test.js is what `pnpm test` runs; this is the
# contract check against ioredis + a broker. The multi-node benchmark
# (bench/cluster-nodes.js) stays a manual run: a benchmark in CI is noise.
redis:
runs-on: ubuntu-latest
timeout-minutes: 10
services:
redis:
image: redis:7.4-alpine
ports: ['6379:6379']
options: >-
--health-cmd "redis-cli ping"
--health-interval 5s
--health-timeout 3s
--health-retries 10
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm
- run: pnpm install --frozen-lockfile
- run: node --test tests/scaling/redis.integration.test.js tests/broker/redis.integration.test.js
env:
REDIS_URL: redis://127.0.0.1:6379
# The client IS installed here: a skip would be a broken environment passing.
WRPC_INTEGRATION_STRICT: 1

# The NATS leg of the broker suites against a real server WITH JetStream;
# the in-repo fake in tests/broker/fakeNats.js is what `pnpm test` runs.
# Not a `services:` container: GitHub cannot pass a command to one, and a
# nats without `-js` makes the log, queue and feed suites skip — green
# and untested. compose.yaml is the one place the flags live.
nats:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- run: docker compose up -d --wait nats
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm
- run: pnpm install --frozen-lockfile
- run: node --test tests/broker/nats.integration.test.js
env:
NATS_URL: nats://127.0.0.1:4222
WRPC_INTEGRATION_STRICT: 1
- run: docker compose down
if: always()

# The RabbitMQ leg of the broker suites against a real server; the in-repo
# fake in tests/broker/fakeAmqp.js is what `pnpm test` runs.
rabbitmq:
runs-on: ubuntu-latest
timeout-minutes: 15
services:
rabbitmq:
image: rabbitmq:4.1-alpine
ports: ['5672:5672']
options: >-
--health-cmd "rabbitmq-diagnostics -q ping"
--health-interval 10s
--health-timeout 5s
--health-retries 20
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm
- run: pnpm install --frozen-lockfile
- run: node --test tests/broker/amqp.integration.test.js
env:
AMQP_URL: amqp://127.0.0.1:5672
WRPC_INTEGRATION_STRICT: 1

# The Kafka leg of the broker suites against a real broker (KRaft), on
# whichever KafkaJS-shaped clients are installed; the in-repo fake in
# tests/broker/fakeKafka.js covers both shapes in `pnpm test`.
kafka:
runs-on: ubuntu-latest
timeout-minutes: 20
services:
kafka:
image: apache/kafka:3.9.1
ports: ['9092:9092']
env:
KAFKA_NODE_ID: 1
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://127.0.0.1:9092
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@localhost:9093
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm
- run: pnpm install --frozen-lockfile
- run: node --test tests/broker/kafka.integration.test.js
env:
KAFKA_BROKERS: 127.0.0.1:9092
WRPC_INTEGRATION_STRICT: 1

# Node 22 only: the docs build exercises VitePress, not the package runtime,
# so repeating it across the test matrix would just repeat the same work.
docs:
Expand Down
7 changes: 6 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -128,5 +128,10 @@ docs/.vitepress/cache
# Autobahn testsuite output
scripts/autobahn/reports/

# examples/chat's build.js output — regenerate with `node build.js`
# the examples' build.js output — regenerate with `node build.js`
examples/chat/public/wrpc.browser.js
examples/syncom-mesh/public/wrpc.browser.js
examples/wt/public/wrpc.browser.js

# node scripts/wt-cert.js output (short-lived WebTransport dev certificates)
certs/
2 changes: 1 addition & 1 deletion .oxfmtrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@
"printWidth": 120,
"trailingComma": "all",
"sortPackageJson": false,
"ignorePatterns": []
"ignorePatterns": ["examples/**/public/**", "examples/**/*.md"]
}
1 change: 1 addition & 0 deletions .oxlintrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
".idea",
"**/*.d.ts",
"**/*.test-d.ts",
"examples/**/public/**",
"*.log",
"npm-debug.log*",
"yarn-debug.log*",
Expand Down
Loading
Loading