{"_id":"@bytepulse/pulsewave-shared","_rev":"6-405c6a0ce1395975eddae10d139d44c8","name":"@bytepulse/pulsewave-shared","dist-tags":{"latest":"0.2.5"},"versions":{"0.2.0":{"name":"@bytepulse/pulsewave-shared","version":"0.2.0","author":{"url":"https://github.com/kaushald4","name":"Kaushal Mehta"},"license":"MIT","_id":"@bytepulse/pulsewave-shared@0.2.0","maintainers":[{"name":"kaushald4","email":"kaushalkumar304@gmail.com"}],"homepage":"https://github.com/bytepulseflow/pulsewave#readme","bugs":{"url":"https://github.com/bytepulseflow/pulsewave/issues"},"dist":{"shasum":"31b4e102304099b7bd4bac8d2599491187a6eaa0","tarball":"https://registry.npmjs.org/@bytepulse/pulsewave-shared/-/pulsewave-shared-0.2.0.tgz","fileCount":30,"integrity":"sha512-6bPCuUl9hknYzlg88M7/KTgpAkIjHgtvoYV8wocViXlFOPrPDIcq2782ldnslwAwwGt4K46UvKYAAZ00UC2IyQ==","signatures":[{"sig":"MEUCIDQx4hg/twxpY8bgHO2hDtbHNhpQJhXc+Ba8X5z4GlaDAiEApoC9yQ6Dm+A5oY2BpfoEvEYGIPjxNL8tXUkQbkZy0NY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44885},"main":"./dist/index.js","_from":"file:bytepulse-pulsewave-shared-0.2.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:watch":"jest --watch","type-check":"tsc --noEmit"},"_npmUser":{"name":"kaushald4","email":"kaushalkumar304@gmail.com"},"_resolved":"/private/var/folders/kl/sfz43qn90619crk1pc8lx2900000gn/T/c5253488c527ee9d9910d70b77d91e56/bytepulse-pulsewave-shared-0.2.0.tgz","_integrity":"sha512-6bPCuUl9hknYzlg88M7/KTgpAkIjHgtvoYV8wocViXlFOPrPDIcq2782ldnslwAwwGt4K46UvKYAAZ00UC2IyQ==","repository":{"url":"git+https://github.com/bytepulseflow/pulsewave.git","type":"git","directory":"packages/shared"},"_npmVersion":"10.9.3","description":"PulseWave Shared - Types and constants shared between client and server","directories":{},"_nodeVersion":"22.18.0","dependencies":{"tslib":"^2.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.56.0","ts-jest":"^29.1.1","typescript":"^5.3.3","@types/jest":"^29.5.11","import-local":"^3.1.0","@typescript-eslint/parser":"^6.19.0","@typescript-eslint/eslint-plugin":"^6.19.0"},"_npmOperationalInternal":{"tmp":"tmp/pulsewave-shared_0.2.0_1767560545188_0.6581879875560568","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@bytepulse/pulsewave-shared","version":"0.2.1","author":{"url":"https://github.com/kaushald4","name":"Kaushal Mehta"},"license":"MIT","_id":"@bytepulse/pulsewave-shared@0.2.1","maintainers":[{"name":"kaushald4","email":"kaushalkumar304@gmail.com"}],"homepage":"https://github.com/bytepulseflow/pulsewave#readme","bugs":{"url":"https://github.com/bytepulseflow/pulsewave/issues"},"dist":{"shasum":"35710a62b3ac7b7808d3d9cb97663a7adde24393","tarball":"https://registry.npmjs.org/@bytepulse/pulsewave-shared/-/pulsewave-shared-0.2.1.tgz","fileCount":30,"integrity":"sha512-AALcBeZd87X+OQK3NUYI0/KCHHhS/tqFK3cXlJauBLLHRyBsKLS3A7+VU19mXz0CQs7lK4l7qTdtdwjQUVA7Xg==","signatures":[{"sig":"MEQCICd1pbakWkjh9Mb0Qry/TNK38dmR2bK6ARyjmTb2Wow4AiBThishJTSZD775nUtqUKrawNYPWFiMgQ80YjcywnDhPA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44886},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"gitHead":"580d9192db0b8926ad11de5bc469b56234b72bc3","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:watch":"jest --watch","type-check":"tsc --noEmit"},"_npmUser":{"name":"kaushald4","email":"kaushalkumar304@gmail.com"},"repository":{"url":"git+https://github.com/bytepulseflow/pulsewave.git","type":"git","directory":"packages/shared"},"_npmVersion":"10.9.3","description":"PulseWave Shared - Types and constants shared between client and server","directories":{},"_nodeVersion":"22.18.0","dependencies":{"tslib":"^2.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.56.0","ts-jest":"^29.1.1","typescript":"^5.3.3","@types/jest":"^29.5.11","import-local":"^3.1.0","@typescript-eslint/parser":"^6.19.0","@typescript-eslint/eslint-plugin":"^6.19.0"},"_npmOperationalInternal":{"tmp":"tmp/pulsewave-shared_0.2.1_1767884231717_0.8031497905579812","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@bytepulse/pulsewave-shared","version":"0.2.2","author":{"url":"https://github.com/kaushald4","name":"Kaushal Mehta"},"license":"MIT","_id":"@bytepulse/pulsewave-shared@0.2.2","maintainers":[{"name":"kaushald4","email":"kaushalkumar304@gmail.com"}],"homepage":"https://github.com/bytepulseflow/pulsewave#readme","bugs":{"url":"https://github.com/bytepulseflow/pulsewave/issues"},"dist":{"shasum":"aacd98e94e99c576e857ae73a6786ecf5214c00e","tarball":"https://registry.npmjs.org/@bytepulse/pulsewave-shared/-/pulsewave-shared-0.2.2.tgz","fileCount":30,"integrity":"sha512-ork8IeM75MhJguJ7UmQZU+Ml5DYy3IZXyvQbHx/q3uvC2m18t76VzC/YE2LBgRlz3fTfMexjj1Rh6vdRrmMOrw==","signatures":[{"sig":"MEQCIHoVhpKByxvY5anKx/7M7d6lg8xHb8z+9B3xcDmQjpSnAiAS1YSLN+N58L5Kb1u/Fwb9OwW27DK3RNWRp2RsQCEaTg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44886},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"gitHead":"251217c35955383eec68008231430ecf5e797636","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:watch":"jest --watch","type-check":"tsc --noEmit"},"_npmUser":{"name":"kaushald4","email":"kaushalkumar304@gmail.com"},"repository":{"url":"git+https://github.com/bytepulseflow/pulsewave.git","type":"git","directory":"packages/shared"},"_npmVersion":"10.9.3","description":"PulseWave Shared - Types and constants shared between client and server","directories":{},"_nodeVersion":"22.18.0","dependencies":{"tslib":"^2.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.56.0","ts-jest":"^29.1.1","typescript":"^5.3.3","@types/jest":"^29.5.11","import-local":"^3.1.0","@typescript-eslint/parser":"^6.19.0","@typescript-eslint/eslint-plugin":"^6.19.0"},"_npmOperationalInternal":{"tmp":"tmp/pulsewave-shared_0.2.2_1767885526459_0.9681346908660731","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@bytepulse/pulsewave-shared","version":"0.2.3","author":{"url":"https://github.com/kaushald4","name":"Kaushal Mehta"},"license":"MIT","_id":"@bytepulse/pulsewave-shared@0.2.3","maintainers":[{"name":"kaushald4","email":"kaushalkumar304@gmail.com"}],"homepage":"https://github.com/bytepulseflow/pulsewave#readme","bugs":{"url":"https://github.com/bytepulseflow/pulsewave/issues"},"dist":{"shasum":"cad9adb080256caa464a31823f87b7aece676e22","tarball":"https://registry.npmjs.org/@bytepulse/pulsewave-shared/-/pulsewave-shared-0.2.3.tgz","fileCount":34,"integrity":"sha512-HvdwpKCsA7AoQNXxiNIILmYB37lzlOSQz7FDoy/NQLfygxHgIMyyw0KC3zPCNim5xqGpy6V9G1+URYAIc61XTg==","signatures":[{"sig":"MEUCIQCpK+RcWciwDrhJvZorVnkUeYtGnABBwkXcw9tfJV7tmQIgfrNVcNkFff7tu9aYfesaSKl/EOlRSoz9903TX59uVDA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":52833},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"gitHead":"f7d8182f1e9860b6136908145b41a2db767bdc08","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:watch":"jest --watch","type-check":"tsc --noEmit"},"_npmUser":{"name":"kaushald4","email":"kaushalkumar304@gmail.com"},"repository":{"url":"git+https://github.com/bytepulseflow/pulsewave.git","type":"git","directory":"packages/shared"},"_npmVersion":"10.9.3","description":"PulseWave Shared - Types and constants shared between client and server","directories":{},"_nodeVersion":"22.18.0","dependencies":{"tslib":"^2.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.56.0","ts-jest":"^29.1.1","typescript":"^5.3.3","@types/jest":"^29.5.11","import-local":"^3.1.0","@typescript-eslint/parser":"^6.19.0","@typescript-eslint/eslint-plugin":"^6.19.0"},"_npmOperationalInternal":{"tmp":"tmp/pulsewave-shared_0.2.3_1768032903391_0.4211770150082079","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@bytepulse/pulsewave-shared","version":"0.2.4","author":{"url":"https://github.com/kaushald4","name":"Kaushal Mehta"},"license":"MIT","_id":"@bytepulse/pulsewave-shared@0.2.4","maintainers":[{"name":"kaushald4","email":"kaushalkumar304@gmail.com"}],"homepage":"https://github.com/bytepulseflow/pulsewave#readme","bugs":{"url":"https://github.com/bytepulseflow/pulsewave/issues"},"dist":{"shasum":"224a5c675550ad2ff7365e8d70565e3530f1166d","tarball":"https://registry.npmjs.org/@bytepulse/pulsewave-shared/-/pulsewave-shared-0.2.4.tgz","fileCount":2,"integrity":"sha512-qt6FPVJbThOeeTE3fOxqTgiCthB2OsW+pR/HRCu+2cVfeQ0A/+/TLW4cshokx1u8bANibr7SdiqPSMI8xH418A==","signatures":[{"sig":"MEYCIQDqiPTTBTFJ7s5YPR1mLM0FIC8sSsu0/ZV/CETQBi8kOwIhAK/5pMUpoCbN89AA/xz6kafG5420Q28vlGXSe8HLVAeQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10193},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"gitHead":"4803fc4389eb5fd325f3aa068ac0311c63fa6d58","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:watch":"jest --watch","type-check":"tsc --noEmit"},"_npmUser":{"name":"kaushald4","email":"kaushalkumar304@gmail.com"},"repository":{"url":"git+https://github.com/bytepulseflow/pulsewave.git","type":"git","directory":"packages/shared"},"_npmVersion":"10.9.3","description":"PulseWave Shared - Types and constants shared between client and server","directories":{},"_nodeVersion":"22.18.0","dependencies":{"tslib":"^2.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.56.0","ts-jest":"^29.1.1","typescript":"^5.3.3","@types/jest":"^29.5.11","import-local":"^3.1.0","@typescript-eslint/parser":"^6.19.0","@typescript-eslint/eslint-plugin":"^6.19.0"},"_npmOperationalInternal":{"tmp":"tmp/pulsewave-shared_0.2.4_1768149841561_0.01015262109529158","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"@bytepulse/pulsewave-shared","version":"0.2.5","description":"PulseWave Shared - Types and constants shared between client and server","main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/bytepulseflow/pulsewave.git","directory":"packages/shared"},"homepage":"https://github.com/bytepulseflow/pulsewave#readme","bugs":{"url":"https://github.com/bytepulseflow/pulsewave/issues"},"license":"MIT","scripts":{"build":"tsc","dev":"tsc --watch","clean":"rm -rf dist","lint":"eslint src --ext .ts","type-check":"tsc --noEmit","test":"jest","test:watch":"jest --watch"},"dependencies":{"tslib":"^2.6.2"},"devDependencies":{"@types/jest":"^29.5.11","@typescript-eslint/eslint-plugin":"^6.19.0","@typescript-eslint/parser":"^6.19.0","eslint":"^8.56.0","import-local":"^3.1.0","jest":"^29.7.0","ts-jest":"^29.1.1","typescript":"^5.3.3"},"author":{"name":"Kaushal Mehta","url":"https://github.com/kaushald4"},"_id":"@bytepulse/pulsewave-shared@0.2.5","gitHead":"4803fc4389eb5fd325f3aa068ac0311c63fa6d58","_nodeVersion":"22.18.0","_npmVersion":"10.9.3","dist":{"integrity":"sha512-+H/HS+pJn6ES7P/NPthGpD8IWW+l20aG1wqZEtGzhhjYDFrCvdekjk6nxHtkuGyXWYO4KWeo5kijUY2VnU9vTw==","shasum":"2f1741d1c6dcede67efa216f6c90605dac43b254","tarball":"https://registry.npmjs.org/@bytepulse/pulsewave-shared/-/pulsewave-shared-0.2.5.tgz","fileCount":34,"unpackedSize":52833,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQD5KM83cnCGZQ7JyAlPGqiXmBEFBHEGJ4CHEVOC8gXblAIgVyD1LeziyZyqO8NCIdePxB/Y4XLDTgIX/5Ac4e4W0H0="}]},"_npmUser":{"name":"kaushald4","email":"kaushalkumar304@gmail.com"},"directories":{},"maintainers":[{"name":"kaushald4","email":"kaushalkumar304@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pulsewave-shared_0.2.5_1768149964963_0.6012284937290773"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-04T21:02:25.119Z","modified":"2026-01-11T16:46:05.314Z","0.2.0":"2026-01-04T21:02:25.346Z","0.2.1":"2026-01-08T14:57:11.878Z","0.2.2":"2026-01-08T15:18:46.594Z","0.2.3":"2026-01-10T08:15:03.544Z","0.2.4":"2026-01-11T16:44:01.713Z","0.2.5":"2026-01-11T16:46:05.120Z"},"bugs":{"url":"https://github.com/bytepulseflow/pulsewave/issues"},"author":{"name":"Kaushal Mehta","url":"https://github.com/kaushald4"},"license":"MIT","homepage":"https://github.com/bytepulseflow/pulsewave#readme","repository":{"type":"git","url":"git+https://github.com/bytepulseflow/pulsewave.git","directory":"packages/shared"},"description":"PulseWave Shared - Types and constants shared between client and server","maintainers":[{"name":"kaushald4","email":"kaushalkumar304@gmail.com"}],"readme":"# @bytepulse/pulsewave-shared\n\nShared types, constants, and utilities for PulseWave client and server packages.\n\n## Installation\n\n```bash\nnpm install @bytepulse/pulsewave-shared\n```\n\n## Overview\n\nThis package contains:\n\n- **Types**: TypeScript interfaces and types used across client and server\n- **Constants**: Shared constants for events, errors, and configuration\n- **Utilities**: Common utility functions\n\n## Types\n\n### Room Types\n\n```typescript\n// Room information\ninterface Room {\n  sid: string;\n  name: string;\n  numParticipants: number;\n  maxParticipants: number;\n  creationTime: number;\n  metadata: Record<string, unknown>;\n}\n\n// Participant information\ninterface Participant {\n  identity: string;\n  name: string;\n  sid: string;\n  state: 'joined' | 'connected' | 'disconnected';\n  tracks: TrackPublication[];\n  metadata: Record<string, unknown>;\n}\n\n// Local participant extends Participant\ninterface LocalParticipant extends Participant {\n  isLocal: true;\n}\n\n// Remote participant extends Participant\ninterface RemoteParticipant extends Participant {\n  isLocal: false;\n}\n```\n\n### Track Types\n\n```typescript\n// Track kind\ntype TrackKind = 'video' | 'audio' | 'data';\n\n// Track source\ntype TrackSource = 'camera' | 'microphone' | 'screen' | 'screen_audio' | 'unknown';\n\n// Track publication\ninterface TrackPublication {\n  sid: string;\n  kind: TrackKind;\n  source: TrackSource;\n  mimeType: string;\n  simulcast: boolean;\n  muted: boolean;\n  width?: number;\n  height?: number;\n}\n\n// Track\ninterface Track {\n  sid: string;\n  kind: TrackKind;\n  source: TrackSource;\n  muted: boolean;\n}\n\n// Local track\ninterface LocalTrack extends Track {\n  mediaStreamTrack: MediaStreamTrack;\n}\n\n// Remote track\ninterface RemoteTrack extends Track {\n  stream: MediaStream;\n}\n```\n\n### Signal Types\n\n```typescript\n// Signaling message types\ntype SignalingMessageType =\n  | 'join'\n  | 'leave'\n  | 'joined'\n  | 'participant-joined'\n  | 'participant-left'\n  | 'track-published'\n  | 'track-unpublished'\n  | 'track-subscribed'\n  | 'track-unsubscribed'\n  | 'track-muted'\n  | 'track-unmuted'\n  | 'create-transport'\n  | 'connect-transport'\n  | 'publish'\n  | 'unpublish'\n  | 'subscribe'\n  | 'unsubscribe'\n  | 'resume-consumer'\n  | 'publish-data'\n  | 'data'\n  | 'error';\n\n// Base signaling message\ninterface SignalingMessage {\n  type: SignalingMessageType;\n}\n\n// Join message\ninterface JoinMessage extends SignalingMessage {\n  type: 'join';\n  room: string;\n}\n\n// Leave message\ninterface LeaveMessage extends SignalingMessage {\n  type: 'leave';\n}\n\n// Joined message\ninterface JoinedMessage extends SignalingMessage {\n  type: 'joined';\n  room: Room;\n  participant: Participant;\n  otherParticipants: Participant[];\n}\n\n// Participant joined message\ninterface ParticipantJoinedMessage extends SignalingMessage {\n  type: 'participant-joined';\n  participant: Participant;\n}\n\n// Participant left message\ninterface ParticipantLeftMessage extends SignalingMessage {\n  type: 'participant-left';\n  participant: Participant;\n}\n\n// Track published message\ninterface TrackPublishedMessage extends SignalingMessage {\n  type: 'track-published';\n  track: TrackPublication;\n}\n\n// Track unpublished message\ninterface TrackUnpublishedMessage extends SignalingMessage {\n  type: 'track-unpublished';\n  producerId: string;\n}\n\n// Track subscribed message\ninterface TrackSubscribedMessage extends SignalingMessage {\n  type: 'track-subscribed';\n  trackSid: string;\n  consumerId: string;\n  producerId: string;\n  rtpParameters: RtpParameters;\n}\n\n// Track unsubscribed message\ninterface TrackUnsubscribedMessage extends SignalingMessage {\n  type: 'track-unsubscribed';\n  consumerId: string;\n}\n\n// Track muted message\ninterface TrackMutedMessage extends SignalingMessage {\n  type: 'track-muted';\n  producerId: string;\n}\n\n// Track unmuted message\ninterface TrackUnmutedMessage extends SignalingMessage {\n  type: 'track-unmuted';\n  producerId: string;\n}\n\n// Create transport message\ninterface CreateTransportMessage extends SignalingMessage {\n  type: 'create-transport';\n  direction: 'send' | 'recv';\n}\n\n// Connect transport message\ninterface ConnectTransportMessage extends SignalingMessage {\n  type: 'connect-transport';\n  transportId: string;\n  dtlsParameters: DtlsParameters;\n}\n\n// Publish message\ninterface PublishMessage extends SignalingMessage {\n  type: 'publish';\n  kind: TrackKind;\n  source: TrackSource;\n  rtpParameters: RtpParameters;\n}\n\n// Unpublish message\ninterface UnpublishMessage extends SignalingMessage {\n  type: 'unpublish';\n  producerId: string;\n}\n\n// Subscribe message\ninterface SubscribeMessage extends SignalingMessage {\n  type: 'subscribe';\n  producerId: string;\n  rtpCapabilities: RtpCapabilities;\n}\n\n// Unsubscribe message\ninterface UnsubscribeMessage extends SignalingMessage {\n  type: 'unsubscribe';\n  consumerId: string;\n}\n\n// Resume consumer message\ninterface ResumeConsumerMessage extends SignalingMessage {\n  type: 'resume-consumer';\n  consumerId: string;\n}\n\n// Publish data message\ninterface PublishDataMessage extends SignalingMessage {\n  type: 'publish-data';\n  kind: 'reliable' | 'lossy';\n  data: unknown;\n}\n\n// Data message\ninterface DataMessage extends SignalingMessage {\n  type: 'data';\n  participantIdentity: string;\n  kind: 'reliable' | 'lossy';\n  data: unknown;\n}\n\n// Error message\ninterface ErrorMessage extends SignalingMessage {\n  type: 'error';\n  code: number;\n  message: string;\n}\n```\n\n### Token Types\n\n```typescript\n// JWT grant\ninterface VideoGrant {\n  room: string;\n  roomJoin: boolean;\n  canPublish: boolean;\n  canSubscribe: boolean;\n  canPublishData: boolean;\n}\n\n// JWT payload\ninterface TokenPayload {\n  identity: string;\n  name: string;\n  metadata: Record<string, unknown>;\n  video: VideoGrant;\n  nbf: number;\n  exp: number;\n  iss: string;\n  sub: string;\n  jti: string;\n  iat: number;\n}\n```\n\n## Constants\n\n### Events\n\n```typescript\n// Connection events\nconst CONNECTION_EVENTS = {\n  CONNECTING: 'connecting',\n  CONNECTED: 'connected',\n  DISCONNECTED: 'disconnected',\n  RECONNECTING: 'reconnecting',\n} as const;\n\n// Participant events\nconst PARTICIPANT_EVENTS = {\n  JOINED: 'participant_joined',\n  LEFT: 'participant_left',\n  TRACK_PUBLISHED: 'track_published',\n  TRACK_UNPUBLISHED: 'track_unpublished',\n  TRACK_SUBSCRIBED: 'track_subscribed',\n  TRACK_UNSUBSCRIBED: 'track_unsubscribed',\n} as const;\n\n// Track events\nconst TRACK_EVENTS = {\n  MUTED: 'track_muted',\n  UNMUTED: 'track_unmuted',\n  STOPPED: 'track_stopped',\n} as const;\n\n// Data events\nconst DATA_EVENTS = {\n  MESSAGE: 'data_message',\n} as const;\n```\n\n### Errors\n\n```typescript\n// Error codes\nconst ERROR_CODES = {\n  // General errors (100-199)\n  UNKNOWN_ERROR: 100,\n  INVALID_REQUEST: 101,\n  UNAUTHORIZED: 102,\n  FORBIDDEN: 103,\n  NOT_FOUND: 104,\n\n  // Room errors (200-299)\n  ROOM_NOT_FOUND: 200,\n  ROOM_FULL: 201,\n  ROOM_CLOSED: 202,\n\n  // Participant errors (300-399)\n  PARTICIPANT_NOT_FOUND: 300,\n  PARTICIPANT_ALREADY_JOINED: 301,\n\n  // Track errors (400-499)\n  TRACK_NOT_FOUND: 400,\n  TRACK_ALREADY_PUBLISHED: 401,\n  TRACK_NOT_PUBLISHED: 402,\n  TRACK_ALREADY_SUBSCRIBED: 403,\n  TRACK_NOT_SUBSCRIBED: 404,\n\n  // Transport errors (500-599)\n  TRANSPORT_NOT_FOUND: 500,\n  TRANSPORT_ALREADY_CONNECTED: 501,\n  TRANSPORT_NOT_CONNECTED: 502,\n} as const;\n\n// Error messages\nconst ERROR_MESSAGES: Record<number, string> = {\n  [ERROR_CODES.UNKNOWN_ERROR]: 'Unknown error',\n  [ERROR_CODES.INVALID_REQUEST]: 'Invalid request',\n  [ERROR_CODES.UNAUTHORIZED]: 'Unauthorized',\n  [ERROR_CODES.FORBIDDEN]: 'Forbidden',\n  [ERROR_CODES.NOT_FOUND]: 'Not found',\n  [ERROR_CODES.ROOM_NOT_FOUND]: 'Room not found',\n  [ERROR_CODES.ROOM_FULL]: 'Room is full',\n  [ERROR_CODES.ROOM_CLOSED]: 'Room is closed',\n  [ERROR_CODES.PARTICIPANT_NOT_FOUND]: 'Participant not found',\n  [ERROR_CODES.PARTICIPANT_ALREADY_JOINED]: 'Participant already joined',\n  [ERROR_CODES.TRACK_NOT_FOUND]: 'Track not found',\n  [ERROR_CODES.TRACK_ALREADY_PUBLISHED]: 'Track already published',\n  [ERROR_CODES.TRACK_NOT_PUBLISHED]: 'Track not published',\n  [ERROR_CODES.TRACK_ALREADY_SUBSCRIBED]: 'Track already subscribed',\n  [ERROR_CODES.TRACK_NOT_SUBSCRIBED]: 'Track not subscribed',\n  [ERROR_CODES.TRANSPORT_NOT_FOUND]: 'Transport not found',\n  [ERROR_CODES.TRANSPORT_ALREADY_CONNECTED]: 'Transport already connected',\n  [ERROR_CODES.TRANSPORT_NOT_CONNECTED]: 'Transport not connected',\n};\n```\n\n## Usage\n\n```typescript\nimport {\n  Room,\n  Participant,\n  TrackPublication,\n  SignalingMessage,\n  ERROR_CODES,\n  ERROR_MESSAGES,\n} from '@bytepulse/pulsewave-shared';\n\n// Use types\nconst room: Room = {\n  sid: 'RM_123',\n  name: 'my-room',\n  numParticipants: 3,\n  maxParticipants: 10,\n  creationTime: Date.now(),\n  metadata: {},\n};\n\n// Use constants\nconst errorMessage = ERROR_MESSAGES[ERROR_CODES.ROOM_NOT_FOUND];\n// \"Room not found\"\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}