UNPKG

firebase-lib-db

Version:

Database Lib to access Firestore (CRUD) and Cache Data

1 lines 21.3 kB
{"version":3,"sources":["../src/logger/index.ts","../src/util/ConnectionPool.ts","../src/v2/cache/Redis.ts","../src/v2/database/Firestore.ts"],"sourcesContent":["import winston, { Logger } from \"winston\";\n\nlet loggerInstance: winston.Logger | null = null;\n\nfunction GetLogger(): Logger {\n if (!loggerInstance) {\n loggerInstance = winston.createLogger({\n level: process.env.LOG_LEVEL || \"info\",\n format: winston.format.json(),\n transports: [new winston.transports.Console()],\n });\n }\n return loggerInstance;\n}\n\nexport const info = (message: string, rest: any) => {\n log(\"info\", message, rest);\n};\n\nexport const warn = (message: string, rest: any) => {\n log(\"warn\", message, rest);\n};\n\nexport const error = (message: string, rest: any) => {\n log(\"error\", message, rest);\n};\n\nexport const debug = (message: string, rest: any) => {\n log(\"debug\", message, rest);\n};\n\nconst log = (\n severity: \"info\" | \"warn\" | \"error\" | \"debug\",\n message: string,\n rest: any\n) => {\n const logger = GetLogger()[severity];\n if (rest.error instanceof Error) {\n rest.error = {\n message: rest.error.message,\n stack: rest.error.stack,\n };\n }\n const metadata = {\n ...rest,\n };\n if (rest.operation) {\n logger(\n `[Database] [${severity.toUpperCase()}] [${rest.operation}] - ${message}`,\n { metadata }\n );\n } else {\n logger(`[Database] [${severity.toUpperCase()}] - ${message}`, {\n metadata,\n });\n }\n};\n\nexport default GetLogger;\n","import { createClient, RedisClientType } from \"redis\";\n\nconst endpoint = process.env.REDISCLOUD_URL;\n\nexport default class RedisPool {\n private static readonly MAX_CONNECTION = 10;\n private static pool: RedisClientType[] = [];\n\n public static async GetConnection(): Promise<RedisClientType> {\n if (RedisPool.pool.length > 0) {\n const connection = RedisPool.pool.pop();\n\n if (connection) return connection;\n }\n\n const newConnection: RedisClientType = createClient({ url: endpoint });\n try {\n await newConnection.connect();\n } catch (err) {\n throw new Error(`Erro ao conectar no Redis - ${err}`);\n }\n\n return newConnection;\n }\n\n public static releaseConnection(connection: RedisClientType): void {\n if (!endpoint || !connection.isOpen) return;\n\n if (RedisPool.pool.length < RedisPool.MAX_CONNECTION) {\n RedisPool.pool.push(connection);\n } else {\n connection.quit();\n }\n }\n}\n","import { error } from \"../../logger\";\nimport RedisConnectionPool from \"../../util/ConnectionPool\";\nimport { Cache } from \"../types/\";\n\nexport class Redis implements Cache {\n private logError(method: string, keyOrPattern: string, err: unknown) {\n error(`Error in ${method} - Key/Pattern: ${keyOrPattern}\\n`, {\n operation: method,\n err,\n });\n }\n\n async del(key: string): Promise<void> {\n const conn = await RedisConnectionPool.GetConnection();\n try {\n await conn.del(key);\n } catch (error) {\n this.logError(\"del\", key, error);\n throw error;\n } finally {\n RedisConnectionPool.releaseConnection(conn);\n }\n }\n\n async get<T>(key: string): Promise<T | null> {\n const conn = await RedisConnectionPool.GetConnection();\n try {\n const data = await conn.get(key);\n return data ? (JSON.parse(data) as T) : null;\n } catch (err) {\n this.logError(\"get\", key, error);\n throw error;\n } finally {\n RedisConnectionPool.releaseConnection(conn);\n }\n }\n\n async set<T>(key: string, obj: T, ttl: number = 86400): Promise<void> {\n if (!obj) return;\n const conn = await RedisConnectionPool.GetConnection();\n try {\n await conn.setEx(key, ttl, JSON.stringify(obj));\n } catch (error) {\n this.logError(\"set\", key, error);\n throw error;\n } finally {\n RedisConnectionPool.releaseConnection(conn);\n }\n }\n\n async delPattern(pattern: string): Promise<void> {\n const conn = await RedisConnectionPool.GetConnection();\n try {\n const keys = await conn.keys(pattern);\n if (keys.length) await conn.del(keys);\n } catch (error) {\n this.logError(\"delPattern\", pattern, error);\n throw error;\n } finally {\n RedisConnectionPool.releaseConnection(conn);\n }\n }\n\n async getByPattern<T>(pattern: string): Promise<T[]> {\n const conn = await RedisConnectionPool.GetConnection();\n try {\n let cursor: number = 0;\n const keys = [];\n const conn = await RedisConnectionPool.GetConnection();\n do {\n const reply = await conn.scan(cursor, {\n MATCH: pattern,\n COUNT: 100,\n });\n cursor = reply.cursor;\n keys.push(...reply.keys);\n } while (cursor !== 0);\n\n const values: T[] = [];\n\n for (const key of keys) {\n const value = (await conn.get(key)) as T;\n values.push(value);\n }\n\n RedisConnectionPool.releaseConnection(conn);\n return values;\n } catch (error) {\n this.logError(\"getByPattern\", pattern, error);\n return [];\n } finally {\n RedisConnectionPool.releaseConnection(conn);\n }\n }\n}\n","import {\n Database,\n Cache,\n QueryWhere as Where,\n QueryOptions,\n QueryResponse as Response,\n} from \"../types\";\nimport { firestore } from \"firebase-admin\";\nimport { error as logErr, info } from \"../../logger\";\nimport { Redis } from \"../cache/Redis\";\nimport crypto from \"crypto\";\n\nexport class Firestore implements Database {\n private _db: firestore.Firestore;\n private _cache: Cache;\n\n constructor(firestore: firestore.Firestore) {\n this._cache = new Redis();\n this._db = firestore;\n }\n\n async SaveBatch<T>(\n collectionName: string,\n data: (T & { id?: string })[]\n ): Promise<void> {\n const operation = \"SaveBatch\";\n const timestamp = Date.now();\n\n try {\n const batch = this._db.batch();\n const result: (T & { id: string })[] = [];\n\n data.forEach((item) => {\n const id = item.id || this._db.collection(collectionName).doc().id;\n const docRef = this._db.collection(collectionName).doc(id);\n batch.set(docRef, { ...item, modified: timestamp });\n result.push({ ...item, id });\n });\n\n await batch.commit();\n\n info(`Batch saved ${result.length} documents to ${collectionName}`, {\n collectionName,\n operation,\n });\n\n await this._cache.delPattern(`${collectionName}::*`);\n } catch (error) {\n logErr(\"Could not SaveBatch\", {\n collectionName,\n data,\n operation,\n error,\n });\n throw new Error(\"Could not batch save documents. Try again later.\");\n }\n }\n\n async Save<T>(\n collectionName: string,\n data: { id?: string } & T\n ): Promise<T & { id: string }> {\n const operation = \"SaveDocument\";\n const timestamp = Date.now();\n try {\n let docId: string;\n\n if (data?.id) {\n // Atualizando documento existente\n await this._db\n .collection(collectionName)\n .doc(data.id)\n .set({ ...data, modified: timestamp });\n docId = data.id;\n\n info(`Updating document [${docId}] in collection ${collectionName}.`, {\n operation,\n collectionName,\n documentId: docId,\n });\n } else {\n // Criando um novo documento\n const docRef = await this._db\n .collection(collectionName)\n .add({ ...data, modified: timestamp });\n docId = docRef.id;\n\n info(\n `Created new document with id ${docId} in collection ${collectionName}.`,\n {\n operation,\n collectionName,\n documentId: docId,\n }\n );\n }\n\n await this._cache.delPattern(`${collectionName}::*`);\n return { ...data, id: docId };\n } catch (error) {\n logErr(`Could not Save Data in ${collectionName}`, {\n collectionName,\n data,\n operation,\n error,\n });\n throw new Error(`Could not save item in Database [${collectionName}]`);\n }\n }\n\n async FindOne<T>(collectionName: string, id: string): Promise<T | null> {\n const operation: string = \"FindOne\";\n try {\n const cacheKey = this.__getCacheKey(collectionName, id);\n const cacheData = await this._cache.get<T>(cacheKey);\n\n if (cacheData) return cacheData;\n\n const docRef = this._db.collection(collectionName).doc(id);\n const docSnapshot = await docRef.get();\n\n if (docSnapshot.exists) {\n const data = docSnapshot.data() as T;\n this._cache.set<T>(cacheKey, data);\n return data;\n }\n\n return null;\n } catch (error) {\n logErr(`Could not FindOne Data in ${collectionName}`, {\n collectionName,\n id,\n operation,\n error,\n });\n\n throw new Error(\"Could not fetch data. Try again later\");\n }\n }\n\n async QueryData<T>(\n collectionName: string,\n query?: QueryOptions<T>,\n noCache?: boolean\n ): Promise<Response<T>> {\n const operation: string = \"QueryData\";\n\n try {\n let queryRef: FirebaseFirestore.Query =\n this._db.collection(collectionName);\n\n if (query?.orderBy) {\n queryRef = queryRef.orderBy(\n query.orderBy.field as string,\n query.orderBy.direction\n );\n }\n\n query?.wheres?.forEach((where) => {\n queryRef = queryRef.where(\n where.field as string,\n where.operation,\n where.value\n );\n });\n\n if (query?.cursor) {\n if (!query.orderBy) {\n throw new Error(\"An orderBy field is required when using cursors\");\n }\n\n const cursorValue = query.cursor || \"modified\";\n queryRef = queryRef.startAfter(cursorValue);\n }\n\n const cacheKey = this.__getCacheKey(collectionName, queryRef);\n const cached = await this._cache.get<Response<T>>(cacheKey);\n\n if (cached && !noCache) return cached;\n\n const q0 = await queryRef.count().get();\n const count = q0.data().count;\n\n if (query?.perPage) {\n queryRef = queryRef.limit(query.perPage);\n }\n\n const querySnapshot = await queryRef.get();\n const res = querySnapshot.docs.map((doc) => doc.data() as T);\n\n const lastDoc = querySnapshot.docs[querySnapshot.docs.length - 1];\n\n let cursor: string | number | null = null;\n if (lastDoc && query?.orderBy) {\n cursor = lastDoc.get(query.orderBy.field as string);\n }\n\n const result: Response<T> = {\n count,\n data: res,\n cursor,\n perPage: query?.perPage,\n };\n\n if (!noCache) this._cache.set(cacheKey, result);\n return result;\n } catch (error) {\n logErr(\"Could not Query Data\", {\n collectionName,\n error,\n operation,\n query,\n });\n throw new Error(\"Could not Query your Data. Try again later.\");\n }\n }\n\n async Delete<T>(collectionName: string, query: Where<T>): Promise<boolean> {\n const operation: string = \"DeleteData\";\n try {\n const idsDeleted: string[] = [];\n const queryResult = this._db\n .collection(collectionName)\n .where(query.field as string, query.operation, query.value);\n const snapshot = await queryResult.get();\n const batch = this._db.batch();\n\n snapshot.forEach((doc) => {\n batch.delete(doc.ref);\n idsDeleted.push(doc.id);\n });\n\n await batch.commit();\n info(\n `Deleting data in collection ${collectionName}. Ids deleted: ${idsDeleted}`,\n { collectionName, operation }\n );\n await this._cache.delPattern(`${collectionName}::*`);\n return true;\n } catch (error) {\n logErr(`Could not Delete Data`, {\n collectionName,\n query,\n error,\n operation,\n });\n throw new Error(\"Error while delete. Try again later\");\n }\n }\n\n async Update<T>(\n collectionName: string,\n id: string,\n data: Partial<T>\n ): Promise<T> {\n const operation: string = \"UpdateDocument\";\n try {\n const docRef = this._db.collection(collectionName).doc(id);\n await docRef.update({ ...data, modified: Date.now() });\n info(`Updating document ${id} in collection ${collectionName}`, {\n operation,\n documentId: id,\n collectionName,\n });\n await this._cache.delPattern(`${collectionName}::*`); //Clear cache by pattern\n const ref = await docRef.get();\n return ref.data() as T;\n } catch (error) {\n logErr(`Could not Update Data`, {\n collectionName,\n documentId: id,\n data,\n operation,\n error,\n });\n throw new Error(\"Error while Update data. Try again later.\");\n }\n }\n\n private __getCacheKey = (collectionName: string, data: any) => {\n const hashStr = crypto\n .createHash(\"md5\")\n .update(JSON.stringify(data))\n .digest(\"hex\");\n return `${collectionName}::${hashStr}`;\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,aAAyB;AAEhC,IAAI,iBAAwC;AAE5C,SAAS,YAAoB;AAC3B,MAAI,CAAC,gBAAgB;AACnB,qBAAiB,QAAQ,aAAa;AAAA,MACpC,OAAO,QAAQ,IAAI,aAAa;AAAA,MAChC,QAAQ,QAAQ,OAAO,KAAK;AAAA,MAC5B,YAAY,CAAC,IAAI,QAAQ,WAAW,QAAQ,CAAC;AAAA,IAC/C,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEO,IAAM,OAAO,CAAC,SAAiB,SAAc;AAClD,MAAI,QAAQ,SAAS,IAAI;AAC3B;AAMO,IAAM,QAAQ,CAAC,SAAiB,SAAc;AACnD,MAAI,SAAS,SAAS,IAAI;AAC5B;AAMA,IAAM,MAAM,CACV,UACA,SACA,SACG;AACH,QAAM,SAAS,UAAU,EAAE,QAAQ;AACnC,MAAI,KAAK,iBAAiB,OAAO;AAC/B,SAAK,QAAQ;AAAA,MACX,SAAS,KAAK,MAAM;AAAA,MACpB,OAAO,KAAK,MAAM;AAAA,IACpB;AAAA,EACF;AACA,QAAM,WAAW,mBACZ;AAEL,MAAI,KAAK,WAAW;AAClB;AAAA,MACE,eAAe,SAAS,YAAY,CAAC,MAAM,KAAK,SAAS,OAAO,OAAO;AAAA,MACvE,EAAE,SAAS;AAAA,IACb;AAAA,EACF,OAAO;AACL,WAAO,eAAe,SAAS,YAAY,CAAC,OAAO,OAAO,IAAI;AAAA,MAC5D;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ACxDA,SAAS,oBAAqC;AAE9C,IAAM,WAAW,QAAQ,IAAI;AAE7B,IAAqB,aAArB,MAAqB,WAAU;AAAA,EAI7B,OAAoB,gBAA0C;AAAA;AAC5D,UAAI,WAAU,KAAK,SAAS,GAAG;AAC7B,cAAM,aAAa,WAAU,KAAK,IAAI;AAEtC,YAAI;AAAY,iBAAO;AAAA,MACzB;AAEA,YAAM,gBAAiC,aAAa,EAAE,KAAK,SAAS,CAAC;AACrE,UAAI;AACF,cAAM,cAAc,QAAQ;AAAA,MAC9B,SAAS,KAAK;AACZ,cAAM,IAAI,MAAM,+BAA+B,GAAG,EAAE;AAAA,MACtD;AAEA,aAAO;AAAA,IACT;AAAA;AAAA,EAEA,OAAc,kBAAkB,YAAmC;AACjE,QAAI,CAAC,YAAY,CAAC,WAAW;AAAQ;AAErC,QAAI,WAAU,KAAK,SAAS,WAAU,gBAAgB;AACpD,iBAAU,KAAK,KAAK,UAAU;AAAA,IAChC,OAAO;AACL,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AACF;AA9BqB,WACK,iBAAiB;AADtB,WAEJ,OAA0B,CAAC;AAF5C,IAAqB,YAArB;;;ACAO,IAAM,QAAN,MAA6B;AAAA,EAC1B,SAAS,QAAgB,cAAsB,KAAc;AACnE,UAAM,YAAY,MAAM,mBAAmB,YAAY;AAAA,GAAM;AAAA,MAC3D,WAAW;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEM,IAAI,KAA4B;AAAA;AACpC,YAAM,OAAO,MAAM,UAAoB,cAAc;AACrD,UAAI;AACF,cAAM,KAAK,IAAI,GAAG;AAAA,MACpB,SAASA,QAAO;AACd,aAAK,SAAS,OAAO,KAAKA,MAAK;AAC/B,cAAMA;AAAA,MACR,UAAE;AACA,kBAAoB,kBAAkB,IAAI;AAAA,MAC5C;AAAA,IACF;AAAA;AAAA,EAEM,IAAO,KAAgC;AAAA;AAC3C,YAAM,OAAO,MAAM,UAAoB,cAAc;AACrD,UAAI;AACF,cAAM,OAAO,MAAM,KAAK,IAAI,GAAG;AAC/B,eAAO,OAAQ,KAAK,MAAM,IAAI,IAAU;AAAA,MAC1C,SAAS,KAAK;AACZ,aAAK,SAAS,OAAO,KAAK,KAAK;AAC/B,cAAM;AAAA,MACR,UAAE;AACA,kBAAoB,kBAAkB,IAAI;AAAA,MAC5C;AAAA,IACF;AAAA;AAAA,EAEM,IAAO,KAAa,KAAQ,MAAc,OAAsB;AAAA;AACpE,UAAI,CAAC;AAAK;AACV,YAAM,OAAO,MAAM,UAAoB,cAAc;AACrD,UAAI;AACF,cAAM,KAAK,MAAM,KAAK,KAAK,KAAK,UAAU,GAAG,CAAC;AAAA,MAChD,SAASA,QAAO;AACd,aAAK,SAAS,OAAO,KAAKA,MAAK;AAC/B,cAAMA;AAAA,MACR,UAAE;AACA,kBAAoB,kBAAkB,IAAI;AAAA,MAC5C;AAAA,IACF;AAAA;AAAA,EAEM,WAAW,SAAgC;AAAA;AAC/C,YAAM,OAAO,MAAM,UAAoB,cAAc;AACrD,UAAI;AACF,cAAM,OAAO,MAAM,KAAK,KAAK,OAAO;AACpC,YAAI,KAAK;AAAQ,gBAAM,KAAK,IAAI,IAAI;AAAA,MACtC,SAASA,QAAO;AACd,aAAK,SAAS,cAAc,SAASA,MAAK;AAC1C,cAAMA;AAAA,MACR,UAAE;AACA,kBAAoB,kBAAkB,IAAI;AAAA,MAC5C;AAAA,IACF;AAAA;AAAA,EAEM,aAAgB,SAA+B;AAAA;AACnD,YAAM,OAAO,MAAM,UAAoB,cAAc;AACrD,UAAI;AACF,YAAI,SAAiB;AACrB,cAAM,OAAO,CAAC;AACd,cAAMC,QAAO,MAAM,UAAoB,cAAc;AACrD,WAAG;AACD,gBAAM,QAAQ,MAAMA,MAAK,KAAK,QAAQ;AAAA,YACpC,OAAO;AAAA,YACP,OAAO;AAAA,UACT,CAAC;AACD,mBAAS,MAAM;AACf,eAAK,KAAK,GAAG,MAAM,IAAI;AAAA,QACzB,SAAS,WAAW;AAEpB,cAAM,SAAc,CAAC;AAErB,mBAAW,OAAO,MAAM;AACtB,gBAAM,QAAS,MAAMA,MAAK,IAAI,GAAG;AACjC,iBAAO,KAAK,KAAK;AAAA,QACnB;AAEA,kBAAoB,kBAAkBA,KAAI;AAC1C,eAAO;AAAA,MACT,SAASD,QAAO;AACd,aAAK,SAAS,gBAAgB,SAASA,MAAK;AAC5C,eAAO,CAAC;AAAA,MACV,UAAE;AACA,kBAAoB,kBAAkB,IAAI;AAAA,MAC5C;AAAA,IACF;AAAA;AACF;;;ACpFA,OAAO,YAAY;AAEZ,IAAM,YAAN,MAAoC;AAAA,EAIzC,YAAY,WAAgC;AAuQ5C,SAAQ,gBAAgB,CAAC,gBAAwB,SAAc;AAC7D,YAAM,UAAU,OACb,WAAW,KAAK,EAChB,OAAO,KAAK,UAAU,IAAI,CAAC,EAC3B,OAAO,KAAK;AACf,aAAO,GAAG,cAAc,KAAK,OAAO;AAAA,IACtC;AA5QE,SAAK,SAAS,IAAI,MAAM;AACxB,SAAK,MAAM;AAAA,EACb;AAAA,EAEM,UACJ,gBACA,MACe;AAAA;AACf,YAAM,YAAY;AAClB,YAAM,YAAY,KAAK,IAAI;AAE3B,UAAI;AACF,cAAM,QAAQ,KAAK,IAAI,MAAM;AAC7B,cAAM,SAAiC,CAAC;AAExC,aAAK,QAAQ,CAAC,SAAS;AACrB,gBAAM,KAAK,KAAK,MAAM,KAAK,IAAI,WAAW,cAAc,EAAE,IAAI,EAAE;AAChE,gBAAM,SAAS,KAAK,IAAI,WAAW,cAAc,EAAE,IAAI,EAAE;AACzD,gBAAM,IAAI,QAAQ,iCAAK,OAAL,EAAW,UAAU,UAAU,EAAC;AAClD,iBAAO,KAAK,iCAAK,OAAL,EAAW,GAAG,EAAC;AAAA,QAC7B,CAAC;AAED,cAAM,MAAM,OAAO;AAEnB,aAAK,eAAe,OAAO,MAAM,iBAAiB,cAAc,IAAI;AAAA,UAClE;AAAA,UACA;AAAA,QACF,CAAC;AAED,cAAM,KAAK,OAAO,WAAW,GAAG,cAAc,KAAK;AAAA,MACrD,SAASE,QAAO;AACd,cAAO,uBAAuB;AAAA,UAC5B;AAAA,UACA;AAAA,UACA;AAAA,UACA,OAAAA;AAAA,QACF,CAAC;AACD,cAAM,IAAI,MAAM,kDAAkD;AAAA,MACpE;AAAA,IACF;AAAA;AAAA,EAEM,KACJ,gBACA,MAC6B;AAAA;AAC7B,YAAM,YAAY;AAClB,YAAM,YAAY,KAAK,IAAI;AAC3B,UAAI;AACF,YAAI;AAEJ,YAAI,6BAAM,IAAI;AAEZ,gBAAM,KAAK,IACR,WAAW,cAAc,EACzB,IAAI,KAAK,EAAE,EACX,IAAI,iCAAK,OAAL,EAAW,UAAU,UAAU,EAAC;AACvC,kBAAQ,KAAK;AAEb,eAAK,sBAAsB,KAAK,mBAAmB,cAAc,KAAK;AAAA,YACpE;AAAA,YACA;AAAA,YACA,YAAY;AAAA,UACd,CAAC;AAAA,QACH,OAAO;AAEL,gBAAM,SAAS,MAAM,KAAK,IACvB,WAAW,cAAc,EACzB,IAAI,iCAAK,OAAL,EAAW,UAAU,UAAU,EAAC;AACvC,kBAAQ,OAAO;AAEf;AAAA,YACE,gCAAgC,KAAK,kBAAkB,cAAc;AAAA,YACrE;AAAA,cACE;AAAA,cACA;AAAA,cACA,YAAY;AAAA,YACd;AAAA,UACF;AAAA,QACF;AAEA,cAAM,KAAK,OAAO,WAAW,GAAG,cAAc,KAAK;AACnD,eAAO,iCAAK,OAAL,EAAW,IAAI,MAAM;AAAA,MAC9B,SAASA,QAAO;AACd,cAAO,0BAA0B,cAAc,IAAI;AAAA,UACjD;AAAA,UACA;AAAA,UACA;AAAA,UACA,OAAAA;AAAA,QACF,CAAC;AACD,cAAM,IAAI,MAAM,oCAAoC,cAAc,GAAG;AAAA,MACvE;AAAA,IACF;AAAA;AAAA,EAEM,QAAW,gBAAwB,IAA+B;AAAA;AACtE,YAAM,YAAoB;AAC1B,UAAI;AACF,cAAM,WAAW,KAAK,cAAc,gBAAgB,EAAE;AACtD,cAAM,YAAY,MAAM,KAAK,OAAO,IAAO,QAAQ;AAEnD,YAAI;AAAW,iBAAO;AAEtB,cAAM,SAAS,KAAK,IAAI,WAAW,cAAc,EAAE,IAAI,EAAE;AACzD,cAAM,cAAc,MAAM,OAAO,IAAI;AAErC,YAAI,YAAY,QAAQ;AACtB,gBAAM,OAAO,YAAY,KAAK;AAC9B,eAAK,OAAO,IAAO,UAAU,IAAI;AACjC,iBAAO;AAAA,QACT;AAEA,eAAO;AAAA,MACT,SAASA,QAAO;AACd,cAAO,6BAA6B,cAAc,IAAI;AAAA,UACpD;AAAA,UACA;AAAA,UACA;AAAA,UACA,OAAAA;AAAA,QACF,CAAC;AAED,cAAM,IAAI,MAAM,uCAAuC;AAAA,MACzD;AAAA,IACF;AAAA;AAAA,EAEM,UACJ,gBACA,OACA,SACsB;AAAA;AAhJ1B;AAiJI,YAAM,YAAoB;AAE1B,UAAI;AACF,YAAI,WACF,KAAK,IAAI,WAAW,cAAc;AAEpC,YAAI,+BAAO,SAAS;AAClB,qBAAW,SAAS;AAAA,YAClB,MAAM,QAAQ;AAAA,YACd,MAAM,QAAQ;AAAA,UAChB;AAAA,QACF;AAEA,6CAAO,WAAP,mBAAe,QAAQ,CAAC,UAAU;AAChC,qBAAW,SAAS;AAAA,YAClB,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAM;AAAA,UACR;AAAA,QACF;AAEA,YAAI,+BAAO,QAAQ;AACjB,cAAI,CAAC,MAAM,SAAS;AAClB,kBAAM,IAAI,MAAM,iDAAiD;AAAA,UACnE;AAEA,gBAAM,cAAc,MAAM,UAAU;AACpC,qBAAW,SAAS,WAAW,WAAW;AAAA,QAC5C;AAEA,cAAM,WAAW,KAAK,cAAc,gBAAgB,QAAQ;AAC5D,cAAM,SAAS,MAAM,KAAK,OAAO,IAAiB,QAAQ;AAE1D,YAAI,UAAU,CAAC;AAAS,iBAAO;AAE/B,cAAM,KAAK,MAAM,SAAS,MAAM,EAAE,IAAI;AACtC,cAAM,QAAQ,GAAG,KAAK,EAAE;AAExB,YAAI,+BAAO,SAAS;AAClB,qBAAW,SAAS,MAAM,MAAM,OAAO;AAAA,QACzC;AAEA,cAAM,gBAAgB,MAAM,SAAS,IAAI;AACzC,cAAM,MAAM,cAAc,KAAK,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAM;AAE3D,cAAM,UAAU,cAAc,KAAK,cAAc,KAAK,SAAS,CAAC;AAEhE,YAAI,SAAiC;AACrC,YAAI,YAAW,+BAAO,UAAS;AAC7B,mBAAS,QAAQ,IAAI,MAAM,QAAQ,KAAe;AAAA,QACpD;AAEA,cAAM,SAAsB;AAAA,UAC1B;AAAA,UACA,MAAM;AAAA,UACN;AAAA,UACA,SAAS,+BAAO;AAAA,QAClB;AAEA,YAAI,CAAC;AAAS,eAAK,OAAO,IAAI,UAAU,MAAM;AAC9C,eAAO;AAAA,MACT,SAASA,QAAO;AACd,cAAO,wBAAwB;AAAA,UAC7B;AAAA,UACA,OAAAA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AACD,cAAM,IAAI,MAAM,6CAA6C;AAAA,MAC/D;AAAA,IACF;AAAA;AAAA,EAEM,OAAU,gBAAwB,OAAmC;AAAA;AACzE,YAAM,YAAoB;AAC1B,UAAI;AACF,cAAM,aAAuB,CAAC;AAC9B,cAAM,cAAc,KAAK,IACtB,WAAW,cAAc,EACzB,MAAM,MAAM,OAAiB,MAAM,WAAW,MAAM,KAAK;AAC5D,cAAM,WAAW,MAAM,YAAY,IAAI;AACvC,cAAM,QAAQ,KAAK,IAAI,MAAM;AAE7B,iBAAS,QAAQ,CAAC,QAAQ;AACxB,gBAAM,OAAO,IAAI,GAAG;AACpB,qBAAW,KAAK,IAAI,EAAE;AAAA,QACxB,CAAC;AAED,cAAM,MAAM,OAAO;AACnB;AAAA,UACE,+BAA+B,cAAc,kBAAkB,UAAU;AAAA,UACzE,EAAE,gBAAgB,UAAU;AAAA,QAC9B;AACA,cAAM,KAAK,OAAO,WAAW,GAAG,cAAc,KAAK;AACnD,eAAO;AAAA,MACT,SAASA,QAAO;AACd,cAAO,yBAAyB;AAAA,UAC9B;AAAA,UACA;AAAA,UACA,OAAAA;AAAA,UACA;AAAA,QACF,CAAC;AACD,cAAM,IAAI,MAAM,qCAAqC;AAAA,MACvD;AAAA,IACF;AAAA;AAAA,EAEM,OACJ,gBACA,IACA,MACY;AAAA;AACZ,YAAM,YAAoB;AAC1B,UAAI;AACF,cAAM,SAAS,KAAK,IAAI,WAAW,cAAc,EAAE,IAAI,EAAE;AACzD,cAAM,OAAO,OAAO,iCAAK,OAAL,EAAW,UAAU,KAAK,IAAI,EAAE,EAAC;AACrD,aAAK,qBAAqB,EAAE,kBAAkB,cAAc,IAAI;AAAA,UAC9D;AAAA,UACA,YAAY;AAAA,UACZ;AAAA,QACF,CAAC;AACD,cAAM,KAAK,OAAO,WAAW,GAAG,cAAc,KAAK;AACnD,cAAM,MAAM,MAAM,OAAO,IAAI;AAC7B,eAAO,IAAI,KAAK;AAAA,MAClB,SAASA,QAAO;AACd,cAAO,yBAAyB;AAAA,UAC9B;AAAA,UACA,YAAY;AAAA,UACZ;AAAA,UACA;AAAA,UACA,OAAAA;AAAA,QACF,CAAC;AACD,cAAM,IAAI,MAAM,2CAA2C;AAAA,MAC7D;AAAA,IACF;AAAA;AASF;","names":["error","conn","error"]}