{
  "version": 3,
  "sources": ["../src/IPC.ts"],
  "sourcesContent": ["import { debugAndPrintError } from './Debug.ts';\nimport { type Presence } from './presence/Presence.ts';\nimport { IpcProtocol } from './Protocol.ts';\nimport { generateId, REMOTE_ROOM_SHORT_TIMEOUT } from './utils/Utils.ts';\n\nexport async function requestFromIPC<T>(\n  presence: Presence,\n  publishToChannel: string,\n  method: string | undefined,\n  args: any[],\n  rejectionTimeout: number = REMOTE_ROOM_SHORT_TIMEOUT,\n): Promise<T> {\n  return new Promise<T>(async (resolve, reject) => {\n    let unsubscribeTimeout: NodeJS.Timeout;\n\n    const requestId = generateId();\n    const channel = `ipc:${requestId}`;\n\n    const unsubscribe = () => {\n      presence.unsubscribe(channel);\n      clearTimeout(unsubscribeTimeout);\n    };\n\n    await presence.subscribe(channel, (message: [IpcProtocol, any]) => {\n      const [code, data] = message;\n      if (code === IpcProtocol.SUCCESS) {\n        resolve(data);\n\n      } else if (code === IpcProtocol.ERROR) {\n        let error: any = data;\n\n        // parse error message + code\n        try { error = JSON.parse(data) } catch (e) {}\n\n        // turn string message into Error instance\n        if (typeof(error) === \"string\") {\n          error = new Error(error);\n        }\n\n        reject(error);\n      }\n      unsubscribe();\n    });\n\n    presence.publish(publishToChannel, [method, requestId, args]);\n\n    unsubscribeTimeout = setTimeout(() => {\n      unsubscribe();\n      reject(new Error(\"ipc_timeout\"));\n    }, rejectionTimeout);\n  });\n}\n\nexport async function subscribeIPC(\n  presence: Presence,\n  channel: string,\n  replyCallback: (method: string, args: any[]) => any,\n) {\n  await presence.subscribe(channel, (message) => {\n    const [method, requestId, args] = message;\n\n    const reply = (code, data) => {\n      presence.publish(`ipc:${requestId}`, [code, data]);\n    };\n\n    // reply with method result\n    let response: any;\n    try {\n      response = replyCallback(method, args);\n\n    } catch (e: any) {\n      debugAndPrintError(e);\n      const error = (typeof(e.code) !== \"undefined\")\n        ? { code: e.code, message: e.message }\n        : e.message;\n      return reply(IpcProtocol.ERROR, JSON.stringify(error));\n    }\n\n    if (!(response instanceof Promise)) {\n      return reply(IpcProtocol.SUCCESS, response);\n    }\n\n    response.\n      then((result) => reply(IpcProtocol.SUCCESS, result)).\n      catch((e) => {\n        // user might have called `reject()` without arguments.\n        const err = e && e.message || e;\n        reply(IpcProtocol.ERROR, err);\n      });\n  });\n}\n\n/**\n * Wait for a room creation notification via presence publish/subscribe\n */\nexport function subscribeWithTimeout(\n  presence: Presence,\n  channel: string,\n  timeout: number,\n): Promise<string> {\n  return new Promise((resolve, reject) => {\n    let timeoutHandle: NodeJS.Timeout;\n    let resolved = false;\n\n    const unsubscribe = () => {\n      presence.unsubscribe(channel);\n      clearTimeout(timeoutHandle);\n    };\n\n    presence.subscribe(channel, (roomId: string) => {\n      if (resolved) return;\n      resolved = true;\n      unsubscribe();\n      resolve(roomId);\n    });\n\n    timeoutHandle = setTimeout(() => {\n      if (resolved) return;\n      resolved = true;\n      unsubscribe();\n      reject(new Error(\"timeout\"));\n    }, timeout);\n  });\n}"],
  "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAmC;AACnC,sBAA8B;AAC9B,sBAA4B;AAC5B,mBAAsD;AAEtD,eAAsB,eACpB,UACA,kBACA,QACA,MACA,mBAA2B,wCACf;AACZ,SAAO,IAAI,QAAW,OAAO,SAAS,WAAW;AAC/C,QAAI;AAEJ,UAAM,gBAAY,yBAAW;AAC7B,UAAM,UAAU,OAAO,SAAS;AAEhC,UAAM,cAAc,MAAM;AACxB,eAAS,YAAY,OAAO;AAC5B,mBAAa,kBAAkB;AAAA,IACjC;AAEA,UAAM,SAAS,UAAU,SAAS,CAAC,YAAgC;AACjE,YAAM,CAAC,MAAM,IAAI,IAAI;AACrB,UAAI,SAAS,4BAAY,SAAS;AAChC,gBAAQ,IAAI;AAAA,MAEd,WAAW,SAAS,4BAAY,OAAO;AACrC,YAAI,QAAa;AAGjB,YAAI;AAAE,kBAAQ,KAAK,MAAM,IAAI;AAAA,QAAE,SAAS,GAAG;AAAA,QAAC;AAG5C,YAAI,OAAO,UAAW,UAAU;AAC9B,kBAAQ,IAAI,MAAM,KAAK;AAAA,QACzB;AAEA,eAAO,KAAK;AAAA,MACd;AACA,kBAAY;AAAA,IACd,CAAC;AAED,aAAS,QAAQ,kBAAkB,CAAC,QAAQ,WAAW,IAAI,CAAC;AAE5D,yBAAqB,WAAW,MAAM;AACpC,kBAAY;AACZ,aAAO,IAAI,MAAM,aAAa,CAAC;AAAA,IACjC,GAAG,gBAAgB;AAAA,EACrB,CAAC;AACH;AAEA,eAAsB,aACpB,UACA,SACA,eACA;AACA,QAAM,SAAS,UAAU,SAAS,CAAC,YAAY;AAC7C,UAAM,CAAC,QAAQ,WAAW,IAAI,IAAI;AAElC,UAAM,QAAQ,CAAC,MAAM,SAAS;AAC5B,eAAS,QAAQ,OAAO,SAAS,IAAI,CAAC,MAAM,IAAI,CAAC;AAAA,IACnD;AAGA,QAAI;AACJ,QAAI;AACF,iBAAW,cAAc,QAAQ,IAAI;AAAA,IAEvC,SAAS,GAAQ;AACf,2CAAmB,CAAC;AACpB,YAAM,QAAS,OAAO,EAAE,SAAU,cAC9B,EAAE,MAAM,EAAE,MAAM,SAAS,EAAE,QAAQ,IACnC,EAAE;AACN,aAAO,MAAM,4BAAY,OAAO,KAAK,UAAU,KAAK,CAAC;AAAA,IACvD;AAEA,QAAI,EAAE,oBAAoB,UAAU;AAClC,aAAO,MAAM,4BAAY,SAAS,QAAQ;AAAA,IAC5C;AAEA,aACE,KAAK,CAAC,WAAW,MAAM,4BAAY,SAAS,MAAM,CAAC,EACnD,MAAM,CAAC,MAAM;AAEX,YAAM,MAAM,KAAK,EAAE,WAAW;AAC9B,YAAM,4BAAY,OAAO,GAAG;AAAA,IAC9B,CAAC;AAAA,EACL,CAAC;AACH;AAKO,SAAS,qBACd,UACA,SACA,SACiB;AACjB,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,QAAI;AACJ,QAAI,WAAW;AAEf,UAAM,cAAc,MAAM;AACxB,eAAS,YAAY,OAAO;AAC5B,mBAAa,aAAa;AAAA,IAC5B;AAEA,aAAS,UAAU,SAAS,CAAC,WAAmB;AAC9C,UAAI,SAAU;AACd,iBAAW;AACX,kBAAY;AACZ,cAAQ,MAAM;AAAA,IAChB,CAAC;AAED,oBAAgB,WAAW,MAAM;AAC/B,UAAI,SAAU;AACd,iBAAW;AACX,kBAAY;AACZ,aAAO,IAAI,MAAM,SAAS,CAAC;AAAA,IAC7B,GAAG,OAAO;AAAA,EACZ,CAAC;AACH;",
  "names": []
}
