{"version":3,"file":"interval.mjs","sourceRoot":"","sources":["../../../src/common/endowments/interval.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,6BAA6B;AAEjD,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAE5B;;;;;;;;;GASG;AACH,MAAM,cAAc,GAAG,GAAG,EAAE;IAC1B,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAoB,CAAC;IAEtD,MAAM,YAAY,GAAG,CACnB,OAAqB,EACrB,OAAgB,EAChB,GAAG,IAAW,EACL,EAAE;QACX,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;YAClC,MAAM,SAAS,CAAC,YAAY,CAC1B,sDAAsD,OAAO,OAAO,GAAG,CACxE,CAAC;QACJ,CAAC;QACD,MAAM,CAAC,OAAO,CAAC,CAAC;QAChB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAClD,MAAM,cAAc,GAAG,WAAW,CAChC,OAAO,EACP,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,OAAO,IAAI,CAAC,CAAC,EACxC,GAAG,IAAI,CACR,CAAC;QACF,iBAAiB,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAC9C,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,CAAC,MAAe,EAAQ,EAAE;QAC/C,MAAM,CAAC,MAAM,CAAC,CAAC;QACf,MAAM,cAAc,GAAG,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrD,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,aAAa,CAAC,cAAqB,CAAC,CAAC;YACrC,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,GAAS,EAAE;QAClC,KAAK,MAAM,MAAM,IAAI,iBAAiB,CAAC,IAAI,EAAE,EAAE,CAAC;YAC9C,cAAc,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO;QACL,WAAW,EAAE,MAAM,CAAC,YAAY,CAAC;QACjC,aAAa,EAAE,MAAM,CAAC,cAAc,CAAC;QACrC,gBAAgB;KACR,CAAC;AACb,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG;IACtB,KAAK,EAAE,CAAC,aAAa,EAAE,eAAe,CAAU;IAChD,OAAO,EAAE,cAAc;CACxB,CAAC;AACF,eAAe,eAAe,CAAC","sourcesContent":["import { rpcErrors } from '@metamask/rpc-errors';\n\nconst MINIMUM_INTERVAL = 10;\n\n/**\n * Creates a pair of `setInterval` and `clearInterval` functions attenuated such\n * that:\n * - `setInterval` throws if its \"handler\" parameter is not a function.\n * - `clearInterval` only clears timeouts created by its sibling `setInterval`,\n * or else no-ops.\n *\n * @returns An object with the attenuated `setInterval` and `clearInterval`\n * functions.\n */\nconst createInterval = () => {\n  const registeredHandles = new Map<unknown, unknown>();\n\n  const _setInterval = (\n    handler: TimerHandler,\n    timeout?: number,\n    ...args: any[]\n  ): unknown => {\n    if (typeof handler !== 'function') {\n      throw rpcErrors.invalidInput(\n        `The interval handler must be a function. Received: ${typeof handler}.`,\n      );\n    }\n    harden(handler);\n    const handle = Object.freeze(Object.create(null));\n    const platformHandle = setInterval(\n      handler,\n      Math.max(MINIMUM_INTERVAL, timeout ?? 0),\n      ...args,\n    );\n    registeredHandles.set(handle, platformHandle);\n    return handle;\n  };\n\n  const _clearInterval = (handle: unknown): void => {\n    harden(handle);\n    const platformHandle = registeredHandles.get(handle);\n    if (platformHandle !== undefined) {\n      clearInterval(platformHandle as any);\n      registeredHandles.delete(handle);\n    }\n  };\n\n  const teardownFunction = (): void => {\n    for (const handle of registeredHandles.keys()) {\n      _clearInterval(handle);\n    }\n  };\n\n  return {\n    setInterval: harden(_setInterval),\n    clearInterval: harden(_clearInterval),\n    teardownFunction,\n  } as const;\n};\n\nconst endowmentModule = {\n  names: ['setInterval', 'clearInterval'] as const,\n  factory: createInterval,\n};\nexport default endowmentModule;\n"]}