4.1 KiB
4.1 KiB
Tasks: enterprise-network-protocol
Change ID: enterprise-network-protocol
Package: @suaveplan/network-protocol
Target path: universal/network/network-protocol
Prerequisite packages on Verdaccio: @suaveplan/error, @suaveplan/types, @suaveplan/events, @suaveplan/logger, @suaveplan/serialize, @suaveplan/crypto-utils
1. Scaffold
- Create
universal/network/network-protocol/withsrc/,tests/, and all feature subdirectories. - Write
package.jsonat version0.1.0:"sideEffects": false, exports map, deps perproposal.md. - Write
tsconfig.json,vitest.config.ts, scripts.
2. Types and error codes
- Define all public types in
src/types/common.ts:ProtocolDefinition,FramingStrategy,MessageCodec,HandshakeDefinition,ProtocolMessage,ProtocolOffer,ProtocolNegotiationResult,SessionState,SessionEvent,SessionOptions. - Write
src/types/common.md(≥200 words, simple + advanced examples). - Define error codes in
src/error-codes.ts. - Write Zod schemas in
src/types/schemas.ts+src/types/schemas.md.
3. Framing implementations (src/framing/)
3a. Length-prefix framing
- Implement
encodeLengthPrefix(data, opts)— prepend 2 or 4-byte length header (big-endian or little-endian) using@suaveplan/crypto-utilsi2osp. - Implement
decodeLengthPrefix(buffer, opts)— parse header, extract payload bytes. - Write
length-prefix.test.ts+length-prefix.md.
3b. Delimiter framing
- Implement
encodeDelimiter(data, delimiter)— append delimiter to message bytes. - Implement
decodeDelimiter(buffer, delimiter)— split on delimiter bytes. - Write
delimiter.test.ts+delimiter.md.
3c. Fixed-length framing
- Implement
encodeFixed(data, size)— pad or throw ifdata.length !== size. - Implement
decodeFixed(buffer, size)— slicesizebytes. - Write
fixed.test.ts+fixed.md.
4. Codec registry (src/codecs/)
- Implement
createCodecRegistry()— storesMap<string, MessageCodec<unknown>>. - Implement
register(codec)/get(type)/encode(message)/decode(type, data). encodethrowsNetworkProtocolError(PROTO_CODEC_NOT_FOUND)if codec missing.- Write
codec-registry.test.ts+codec-registry.md.
5. Protocol session (src/core/session/)
- Implement
ProtocolSessionclass:- Stores
framing,codecsfrom parent protocol. encode(message): checkmaxMessageSize; look up codec; apply framing.decode(data): strip framing; look up codec by message type header.handshake(signal?): calldefinition.handshake.clientHello(), await response, callverify().- Emit lifecycle events via event bus.
- Stores
- Write
session.test.ts(≤500 lines): encode/decode round-trip, handshake, too-large message throws. - Write
session.md(≥200 words).
6. Protocol factory (src/core/protocol/)
- Implement
defineProtocol(definition):- Validates definition with Zod.
- Returns
Protocolobject.
- Implement
protocol.createSession(options?)— createsProtocolSession, returns it. - Implement
protocol.negotiate(offered, signal?):- Compute version intersection; take highest common version.
- Compute capability intersection.
- Return
ProtocolNegotiationResult.
- Write
protocol.test.ts+protocol.md(≥200 words).
7. Property-based tests (tests/property.test.ts)
- Encode/decode round-trip: for arbitrary
ProtocolMessagewith registered codec,decode(encode(m))deep-equalsm. - Framing round-trip:
decode(encode(payload))equals payload for all three strategies. - Negotiation symmetry:
negotiate(A, B)produces same version asnegotiate(B, A).
8. Docs and verify
- All per-file
.mdfiles per layout inproposal.md. universal/network/network-protocol/README.md.bunx turbo lint typecheck test test:coverage --filter=@suaveplan/network-protocol— all green, 100%.bun scripts/publish.ts --package @suaveplan/network-protocol.- Update
CLAUDE.md. Archive change folder.