{"version":3,"sources":["../../../../src/adapters/mcp/serve/in_memory_store.ts"],"names":["InMemoryEventStore","events","Map","generateEventId","streamId","Date","now","Math","random","toString","substring","getStreamIdFromEventId","eventId","parts","split","length","storeEvent","message","set","replayEventsAfter","lastEventId","send","has","foundLastEvent","sortedEvents","entries","sort","a","b","localeCompare","eventStreamId"],"mappings":";;;;AAeO,MAAMA,kBAAAA,CAAAA;EAfb;;;AAgBUC,EAAAA,MAAAA,uBAAaC,GAAAA,EAAAA;;;;AAKbC,EAAAA,eAAAA,CAAgBC,QAAAA,EAA0B;AAChD,IAAA,OAAO,GAAGA,QAAAA,CAAAA,CAAAA,EAAYC,IAAAA,CAAKC,GAAAA,EAAG,CAAA,CAAA,EAAMC,IAAAA,CAAKC,MAAAA,EAAM,CAAGC,SAAS,EAAA,CAAA,CAAIC,SAAAA,CAAU,CAAA,EAAG,EAAA,CAAA,CAAA,CAAA;AAC9E,EAAA;;;;AAKQC,EAAAA,sBAAAA,CAAuBC,OAAAA,EAAyB;AACtD,IAAA,MAAMC,KAAAA,GAAQD,OAAAA,CAAQE,KAAAA,CAAM,GAAA,CAAA;AAC5B,IAAA,OAAOD,KAAAA,CAAME,MAAAA,GAAS,CAAA,GAAIF,KAAAA,CAAM,CAAA,CAAA,GAAK,EAAA;AACvC,EAAA;;;;;EAMA,MAAMG,UAAAA,CAAWZ,UAAkBa,OAAAA,EAA0C;AAC3E,IAAA,MAAML,OAAAA,GAAU,IAAA,CAAKT,eAAAA,CAAgBC,QAAAA,CAAAA;AACrC,IAAA,IAAA,CAAKH,MAAAA,CAAOiB,IAAIN,OAAAA,EAAS;AAAER,MAAAA,QAAAA;AAAUa,MAAAA;KAAQ,CAAA;AAC7C,IAAA,OAAOL,OAAAA;AACT,EAAA;;;;;AAMA,EAAA,MAAMO,iBAAAA,CACJC,WAAAA,EACA,EAAEC,IAAAA,EAAI,EACW;AACjB,IAAA,IAAI,CAACD,WAAAA,IAAe,CAAC,KAAKnB,MAAAA,CAAOqB,GAAAA,CAAIF,WAAAA,CAAAA,EAAc;AACjD,MAAA,OAAO,EAAA;AACT,IAAA;AAGA,IAAA,MAAMhB,QAAAA,GAAW,IAAA,CAAKO,sBAAAA,CAAuBS,WAAAA,CAAAA;AAC7C,IAAA,IAAI,CAAChB,QAAAA,EAAU;AACb,MAAA,OAAO,EAAA;AACT,IAAA;AAEA,IAAA,IAAImB,cAAAA,GAAiB,KAAA;AAGrB,IAAA,MAAMC,YAAAA,GAAe;AAAI,MAAA,GAAA,IAAA,CAAKvB,OAAOwB,OAAAA;MAAWC,IAAAA,CAAK,CAACC,CAAAA,EAAGC,CAAAA,KAAMD,CAAAA,CAAE,CAAA,EAAGE,aAAAA,CAAcD,CAAAA,CAAE,CAAA,CAAE,CAAA,CAAA;AAEtF,IAAA,KAAA,MAAW,CAAChB,SAAS,EAAER,QAAAA,EAAU0B,eAAeb,OAAAA,EAAS,KAAKO,YAAAA,EAAc;AAE1E,MAAA,IAAIM,kBAAkB1B,QAAAA,EAAU;AAC9B,QAAA;AACF,MAAA;AAGA,MAAA,IAAIQ,YAAYQ,WAAAA,EAAa;AAC3BG,QAAAA,cAAAA,GAAiB,IAAA;AACjB,QAAA;AACF,MAAA;AAEA,MAAA,IAAIA,cAAAA,EAAgB;AAClB,QAAA,MAAMF,IAAAA,CAAKT,SAASK,OAAAA,CAAAA;AACtB,MAAA;AACF,IAAA;AACA,IAAA,OAAOb,QAAAA;AACT,EAAA;AACF","file":"in_memory_store.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// Taken from: https://github.com/modelcontextprotocol/typescript-sdk/blob/main/src/examples/shared/inMemoryEventStore.ts\n\nimport { EventStore } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport { JSONRPCMessage } from \"@modelcontextprotocol/sdk/types.js\";\n\n/**\n * Simple in-memory implementation of the EventStore interface for resumability\n * This is primarily intended for examples and testing, not for production use\n * where a persistent storage solution would be more appropriate.\n */\nexport class InMemoryEventStore implements EventStore {\n  private events = new Map<string, { streamId: string; message: JSONRPCMessage }>();\n\n  /**\n   * Generates a unique event ID for a given stream ID\n   */\n  private generateEventId(streamId: string): string {\n    return `${streamId}_${Date.now()}_${Math.random().toString(36).substring(2, 10)}`;\n  }\n\n  /**\n   * Extracts the stream ID from an event ID\n   */\n  private getStreamIdFromEventId(eventId: string): string {\n    const parts = eventId.split(\"_\");\n    return parts.length > 0 ? parts[0] : \"\";\n  }\n\n  /**\n   * Stores an event with a generated event ID\n   * Implements EventStore.storeEvent\n   */\n  async storeEvent(streamId: string, message: JSONRPCMessage): Promise<string> {\n    const eventId = this.generateEventId(streamId);\n    this.events.set(eventId, { streamId, message });\n    return eventId;\n  }\n\n  /**\n   * Replays events that occurred after a specific event ID\n   * Implements EventStore.replayEventsAfter\n   */\n  async replayEventsAfter(\n    lastEventId: string,\n    { send }: { send: (eventId: string, message: JSONRPCMessage) => Promise<void> },\n  ): Promise<string> {\n    if (!lastEventId || !this.events.has(lastEventId)) {\n      return \"\";\n    }\n\n    // Extract the stream ID from the event ID\n    const streamId = this.getStreamIdFromEventId(lastEventId);\n    if (!streamId) {\n      return \"\";\n    }\n\n    let foundLastEvent = false;\n\n    // Sort events by eventId for chronological ordering\n    const sortedEvents = [...this.events.entries()].sort((a, b) => a[0].localeCompare(b[0]));\n\n    for (const [eventId, { streamId: eventStreamId, message }] of sortedEvents) {\n      // Only include events from the same stream\n      if (eventStreamId !== streamId) {\n        continue;\n      }\n\n      // Start sending events after we find the lastEventId\n      if (eventId === lastEventId) {\n        foundLastEvent = true;\n        continue;\n      }\n\n      if (foundLastEvent) {\n        await send(eventId, message);\n      }\n    }\n    return streamId;\n  }\n}\n"]}