{"version":3,"sources":["../../src/inspector/registry.ts"],"names":[],"mappings":";;;AAGO,IAAM,oBAAN,MAAwB;AAAA,EACZ,WAAA,uBAAkB,GAAA,EAAiC;AAAA,EAEpE,SAAS,UAAA,EAAuC;AAC9C,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,UAAA,CAAW,IAAA,EAAM,UAAU,CAAA;AAAA,EAClD;AAAA,EAEA,IAAI,IAAA,EAAqD;AACvD,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAAA,EAClC;AAAA,EAEA,aAAA,GAAyD;AACvD,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA,CACjC,KAAK,CAAC,IAAA,EAAM,UAAU,IAAA,CAAK,WAAA,CAAY,cAAc,KAAA,CAAM,WAAW,CAAC,CAAA,CACvE,GAAA,CAAI,CAAC,UAAA,MAAgB;AAAA,MACpB,MAAM,UAAA,CAAW,IAAA;AAAA,MACjB,aAAa,UAAA,CAAW;AAAA,KAC1B,CAAE,CAAA;AAAA,EACN;AAAA,EAEA,gBAAgB,KAAA,EAAqD;AACnE,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,UAAA,KAAe,UAAA,CAAW,YAAA,GAAe,KAAK,CAAC,CAAA;AAAA,EAC7F;AAAA,EAEA,mBAAmB,KAAA,EAAkF;AACnG,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,MAAM,IAAI,CAAA;AAE9C,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,CAAA,CAAE,IAAA;AAAA,MAAK,CAAC,UAAA,KAC1C,UAAA,CAAW,SAAA,CAAU,QAAA,CAAS,MAAM,QAAQ;AAAA,KAC9C;AAAA,EACF;AACF;AAEA,IAAI,uBAAA,GAAoD,IAAA;AAEjD,SAAS,oBAAA,GAA0C;AACxD,EAAA,IAAI,CAAC,uBAAA,EAAyB;AAC5B,IAAA,uBAAA,GAA0B,IAAI,iBAAA,EAAkB;AAAA,EAClD;AAEA,EAAA,OAAO,uBAAA;AACT;AAEO,SAAS,sBAAA,GAA+B;AAC7C,EAAA,uBAAA,GAA0B,IAAA;AAC5B;AAEA,eAAsB,2BAA2B,KAAA,EAIlB;AAC7B,EAAA,MAAM,WAAW,oBAAA,EAAqB;AACtC,EAAA,MAAM,UAAA,GACJ,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,IACvB,QAAA,CAAS,eAAA,CAAgB,KAAA,CAAM,KAAK,CAAA,IACpC,QAAA,CAAS,mBAAmB,KAAK,CAAA;AAEnC,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2CAAA,EAA8C,KAAA,CAAM,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EAC7E;AAEA,EAAA,MAAM,SAAA,GAAY,MAAM,UAAA,CAAW,eAAA,EAAgB;AACnD,EAAA,MAAM,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAChC,EAAA,OAAO,SAAA;AACT","file":"index.cjs","sourcesContent":["import type { DatabaseKind } from '../types/kind';\r\nimport type { DatabaseInspector, InspectorDefinition } from './types';\r\n\r\nexport class InspectorRegistry {\r\n  private readonly definitions = new Map<string, InspectorDefinition>();\r\n\r\n  register(definition: InspectorDefinition): void {\r\n    this.definitions.set(definition.kind, definition);\r\n  }\r\n\r\n  get(kind: DatabaseKind): InspectorDefinition | undefined {\r\n    return this.definitions.get(kind);\r\n  }\r\n\r\n  listSupported(): { kind: string; displayName: string }[] {\r\n    return [...this.definitions.values()]\r\n      .sort((left, right) => left.displayName.localeCompare(right.displayName))\r\n      .map((definition) => ({\r\n        kind: definition.kind,\r\n        displayName: definition.displayName,\r\n      }));\r\n  }\r\n\r\n  detectFromBytes(bytes: ArrayBuffer): InspectorDefinition | undefined {\r\n    return [...this.definitions.values()].find((definition) => definition.canOpenBytes?.(bytes));\r\n  }\r\n\r\n  detectFromSnapshot(input: { kind: DatabaseKind; mimeType: string }): InspectorDefinition | undefined {\r\n    const byKind = this.definitions.get(input.kind);\r\n\r\n    if (byKind) {\r\n      return byKind;\r\n    }\r\n\r\n    return [...this.definitions.values()].find((definition) =>\r\n      definition.mimeTypes.includes(input.mimeType),\r\n    );\r\n  }\r\n}\r\n\r\nlet globalInspectorRegistry: InspectorRegistry | null = null;\r\n\r\nexport function getInspectorRegistry(): InspectorRegistry {\r\n  if (!globalInspectorRegistry) {\r\n    globalInspectorRegistry = new InspectorRegistry();\r\n  }\r\n\r\n  return globalInspectorRegistry;\r\n}\r\n\r\nexport function resetInspectorRegistry(): void {\r\n  globalInspectorRegistry = null;\r\n}\r\n\r\nexport async function createInspectorForSnapshot(input: {\r\n  kind: DatabaseKind;\r\n  mimeType: string;\r\n  bytes: ArrayBuffer;\r\n}): Promise<DatabaseInspector> {\r\n  const registry = getInspectorRegistry();\r\n  const definition =\r\n    registry.get(input.kind) ??\r\n    registry.detectFromBytes(input.bytes) ??\r\n    registry.detectFromSnapshot(input);\r\n\r\n  if (!definition) {\r\n    throw new Error(`No inspector registered for database kind \"${input.kind}\"`);\r\n  }\r\n\r\n  const inspector = await definition.createInspector();\r\n  await inspector.open(input.bytes);\r\n  return inspector;\r\n}\r\n"]}