export class TypeRegistry { namespace; schemas; exceptions; static registries = new Map(); constructor(namespace, schemas = new Map(), exceptions = new Map()) { this.namespace = namespace; this.schemas = schemas; this.exceptions = exceptions; } static for(namespace) { if (!TypeRegistry.registries.has(namespace)) { TypeRegistry.registries.set(namespace, new TypeRegistry(namespace)); } return TypeRegistry.registries.get(namespace); } register(shapeId, schema) { const qualifiedName = this.normalizeShapeId(shapeId); const registry = TypeRegistry.for(qualifiedName.split("#")[0]); registry.schemas.set(qualifiedName, schema); } getSchema(shapeId) { const id = this.normalizeShapeId(shapeId); if (!this.schemas.has(id)) { throw new Error(`@smithy/core/schema - schema not found for ${id}`); } return this.schemas.get(id); } registerError(es, ctor) { const $error = es; const registry = TypeRegistry.for($error[1]); registry.schemas.set($error[1] + "#" + $error[2], $error); registry.exceptions.set($error, ctor); } getErrorCtor(es) { const $error = es; const registry = TypeRegistry.for($error[1]); return registry.exceptions.get($error); } getBaseException() { for (const exceptionKey of this.exceptions.keys()) { if (Array.isArray(exceptionKey)) { const [, ns, name] = exceptionKey; const id = ns + "#" + name; if (id.startsWith("smithy.ts.sdk.synthetic.") && id.endsWith("ServiceException")) { return exceptionKey; } } } return undefined; } find(predicate) { return [...this.schemas.values()].find(predicate); } clear() { this.schemas.clear(); this.exceptions.clear(); } normalizeShapeId(shapeId) { if (shapeId.includes("#")) { return shapeId; } return this.namespace + "#" + shapeId; } }