{"version":3,"file":"index.umd.cjs","sources":["../src/error.ts","../src/package.ts","../src/utilities.ts","../src/main.ts"],"sourcesContent":["/** プロシージャコールエラーコード */\nexport namespace PROCEDURE_CALL_ERROR_CODE {\n  /** プロシージャコールエラーコード: 内部エラー */\n  export const INTERNAL = 'PROCEDURE_CALL_INTERNAL';\n  /** プロシージャコールエラーコード: タイムアウト */\n  export const TIMEOUT = 'PROCEDURE_CALL_TIMEOUT';\n  /** プロシージャコールエラーコード: 未定義 */\n  export const UNDEFINED = 'PROCEDURE_CALL_UNDEFINED';\n  /** プロシージャコールエラーコード: 未初期化 */\n  export const UNINITIALIZED = 'PROCEDURE_CALL_UNINITIALIZED';\n}\n\n/**\n * プロシージャコールエラー\n */\nexport class ProcedureCallError<Data = unknown> extends Error {\n  /**\n   * コード\n   * @default ''\n   */\n  code: string;\n  /**\n   * データ\n   * @default undefined\n   */\n  data?: Data;\n  /**\n   * タイムスタンプ(UNIX時間)[ミリ秒]\n   */\n  timestamp: number;\n\n  constructor(code?: string, message?: string, options?: ProcedureCallErrorOptions<Data>) {\n    super(message, options && options.cause ? { cause: options.cause } : undefined);\n\n    this.code = code ?? '';\n    this.name = ProcedureCallError.name + '[' + this.code + ']';\n    this.timestamp = Date.now();\n\n    if (options) {\n      if (options.data) {\n        this.data = options.data;\n      }\n    }\n  }\n}\n\n/**\n * プロシージャコールエラーオプション\n */\nexport interface ProcedureCallErrorOptions<Data = unknown> extends ErrorOptions {\n  /** データ */\n  data?: Data;\n}\n","/** 名前 */\nexport const NAME = 'PROCEDURE_CALL';\n/** バージョン */\nexport const VERSION = __version;\n","/** 文字 */\nexport const CHARACTERS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\n\n/**\n * 62進数文字列を生成する。\n * @param x 10進数\n * @returns 62進数文字列\n */\nexport function generateDuosexagesimalString(x: number) {\n  /** 文字 */\n  const characters = [];\n  for (; x > 0; x = Math.floor(x / CHARACTERS.length)) {\n    characters.unshift(CHARACTERS.at(x % CHARACTERS.length));\n  }\n  return characters.length > 0 ? characters.join('') : '0';\n}\n\n/**\n * 乱文字列\n * @param length 文字数\n * @returns 乱文字列\n */\nexport function generateRandomString(length: number) {\n  return Array.from({ length: Math.max(length, 0) })\n    .map(function () {\n      return CHARACTERS[Math.floor(CHARACTERS.length * Math.random())];\n    })\n    .join('');\n}\n\n/**\n * テンプレートリテラル文字列を生成する。\n * @param s 文字列\n * @returns テンプレートリテラル文字列\n */\nexport function generateTemplateLiteralString(s: string) {\n  return ('`'\n   + s.replaceAll('\\\\', '\\\\\\\\').replaceAll('`', '\\\\`')\n    + '`');\n}\n","import { describe, expect, test, vi } from 'vitest';\n\nimport { PROCEDURE_CALL_ERROR_CODE, ProcedureCallError } from './error';\nimport { NAME } from './package';\nimport { generateDuosexagesimalString, generateRandomString } from './utilities';\n\nimport type {\n  Jsonized,\n  Procedure,\n  ProcedureCallOptions,\n  ProcedureCallPacket,\n  ProcedureCallRawPacket,\n} from './types';\n\n/** プロシージャコール識別子 */\nconst PROCEDURE_CALL_IDENTIFIER =\n  generateDuosexagesimalString(Date.now()) + ':' + generateRandomString(4);\n/** プロシージャコールペイロード文字列接頭辞 */\nexport const PROCEDURE_CALL_PAYLOAD_STRING_PREFIX = 'pc::';\n/** プロシージャコールプロトコル */\nexport const PROCEDURE_CALL_PROTOCOL = 'pc';\n\n/** コールバック */\nconst callbacks = new Map<string, [{ (value: any): void }, { (reason?: any): void }]>();\n/** 既定の手続き */\nconst defaultProcedures = new Map<string, Procedure>();\n/** カウンター */\nlet n = 0;\n/** 手続き */\nconst procedures = new Map<string, Procedure>();\n\n/**\n * 手続きを呼び出す。\n * @param name 名前\n * @param requestData リクエストデータ\n * @param post 送信関数\n * @param options オプション\n * @returns レスポンスデータ\n */\nexport async function call<RequestData, ResponseData>(\n  name: string,\n  requestData: RequestData,\n  post: { (payloadString: string): void | PromiseLike<void> },\n  options?: ProcedureCallOptions,\n): Promise<Jsonized<Awaited<ResponseData>, object>> {\n  /** キー */\n  const key = PROCEDURE_CALL_IDENTIFIER + ':' + String(n++);\n\n  /** リクエスト */\n  const request: ProcedureCallRawPacket<'req'> = {\n    data: requestData,\n    index: 0,\n    key,\n    name,\n    p: PROCEDURE_CALL_PROTOCOL,\n    timestamp: Date.now(),\n    t: 'req',\n    v: 0,\n  };\n\n  /** プロミス */\n  const promise = new Promise<Jsonized<Awaited<ResponseData>, object>>(function (resolve, reject) {\n    callbacks.set(key, [resolve, reject]);\n\n    if (options?.timeout !== undefined && Number.isFinite(options.timeout) && options.timeout > 0) {\n      setTimeout(function () {\n        reject(new ProcedureCallError(PROCEDURE_CALL_ERROR_CODE.TIMEOUT));\n        callbacks.delete(key);\n      }, options.timeout);\n    }\n  });\n\n  await Promise.resolve(post(PROCEDURE_CALL_PAYLOAD_STRING_PREFIX + JSON.stringify(request)));\n\n  return promise;\n}\n\n/**\n * 対象の手続きを呼び出す。\n * @param target 対象\n * @param name 名前\n * @param requestData リクエストデータ\n * @param options オプション\n * @returns レスポンスデータ\n */\nexport async function callTarget<RequestData, ResponseData>(\n  target: { postMessage: { (message: string): void } } | null | undefined,\n  name: string,\n  requestData: RequestData,\n  options?: ProcedureCallOptions,\n): Promise<Jsonized<Awaited<ResponseData>, object>> {\n  if (\n    typeof target === 'object' &&\n    target !== null &&\n    'postMessage' in target &&\n    typeof target.postMessage === 'function'\n  ) {\n    return call(name, requestData, target.postMessage.bind(target), options);\n  } else {\n    console.error(\n      `[${NAME}] \\`target.postMessage\\`が初期化されていないため、手続き\\`${name}\\`のリクエストを送信できません。`,\n    );\n    throw new ProcedureCallError(PROCEDURE_CALL_ERROR_CODE.UNINITIALIZED);\n  }\n}\n\n/**\n * ハンドラー\n * @param payloadString ペイロード文字列\n * @param post 送信関数\n * @param assist 補助関数\n */\nexport async function handler(\n  payloadString: string,\n  post: { (payloadString: string, payload: ProcedureCallPacket<'req'>): void | PromiseLike<void> },\n  assist?: { (payloadString: string): void | PromiseLike<void> },\n) {\n  /** ペイロード */\n  const payload = parsePayloadString(payloadString);\n  if (payload !== undefined) {\n    switch (payload.t) {\n      case 'req': {\n        /** 手続き */\n        const procedure = procedures.get(payload.name);\n        if (procedure) {\n          await Promise.resolve(procedure(payload.data, { payload }))\n            .then(function (responseData): ProcedureCallPacket<'res'> {\n              return {\n                data: responseData,\n                index: payload.index + 1,\n                key: payload.key,\n                name: payload.name,\n                p: PROCEDURE_CALL_PROTOCOL,\n                timestamp: Date.now(),\n                t: 'res',\n                v: 0,\n              };\n            })\n            .catch(function (error): ProcedureCallPacket<'err'> {\n              if (error instanceof ProcedureCallError) {\n                console.debug(error);\n                return {\n                  code: error.code || PROCEDURE_CALL_ERROR_CODE.INTERNAL,\n                  ...(error.data !== undefined && { data: error.data }),\n                  index: payload.index + 1,\n                  key: payload.key,\n                  ...(error.message && { message: error.message }),\n                  name: payload.name,\n                  p: PROCEDURE_CALL_PROTOCOL,\n                  timestamp: error.timestamp,\n                  t: 'err',\n                  v: 0,\n                };\n              } else {\n                console.error(error);\n                return {\n                  code: PROCEDURE_CALL_ERROR_CODE.INTERNAL,\n                  index: payload.index + 1,\n                  key: payload.key,\n                  name: payload.name,\n                  p: PROCEDURE_CALL_PROTOCOL,\n                  timestamp: Date.now(),\n                  t: 'err',\n                  v: 0,\n                };\n              }\n            })\n            .then(function (response) {\n              return post(PROCEDURE_CALL_PAYLOAD_STRING_PREFIX + JSON.stringify(response), payload);\n            });\n        } else {\n          console.error(`[${NAME}] 手続き\\`${payload.name}\\`が登録されていません。`);\n          await Promise.resolve(\n            post(\n              PROCEDURE_CALL_PAYLOAD_STRING_PREFIX +\n                JSON.stringify({\n                  code: PROCEDURE_CALL_ERROR_CODE.UNDEFINED,\n                  index: payload.index + 1,\n                  key: payload.key,\n                  name: payload.name,\n                  p: PROCEDURE_CALL_PROTOCOL,\n                  timestamp: Date.now(),\n                  t: 'err',\n                  v: 0,\n                } satisfies ProcedureCallPacket<'err'>),\n              payload,\n            ),\n          );\n        }\n        break;\n      }\n      case 'res': {\n        /** コールバック */\n        const callback = callbacks.get(payload.key);\n        if (callback) {\n          callback[0](payload.data);\n          callbacks.delete(payload.key);\n        } else {\n          console.error(\n            `[${NAME}] リクエスト\\`${payload.name}:${payload.key}\\`のコールバックが存在しないため、レスポンスを受信できません。`,\n          );\n        }\n        break;\n      }\n      case 'err': {\n        /** コールバック */\n        const callback = callbacks.get(payload.key);\n        if (callback) {\n          callback[1](\n            new ProcedureCallError(payload.code, payload.message, { data: payload.data }),\n          );\n          callbacks.delete(payload.key);\n        } else {\n          console.error(\n            `[${NAME}] リクエスト\\`${payload.name}:${payload.key}\\`のコールバックが存在しないため、エラーを受信できません。`,\n          );\n        }\n        break;\n      }\n    }\n  } else {\n    if (assist) {\n      await Promise.resolve(assist(payloadString));\n    } else {\n      console.error(`[${NAME}] ペイロード文字列\\`${payloadString}\\`が無効な形式です。`);\n    }\n  }\n}\n\n/**\n * 既定の手続きが登録されている場合、`true`を返す。\n * @param name 名前\n * @param procedure 手続き\n * @returns 真偽値\n *\n * - 名前のみ指定した場合、その名前で手続きが登録されている場合に`true`を返す。\n * - 手続きのみ指定した場合、その手続きが何れかの名前で登録されている場合に`true`を返す。\n * - 名前と手続きを指定した場合、その名前でその手続きが登録されている場合に`true`を返す。\n */\nexport function isDefaultProcedureRegistered(name?: string, procedure?: any) {\n  if (name !== undefined) {\n    if (procedure !== undefined) {\n      return defaultProcedures.get(name) === procedure;\n    } else {\n      return defaultProcedures.has(name);\n    }\n  } else if (procedure !== undefined) {\n    return Array.from(defaultProcedures.values()).includes(procedure);\n  } else {\n    return false;\n  }\n}\n\n/**\n * 手続きが登録されている場合、`true`を返す。\n * @param name 名前\n * @param procedure 手続き\n * @returns 真偽値\n *\n * - 名前のみ指定した場合、その名前で手続きが登録されている場合に`true`を返す。\n * - 手続きのみ指定した場合、その手続きが何れかの名前で登録されている場合に`true`を返す。\n * - 名前と手続きを指定した場合、その名前でその手続きが登録されている場合に`true`を返す。\n */\nexport function isProcedureRegistered(name?: string, procedure?: any) {\n  if (name !== undefined) {\n    if (procedure !== undefined) {\n      return procedures.get(name) === procedure;\n    } else {\n      return procedures.has(name);\n    }\n  } else if (procedure !== undefined) {\n    return Array.from(procedures.values()).includes(procedure);\n  } else {\n    return false;\n  }\n}\n\n/**\n * ペイロード文字列を解析する。\n * @param payloadString ペイロード文字列\n * @returns ペイロード\n */\nfunction parsePayloadString(\n  payloadString: string,\n):\n  | ProcedureCallPacket<'err'>\n  | ProcedureCallPacket<'req'>\n  | ProcedureCallPacket<'res'>\n  | undefined {\n  if (\n    typeof payloadString === 'string' &&\n    payloadString.startsWith(PROCEDURE_CALL_PAYLOAD_STRING_PREFIX)\n  ) {\n    try {\n      /** ペイロード */\n      const payload = JSON.parse(payloadString.slice(PROCEDURE_CALL_PAYLOAD_STRING_PREFIX.length));\n      if (\n        typeof payload === 'object' &&\n        payload !== null &&\n        payload.p === PROCEDURE_CALL_PROTOCOL &&\n        payload.v === 0\n      ) {\n        return payload;\n      } else {\n        return undefined;\n      }\n    } catch {\n      return undefined;\n    }\n  } else {\n    return undefined;\n  }\n}\n\n/**\n * 既定の手続きを登録する。\n * @param name 名前\n * @param procedure 手続き\n * @returns 既定の手続きを登録解除する。\n */\nexport function registerDefaultProcedure<RequestData, ResponseData>(\n  name: string,\n  procedure: Procedure<Jsonized<RequestData, object>, Awaited<ResponseData>>,\n) {\n  if (!procedures.has(name) || procedures.get(name) === defaultProcedures.get(name)) {\n    procedures.set(name, procedure);\n  }\n  defaultProcedures.set(name, procedure);\n  return function () {\n    if (procedures.get(name) === procedure) {\n      procedures.delete(name);\n    }\n    if (defaultProcedures.get(name) === procedure) {\n      defaultProcedures.delete(name);\n    }\n  };\n}\n\n/**\n * 手続きを登録する。\n * @param name 名前\n * @param procedure 手続き\n * @returns 手続きを登録解除する。\n */\nexport function registerProcedure<RequestData, ResponseData>(\n  name: string,\n  procedure: Procedure<Jsonized<RequestData, object>, Awaited<ResponseData>>,\n) {\n  procedures.set(name, procedure);\n  return function () {\n    if (procedures.get(name) === procedure) {\n      procedures.delete(name);\n\n      /** 既定の手続き */\n      const defaultProcedure = defaultProcedures.get(name);\n      if (defaultProcedure !== undefined) {\n        procedures.set(name, defaultProcedure);\n      }\n    }\n  };\n}\n\n/**\n * リセットする。\n */\nexport function reset() {\n  callbacks.clear();\n  defaultProcedures.clear();\n  n = 0;\n  procedures.clear();\n}\n\nif (import.meta.vitest) {\n  test(`識別子\"${PROCEDURE_CALL_IDENTIFIER}\"の形式`, function () {\n    expect(PROCEDURE_CALL_IDENTIFIER).toMatch(/^[0-9A-Za-z]+:[0-9A-Za-z]{4}$/);\n  });\n\n  test(`${call.name}: \\`n\\`の増加`, async function () {\n    expect.assertions(3);\n\n    /** `console.error` */\n    const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(function () {});\n\n    reset();\n    expect(n).toBe(0);\n    await call('procedure', undefined, async function post(payloadString: string) {\n      await handler(payloadString, async function (payloadString) {\n        await handler(payloadString, function () {});\n      });\n    }).catch(function () {\n      expect(consoleErrorSpy).toHaveBeenCalled();\n    });\n    expect(n).toBe(1);\n  });\n\n  describe(`${parsePayloadString.name}`, function () {\n    test.each([\n      'pc::{\"index\":1,\"key\":\"KEY\",\"name\":\"NAME\",\"p\":\"pc\",\"timestamp\":0,\"t\":\"res\",\"v\":0}',\n      'pc::{\"code\":\"PROCEDURE_CALL_INTERNAL\",\"index\":1,\"key\":\"KEY\",\"name\":\"NAME\",\"p\":\"pc\",\"timestamp\":0,\"t\":\"err\",\"v\":0}',\n    ])(`Truthy %#`, function (payloadString) {\n      expect(parsePayloadString(payloadString)).toBeTruthy();\n    });\n\n    test.each(['', 'abc', 'pc::', 'pc::abc', 'pc::{}'])(`Falsy %#`, function (payloadString) {\n      expect(parsePayloadString(payloadString)).toBeFalsy();\n    });\n  });\n\n  test(`${reset.name}`, function () {\n    callbacks.set('TEST', [function () {}, function () {}]);\n    n = 123;\n    defaultProcedures.set('TEST', function () {});\n    procedures.set('TEST', function () {});\n\n    reset();\n\n    expect(callbacks.size).toBe(0);\n    expect(n).toBe(0);\n    expect(defaultProcedures.size).toBe(0);\n    expect(procedures.size).toBe(0);\n  });\n}\n"],"names":["exports","PROCEDURE_CALL_ERROR_CODE","ProcedureCallError","code","message","options","__publicField","NAME","VERSION","CHARACTERS","generateDuosexagesimalString","x","characters","generateRandomString","length","generateTemplateLiteralString","s","PROCEDURE_CALL_IDENTIFIER","PROCEDURE_CALL_PAYLOAD_STRING_PREFIX","PROCEDURE_CALL_PROTOCOL","callbacks","defaultProcedures","n","procedures","call","name","requestData","post","key","request","promise","resolve","reject","callTarget","target","handler","payloadString","assist","payload","parsePayloadString","procedure","responseData","error","response","callback","isDefaultProcedureRegistered","isProcedureRegistered","registerDefaultProcedure","registerProcedure","defaultProcedure","reset"],"mappings":"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"}