diff --git a/src/lib/session.ts b/src/lib/session.ts new file mode 100644 index 0000000..6c5e18e --- /dev/null +++ b/src/lib/session.ts @@ -0,0 +1,45 @@ +import { EventEmitter } from 'stream'; +/* todo implement history saving and better artifact typing and handling */ +class SessionManager { + private static sessions = new Map(); + readonly id: string; + private artifacts = new Map(); + private emitter = new EventEmitter(); + + constructor() { + this.id = crypto.randomUUID(); + } + + static getSession(id: string): SessionManager | undefined { + return this.sessions.get(id); + } + + static getAllSessions(): SessionManager[] { + return Array.from(this.sessions.values()); + } + + emit(event: string, data: any) { + this.emitter.emit(event, data); + } + + emitArtifact(artifact: Artifact) { + this.artifacts.set(artifact.id, artifact); + this.emitter.emit('addArtifact', artifact); + } + + appendToArtifact(artifactId: string, data: any) { + const artifact = this.artifacts.get(artifactId); + if (artifact) { + if (typeof artifact.data === 'string') { + artifact.data += data; + } else if (Array.isArray(artifact.data)) { + artifact.data.push(data); + } else if (typeof artifact.data === 'object') { + Object.assign(artifact.data, data); + } + this.emitter.emit('updateArtifact', artifact); + } + } +} + +export default SessionManager; diff --git a/src/lib/types.ts b/src/lib/types.ts index 3dcb0d6..a96c7ca 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -7,3 +7,9 @@ type Chunk = { content: string; metadata: Record; }; + +type Artifact = { + id: string; + type: string; + data: any; +};