UNPKG

6.87 kBSource Map (JSON)View Raw
1{"version":3,"file":"index.js","sources":["../src/request.js","../src/response.js","../src/protocol.js","../src/config/index.js","../src/lib/log.js","../src/app.js"],"sourcesContent":["import only from \"only\";\n\n/**\n * suppose we have a protocol\n * data start with ##, end whit ##\n *\n * # # {month} {date} {hour} {minute} {second} # #\n * 23 23 09 12 08 08 20 23 23\n */\n\nexport default class Request {\n header;\n body;\n\n constructor({ header, body }) {\n this.header = header;\n this.body = body;\n }\n\n /**\n * Return JSON representation.\n * We only bother showing settings.\n *\n * @return {Object}\n * @api public\n */\n\n toJSON() {\n return only(this, [\"header\", \"body\"]);\n }\n}\n","import only from \"only\";\n\n/**\n * for example purpose\n * we build response in string format\n * send string back to client\n * usally you should build buffer\n */\n\nexport default class Response {\n month = 0;\n date = 1;\n hour = 0;\n minute = 0;\n second = 0;\n\n constructor({ month, date, hour, minute, second }) {\n this.month = month;\n this.date = date;\n this.hour = hour;\n this.minute = minute;\n this.second = second;\n }\n\n /**\n * Return JSON representation.\n * We only bother showing settings.\n *\n * @return {Object}\n * @api public\n */\n\n toJSON() {\n return only(this, [\"month\", \"date\", \"hour\", \"minute\", \"second\"]);\n }\n}\n","/**\n * suppose we have a protocol\n * data start with ##, end whit ##\n *\n * # # {head} {month} {date} {hour} {minute} {second} # #\n * 23 23 01 09 12 08 08 20 23 23\n *\n * 23 23 01 09 12 08 08 20 23 23\n *\n * send back to client\n * hello 09-12 08:08:20\n */\n\nexport default class Protocol {\n /**\n * parse buffer to request\n *\n * @param {*} buf\n */\n parse(buf) {\n if (buf.length !== 10) {\n throw new Error(\"package length wrong\");\n }\n\n if (buf[0] !== 0x23 && buf[1] !== 0x23) {\n throw new Error(\"pcakge should start with ##\");\n }\n\n if (buf[8] !== 0x23 && buf[9] !== 0x23) {\n throw new Error(\"pcakge should end with ##\");\n }\n\n const header = {\n command: buf[2],\n };\n\n const body = {\n month: buf[3],\n date: buf[4],\n hour: buf[5],\n minute: buf[6],\n second: buf[7],\n };\n\n return { header, body };\n }\n\n /**\n * build response data\n *\n * @param {Object} body response body\n */\n build(body) {\n return `time: ${body.month}-${body.date}-${body.hour}-${body.minute}-${\n body.second\n }`;\n }\n}\n","import dotenv from \"dotenv\";\n\n/**\n * init dotenv\n * priority: environment -> .env\n *\n * Available settings\n *\n * APP_PORT=9527\n * APP_BASE_PATH=/v1\n * APP_MONGODB_CONNECTION=\"mongodb://localhost/petstore\"\n */\n\ndotenv.config();\n\n/**\n *\n * @param {string} name envrionment name\n * @param {object} opt option with { required, default }\n * @returns {*} value\n */\n\nexport function env(name, init) {\n const value = process.env[name.toUpperCase()] || process.env[name] || init;\n\n if (value === undefined) {\n throw new Error(`environment ${name} is missing`);\n }\n\n return value;\n}\n\n/**\n * basic\n */\nexport const NODE_ENV = env(\"NODE_ENV\", \"development\");\nexport const PORT = env(\"PORT\", 9527);\nexport const LOG_LEVEL = env(\"LOG_LEVEL\", \"info\");\n","import pino from \"pino\";\n\nimport { LOG_LEVEL } from \"../config\";\n\nconst logger = pino({ level: LOG_LEVEL, base: null });\n\nexport default logger;\n","import Whisper from \"@36node/whisper\";\n\nimport Request from \"./request\";\nimport Response from \"./response\";\nimport Protocol from \"./protocol\";\nimport logger from \"./lib/log\";\n\nconst app = new Whisper();\nconst protocol = new Protocol();\n\nconst log = async (ctx, next) => {\n // step 1: log start\n const startedAt = Date.now();\n\n await next();\n\n // step 4: log end\n const endAt = Date.now();\n logger.info(ctx.data);\n logger.info(\"request: \");\n logger.info(ctx.req);\n logger.info(\"response: \");\n logger.info(ctx.res);\n logger.info(\n `session ${ctx.session.id}: seq ${ctx.no} success ${endAt - startedAt} ms`\n );\n};\n\nconst handleFrame = async (ctx, next) => {\n // step 2: handle data\n const json = protocol.parse(ctx.data);\n ctx.req = new Request(json);\n\n await next();\n\n // step 3: send data\n ctx.res = new Response(json.body);\n ctx.send(protocol.build(ctx.res));\n};\n\napp.use(log);\napp.use(handleFrame);\n\napp.on(\"close\", session => {\n logger.info(`session ${session.id}: closed`);\n});\n\napp.on(\"timeout\", session => {\n logger.info(`session ${session.id}: timeout`);\n});\n\napp.on(\"end\", session => {\n logger.info(`session ${session.id}: end`);\n});\n\napp.on(\"error\", session => {\n logger.info(`session ${session.id}: error`);\n});\n\nexport default app;\n"],"names":["constructor","Response","ref","month","date","hour","minute","second","toJSON","only","this","Protocol","env","name","init","value","process","toUpperCase","undefined","Error","parse","buf","length","command","build","body","dotenv","config","NODE_ENV","PORT","LOG_LEVEL","logger","pino","level","base","app","Whisper","protocol","use","ctx","next","startedAt","Date","now","endAt","info","data","req","res","session","json","Request","send","on"],"mappings":"6KAYEA,2HCHa,IAAMC,EAOnBD,SAAYE,8DANZC,MAAQ,OACRC,KAAO,OACPC,KAAO,OACPC,OAAS,OACTC,OAAS,OAGFJ,MAAQA,OACRC,KAAOA,OACPC,KAAOA,OACPC,OAASA,OACTC,OAASA,GAWhBC,YAAAA,yBACSC,EAAKC,KAAM,CAAC,QAAS,OAAQ,OAAQ,SAAU,YCpB3C,IAAMC,eCSd,SAASC,EAAIC,EAAMC,OAClBC,EAAQC,QAAQJ,IAAIC,EAAKI,gBAAkBD,QAAQJ,IAAIC,IAASC,UAExDI,IAAVH,QACI,IAAII,qBAAqBN,wBAG1BE,cDVPK,eAAMC,MACe,KAAfA,EAAIC,aACA,IAAIH,MAAM,2BAGH,KAAXE,EAAI,IAA0B,KAAXA,EAAI,SACnB,IAAIF,MAAM,kCAGH,KAAXE,EAAI,IAA0B,KAAXA,EAAI,SACnB,IAAIF,MAAM,mCAeX,QAZQ,CACbI,QAASF,EAAI,SAGF,CACXlB,MAAOkB,EAAI,GACXjB,KAAMiB,EAAI,GACVhB,KAAMgB,EAAI,GACVf,OAAQe,EAAI,GACZd,OAAQc,EAAI,MAWhBG,YAAAA,eAAMC,kBACYA,YAAcA,WAAaA,WAAaA,aACtDA,EACD,QC1CLC,EAAOC,SAsBP,IAAaC,EAAWhB,EAAI,WAAY,eAC3BiB,EAAOjB,EAAI,OAAQ,MACnBkB,EAAYlB,EAAI,YAAa,gDCjCpCmB,EAASC,EAAK,CAAEC,MAAOH,EAAWI,KAAM,OCGxCC,EAAM,IAAIC,EACVC,EAAW,IAAI1B,EAgCrBwB,EAAIG,aA9BeC,EAAKC,WAEhBC,EAAYC,KAAKC,6BAEjBH,yBAGAI,EAAQF,KAAKC,MACnBZ,EAAOc,KAAKN,EAAIO,MAChBf,EAAOc,KAAK,aACZd,EAAOc,KAAKN,EAAIQ,KAChBhB,EAAOc,KAAK,cACZd,EAAOc,KAAKN,EAAIS,KAChBjB,EAAOc,gBACMN,EAAIU,oBAAmBV,kBAAkBK,EAAQH,iDAiBhEN,EAAIG,aAbuBC,EAAKC,WAExBU,EAAOb,EAASjB,MAAMmB,EAAIO,aAChCP,EAAIQ,IAAM,IAAII,EAAQD,mBAEhBV,qBAGND,EAAIS,IAAM,IAAI/C,EAASiD,EAAKzB,MAC5Bc,EAAIa,KAAKf,EAASb,MAAMe,EAAIS,6CAM9Bb,EAAIkB,GAAG,iBAASJ,GACdlB,EAAOc,gBAAgBI,mBAGzBd,EAAIkB,GAAG,mBAAWJ,GAChBlB,EAAOc,gBAAgBI,oBAGzBd,EAAIkB,GAAG,eAAOJ,GACZlB,EAAOc,gBAAgBI,gBAGzBd,EAAIkB,GAAG,iBAASJ,GACdlB,EAAOc,gBAAgBI"}
\No newline at end of file