UNPKG

@aimee-blue/ab-service-kit

Version:
1 lines 3.08 kB
{"version":3,"sources":["../../../src/shared/sockets/actionStreamFromSocket.ts"],"names":["defaultActionSchemaByType","type","schema","Channels","actionSchemaByType","fullSchema","partialMessageSchema","actionStreamFromSocket","data","logger","defaultLogger","pipe","isString","nonParsed","value","EMPTY","error","result","validate"],"mappings":";;;;;;;AACA;;AACA;;AACA;;AAEA;;AACA;;AAEA,SAASA,yBAAT,CAAmCC,IAAnC,EAA0E;AACxE,QAAMC,MAAM,GAAGC,sBAASC,kBAAT,CAA4BH,IAA5B,CAAf;;AACA,MAAI,CAACC,MAAL,EAAa;AACX,WAAO,IAAP;AACD;;AAED,QAAMG,UAAU,GAAGF,sBAASG,oBAAT,CAA8BJ,MAA9B,CAAnB;;AAEA,SAAOG,UAAP;AACD;;AAEM,MAAME,sBAAsB,GAAG,CAGpCC,IAHoC,EAIpCJ,kBAAkB,GAAGJ,yBAJe,EAKpCS,MAAc,GAAGC,sBALmB,KAMjC;AACH,SAAOF,IAAI,CAACG,IAAL,CACL,uBAAOC,iBAAP,CADK,EAEL,yBAAUC,SAAD,IAAe;AACtB,UAAMC,KAAK,GAAG,uBAAYD,SAAZ,EAAuBJ,MAAvB,CAAd;;AACA,QAAIK,KAAK,KAAK,IAAd,EAAoB;AAClB,aAAOC,WAAP;AACD;;AAED,QAAI,OAAOD,KAAP,KAAiB,QAAjB,IAA6B,EAAE,UAAUA,KAAZ,CAAjC,EAAqD;AACnDL,MAAAA,MAAM,CAACO,KAAP,CAAa,0CAAb;AACA,aAAOD,WAAP;AACD;;AAED,UAAMb,MAAM,GAAGE,kBAAkB,CAACU,KAAK,CAACb,IAAP,CAAjC;;AACA,QAAI,CAACC,MAAL,EAAa;AACXO,MAAAA,MAAM,CAACO,KAAP,CAAa,8BAAb,EAA6CF,KAAK,CAACb,IAAnD;AACA,aAAOc,WAAP;AACD;;AAED,UAAME,MAAM,GAAGf,MAAM,CAACgB,QAAP,CAAgBJ,KAAhB,CAAf;;AACA,QAAIG,MAAM,CAACD,KAAX,EAAkB;AAChBP,MAAAA,MAAM,CAACO,KAAP,CAAa,6BAAb,EAA4CF,KAAK,CAACb,IAAlD,EAAwDgB,MAAM,CAACD,KAA/D;AACA,aAAOD,WAAP;AACD;;AAED,WAAO,cAAGE,MAAM,CAACH,KAAV,CAAP;AACD,GAxBD,CAFK,CAAP;AA4BD,CAnCM","sourcesContent":["import WebSocket from 'ws';\nimport { Observable, EMPTY, of } from 'rxjs';\nimport { filter, mergeMap } from 'rxjs/operators';\nimport { Channels } from '@aimee-blue/ab-contracts';\nimport * as Joi from 'joi';\nimport { isString, tryParse } from './helpers';\nimport { Logger, defaultLogger } from '../logging';\n\nfunction defaultActionSchemaByType(type: string): Joi.ObjectSchema | null {\n const schema = Channels.actionSchemaByType(type);\n if (!schema) {\n return null;\n }\n\n const fullSchema = Channels.partialMessageSchema(schema);\n\n return fullSchema;\n}\n\nexport const actionStreamFromSocket = <\n T extends { type: string; payload: unknown }\n>(\n data: Observable<WebSocket.Data>,\n actionSchemaByType = defaultActionSchemaByType,\n logger: Logger = defaultLogger\n) => {\n return data.pipe(\n filter(isString),\n mergeMap((nonParsed) => {\n const value = tryParse<T>(nonParsed, logger);\n if (value === null) {\n return EMPTY;\n }\n\n if (typeof value !== 'object' || !('type' in value)) {\n logger.error('💥 No type property in incoming message');\n return EMPTY;\n }\n\n const schema = actionSchemaByType(value.type);\n if (!schema) {\n logger.error('💥 No schema found for type', value.type);\n return EMPTY;\n }\n\n const result = schema.validate(value);\n if (result.error) {\n logger.error('💥 Invalid message of type', value.type, result.error);\n return EMPTY;\n }\n\n return of(result.value as T);\n })\n );\n};\n"],"file":"actionStreamFromSocket.js"}