@interopio/gateway
Version:
[](https://www.npmjs.com/package/@interopio/gateway)
8 lines (7 loc) • 4.46 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../../src/metrics/publisher/file.ts"],
"sourcesContent": ["import * as fs from 'fs';\nimport * as path from 'path';\nimport {PublishCommand} from './types.js';\nimport {IOGateway} from '../../../gateway';\nimport {FilePublisherConfig, FileAppender} from '../../../types/metrics/publisher/file';\n\nclass JsonFileAppender implements FileAppender {\n private stream: fs.WriteStream | undefined;\n\n constructor(private readonly logger: IOGateway.Logging.Logger) {\n }\n\n async open(location: string, append: boolean = false) {\n const dir = path.dirname(location);\n await new Promise<void>((resolve, reject) => fs.mkdir(dir, {recursive: true}, (err) => {\n if (err) {\n this.logger.error(`error creating directory ${dir}`, err);\n reject(err);\n } else {\n resolve();\n }\n }));\n this.stream = fs.createWriteStream(location, {flags: append ? 'a' : 'w'});\n this.stream.on('error', (err) => {\n this.logger.warn(`write stream error. location: ${location}, append: ${append}`, err);\n });\n return this;\n }\n\n async write(msg: IOGateway.Metrics.Update) {\n await new Promise<void>((resolve, reject) => {\n if (this.stream) {\n if (this.stream.write(JSON.stringify(msg) + '\\n', (err) => {\n if (err) {\n this.logger.error(`failed to write json line in current write stream`, err);\n }\n })) {\n resolve();\n } else {\n // wait for drain\n this.stream.once('drain', () => {\n resolve();\n });\n }\n } else {\n reject(new Error(`no stream - did you call open()`));\n }\n });\n return this;\n }\n\n close() {\n if (this.stream) {\n this.stream.end();\n this.stream = undefined;\n }\n }\n}\n\nexport const name = 'file';\n\nexport function jsonFileAppender(logger: IOGateway.Logging.Logger): FileAppender {\n return new JsonFileAppender(logger);\n}\nexport function create(config: FilePublisherConfig, logger: IOGateway.Logging.Logger) {\n const appender = jsonFileAppender(logger);\n return async (msg: PublishCommand) => {\n if (msg === 'start') {\n await appender.open(config.location, config.append ?? false);\n return appender;\n } else if (msg === 'stop') {\n return (a: JsonFileAppender) => {\n a.close();\n };\n } else {\n const skip = !(config.status ?? false) && msg.status;\n if (!skip) {\n await appender.write(msg);\n }\n }\n };\n}\n"],
"mappings": "0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,YAAAE,EAAA,qBAAAC,EAAA,SAAAC,IAAA,eAAAC,EAAAL,GAAA,IAAAM,EAAoB,mBACpBC,EAAsB,qBAKhBC,EAAN,KAA+C,CAG3C,YAA6BC,EAAkC,CAAlC,YAAAA,CAC7B,CAHQ,OAKR,MAAM,KAAKC,EAAkBC,EAAkB,GAAO,CAClD,IAAMC,EAAW,UAAQF,CAAQ,EACjC,aAAM,IAAI,QAAc,CAACG,EAASC,IAAc,QAAMF,EAAK,CAAC,UAAW,EAAI,EAAIG,GAAQ,CAC/EA,GACA,KAAK,OAAO,MAAM,4BAA4BH,CAAG,GAAIG,CAAG,EACxDD,EAAOC,CAAG,GAEVF,EAAQ,CAEhB,CAAC,CAAC,EACF,KAAK,OAAY,oBAAkBH,EAAU,CAAC,MAAOC,EAAS,IAAM,GAAG,CAAC,EACxE,KAAK,OAAO,GAAG,QAAUI,GAAQ,CAC7B,KAAK,OAAO,KAAK,iCAAiCL,CAAQ,aAAaC,CAAM,GAAII,CAAG,CACxF,CAAC,EACM,IACX,CAEA,MAAM,MAAMC,EAA+B,CACvC,aAAM,IAAI,QAAc,CAACH,EAASC,IAAW,CACrC,KAAK,OACD,KAAK,OAAO,MAAM,KAAK,UAAUE,CAAG,EAAI;AAAA,EAAOD,GAAQ,CACnDA,GACA,KAAK,OAAO,MAAM,oDAAqDA,CAAG,CAElF,CAAC,EACGF,EAAQ,EAGR,KAAK,OAAO,KAAK,QAAS,IAAM,CAC5BA,EAAQ,CACZ,CAAC,EAGLC,EAAO,IAAI,MAAM,iCAAiC,CAAC,CAE3D,CAAC,EACM,IACX,CAEA,OAAQ,CACA,KAAK,SACL,KAAK,OAAO,IAAI,EAChB,KAAK,OAAS,OAEtB,CACJ,EAEaV,EAAO,OAEb,SAASD,EAAiBM,EAAgD,CAC7E,OAAO,IAAID,EAAiBC,CAAM,CACtC,CACO,SAASP,EAAOe,EAA6BR,EAAkC,CAClF,IAAMS,EAAWf,EAAiBM,CAAM,EACxC,MAAO,OAAOO,GAAwB,CAClC,GAAIA,IAAQ,QACR,aAAME,EAAS,KAAKD,EAAO,SAAUA,EAAO,QAAU,EAAK,EACpDC,EACJ,GAAIF,IAAQ,OACf,OAAQG,GAAwB,CAC5BA,EAAE,MAAM,CACZ,EAEa,EAAEF,EAAO,QAAU,KAAUD,EAAI,QAE1C,MAAME,EAAS,MAAMF,CAAG,CAGpC,CACJ",
"names": ["file_exports", "__export", "create", "jsonFileAppender", "name", "__toCommonJS", "fs", "path", "JsonFileAppender", "logger", "location", "append", "dir", "resolve", "reject", "err", "msg", "config", "appender", "a"]
}