feat: M5 Prekey Server + M7 Wire Format
M5: Shade Prekey Server (Hono) - REST API: register, fetch bundle, replenish, count, delete - MemoryPrekeyStore for testing/embedded use - Standalone Docker deployment (Dockerfile + standalone.ts) - One-time prekey consumption on bundle fetch M7: Compact binary wire format - Version-tagged envelopes (PreKeyMessage, RatchetMessage) - Length-prefixed byte arrays, big-endian integers - Significantly smaller than JSON (no base64 bloat) - Roundtrip encode/decode for all message types 100 tests, 0 failures across M1-M5+M7. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
48
packages/shade-server/src/store.ts
Normal file
48
packages/shade-server/src/store.ts
Normal file
@@ -0,0 +1,48 @@
|
||||
/**
|
||||
* PrekeyStore — server-side storage interface for prekey bundles.
|
||||
*
|
||||
* The prekey server stores public keys only (never private keys).
|
||||
*/
|
||||
export interface PrekeyStore {
|
||||
/** Save or update an identity for an address */
|
||||
saveIdentity(
|
||||
address: string,
|
||||
identitySigningKey: Uint8Array,
|
||||
identityDHKey: Uint8Array,
|
||||
): Promise<void>;
|
||||
|
||||
/** Get an identity by address */
|
||||
getIdentity(
|
||||
address: string,
|
||||
): Promise<{ identitySigningKey: Uint8Array; identityDHKey: Uint8Array } | null>;
|
||||
|
||||
/** Save or update a signed prekey for an address */
|
||||
saveSignedPreKey(
|
||||
address: string,
|
||||
keyId: number,
|
||||
publicKey: Uint8Array,
|
||||
signature: Uint8Array,
|
||||
): Promise<void>;
|
||||
|
||||
/** Get the current signed prekey for an address */
|
||||
getSignedPreKey(
|
||||
address: string,
|
||||
): Promise<{ keyId: number; publicKey: Uint8Array; signature: Uint8Array } | null>;
|
||||
|
||||
/** Add one-time prekeys for an address */
|
||||
saveOneTimePreKeys(
|
||||
address: string,
|
||||
keys: Array<{ keyId: number; publicKey: Uint8Array }>,
|
||||
): Promise<void>;
|
||||
|
||||
/** Consume (pop) one one-time prekey for an address. Returns null if none left. */
|
||||
consumeOneTimePreKey(
|
||||
address: string,
|
||||
): Promise<{ keyId: number; publicKey: Uint8Array } | null>;
|
||||
|
||||
/** Get remaining one-time prekey count for an address */
|
||||
getOneTimePreKeyCount(address: string): Promise<number>;
|
||||
|
||||
/** Delete all keys for an address */
|
||||
deleteAll(address: string): Promise<void>;
|
||||
}
|
||||
Reference in New Issue
Block a user