@aimee-blue/ab-service-kit
Version:
Aimee Blue Service Template
1 lines • 16.8 kB
Source Map (JSON)
{"version":3,"sources":["../../../src/shared/profiler/streams.ts"],"names":["timestampToTime","timestamp","since","time","process","hrtime","allHits","Subject","allMemos","allSummaries","defaultDeps","timestampDiff","createInitialState","deps","stateByTag","Map","createStateForTag","self","Object","freeze","hit","name","state","get","hitTime","next","set","memo","details","determine","value","timeSinceHit","isMatch","to","test","createSummary","MAX_MEMOS","asObservable","pipe","item","acc","memos","slice","sortedMemos","sort","max","Math","min","average","Number","isNaN","mostOfTheTimesLessThan","quantile","MAX_SAFE_INTEGER","NaN","numberOfSamples","length","cachedState","globalState","createState","attach","params","source","effectiveState","startOp","start","on","from","stopOp","stop","till","cb","transformTookTime","transformTimeTook","stream","registerStarts","paramsRaw","logger","registerStops","setMemo","timeTook","input","percentile","array","sorted","index","i","floor","logSummaries","summaries","defaultLogger","prefix","EOL","suffix","timesRegistered","summariesLogged"],"mappings":"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","sourcesContent":["import { Observable, Subject } from 'rxjs';\nimport { ignoreElements, tap, filter, scan, map } from 'rxjs/operators';\nimport { EOL } from 'os';\nimport { TagNotification, executeOnNotifications } from '../notifications';\nimport {\n Logger,\n defaultLogger,\n logEvents,\n BasicLogger,\n defaultBasicLogger,\n LogOn,\n} from '../logging';\n\ntype Timestamp = [number, number];\n\ninterface IDetails {\n [key: string]: string | number | boolean;\n}\n\ninterface ITagState {\n hitTime?: Timestamp;\n}\n\nfunction timestampToTime(timestamp: Timestamp, since?: Timestamp) {\n if (since) {\n const time = process.hrtime(since);\n return time[0] * 1e3 + time[1] / 1e6;\n } else {\n return timestamp[0] * 1e3 + timestamp[1] / 1e6;\n }\n}\n\nconst allHits = new Subject<{ name: string; timestamp: Timestamp }>();\n\nconst allMemos = new Subject<{\n name: string;\n time: number;\n details?: IDetails;\n}>();\n\nconst allSummaries = new Subject<{ name: string; summary: ISummary }>();\n\nconst defaultDeps = {\n timestamp: () => process.hrtime(),\n timestampDiff: (timestamp: Timestamp) => process.hrtime(timestamp),\n};\n\nfunction createInitialState(deps = defaultDeps): IState {\n const stateByTag = new Map<string, ITagState>();\n\n const createStateForTag = (): ITagState => {\n return {};\n };\n\n const self = Object.freeze({\n hit: (name: string) => {\n const state = stateByTag.get(name) || createStateForTag();\n\n state.hitTime = deps.timestamp();\n allHits.next({\n name,\n timestamp: state.hitTime,\n });\n\n stateByTag.set(name, state);\n },\n memo: (\n name: string,\n details?: IDetails,\n determine: (metric: number) => number = (value) => value\n ): number | null => {\n const state = stateByTag.get(name);\n if (!state || !state.hitTime) {\n return null;\n }\n\n const timeSinceHit = determine(\n timestampToTime(deps.timestampDiff(state.hitTime))\n );\n\n allMemos.next({\n name,\n time: timeSinceHit,\n ...(details && {\n details,\n }),\n });\n\n stateByTag.set(name, state);\n\n return timeSinceHit;\n },\n });\n return self;\n}\n\nfunction isMatch(name: string, to: string | RegExp) {\n return (\n (typeof to === 'string' && to === name) ||\n (typeof to === 'object' && to.test(name))\n );\n}\n\nfunction createSummary(name: string | RegExp): Observable<ISummary> {\n const MAX_MEMOS = 100;\n\n return allMemos.asObservable().pipe(\n //\n filter((item) => isMatch(item.name, name)),\n scan(\n (acc, item) => {\n const memos = [...acc.memos, item.time].slice(-MAX_MEMOS);\n const sortedMemos = [...memos];\n sortedMemos.sort();\n return {\n ...acc,\n memos,\n sortedMemos,\n max: Math.max(acc.max, item.time),\n min: Math.min(acc.min, item.time),\n average: Number.isNaN(acc.average)\n ? item.time\n : (acc.average + item.time) / 2,\n mostOfTheTimesLessThan: quantile(sortedMemos, 90),\n };\n },\n {\n sortedMemos: [] as number[],\n memos: [] as number[],\n max: 0,\n min: Number.MAX_SAFE_INTEGER,\n average: NaN,\n mostOfTheTimesLessThan: NaN,\n }\n ),\n map((item) => ({\n numberOfSamples: item.memos.length,\n max: item.max,\n min: item.min,\n average: item.average,\n mostOfTheTimesLessThan: item.mostOfTheTimesLessThan,\n }))\n );\n}\n\ninterface IState {\n hit(name: string): void;\n memo(\n name: string,\n details?: IDetails,\n transformTookTime?: (metric: number) => number\n ): number | null;\n}\n\nlet cachedState: IState | null = null;\n\nfunction globalState() {\n if (cachedState) {\n return cachedState;\n }\n\n return (cachedState = createInitialState());\n}\n\nexport function createState(deps = defaultDeps) {\n return createInitialState(deps);\n}\n\nexport function attach(params: {\n name: string;\n from: TagNotification;\n till: TagNotification;\n cb?: (value: number) => void;\n details?: IDetails;\n transformTimeTook?: (value: number) => number;\n state?: IState;\n}) {\n return <T>(source: Observable<T>) => {\n const effectiveState = params.state || createInitialState();\n\n const startOp = () =>\n start({ name: params.name, on: params.from }, effectiveState);\n\n const stopOp = () =>\n stop(\n {\n name: params.name,\n till: params.till,\n cb: params.cb,\n transformTookTime: params.transformTimeTook,\n details: params.details,\n },\n effectiveState\n );\n\n return source.pipe((stream) => {\n if (params.till === 'unsubscribe' && params.from === 'complete') {\n return stream.pipe(startOp(), stopOp());\n } else {\n return stream.pipe(stopOp(), startOp());\n }\n });\n };\n}\n\nexport function registerStarts(\n params: {\n name: string;\n on: Observable<unknown>;\n },\n state = globalState()\n) {\n const hit = () => {\n state.hit(params.name);\n };\n\n return params.on.pipe(tap(hit), ignoreElements());\n}\n\nexport function start(\n paramsRaw: {\n name: string;\n on?: TagNotification;\n logger?: BasicLogger;\n },\n state = globalState()\n) {\n const params = {\n on: 'next' as const,\n ...paramsRaw,\n };\n return <T>(stream: Observable<T>) => {\n const hit = () => {\n state.hit(params.name);\n };\n\n return stream.pipe(\n executeOnNotifications(\n [params.on],\n hit,\n params.logger ?? defaultBasicLogger()\n )\n );\n };\n}\n\nexport function registerStops(\n params: {\n name: string;\n on: Observable<unknown>;\n details?: IDetails;\n cb?: (time: number) => void;\n transformTookTime?: (time: number) => number;\n },\n state = globalState()\n) {\n const setMemo = () => {\n const timeTook = state.memo(\n params.name,\n params.details,\n params.transformTookTime\n );\n if (typeof timeTook === 'number' && params.cb) {\n params.cb(timeTook);\n }\n };\n return params.on.pipe(tap(setMemo), ignoreElements());\n}\n\nexport function stop(\n paramsRaw: {\n name: string;\n till: TagNotification;\n details?: IDetails;\n cb?: (time: number) => void;\n transformTookTime?: (time: number) => number;\n logger?: BasicLogger;\n },\n state = globalState()\n) {\n const params = paramsRaw;\n return <T>(stream: Observable<T>) => {\n const setMemo = () => {\n const timeTook = state.memo(\n params.name,\n params.details,\n params.transformTookTime\n );\n if (typeof timeTook === 'number' && params.cb) {\n params.cb(timeTook);\n }\n };\n return stream.pipe(\n executeOnNotifications(\n [params.till],\n setMemo,\n params.logger ?? defaultBasicLogger()\n )\n );\n };\n}\n\nfunction quantile(\n input: number[],\n percentile: number,\n params?: { sorted: boolean }\n) {\n const array = params && params.sorted ? input : input.slice().sort();\n\n const index = (percentile / 100) * (array.length - 1);\n const i = Math.floor(index);\n if (i === index) {\n return array[index];\n } else {\n return array[i] + (array[i + 1] - array[i]) / 2;\n }\n}\n\ninterface ISummary {\n numberOfSamples: number;\n average: number;\n mostOfTheTimesLessThan: number;\n min: number;\n max: number;\n}\n\nexport function logSummaries(params: {\n name: string;\n on?: LogOn;\n logger?: Logger;\n}) {\n const summaries = createSummary(params.name);\n const logger = params.logger ?? defaultLogger;\n\n return summaries.pipe(\n logEvents({\n prefix: `${EOL}🔃 Profiler results for [${params.name}]`,\n suffix: [EOL],\n logger,\n ...(params.on && {\n on: params.on,\n }),\n }),\n ignoreElements()\n );\n}\n\nexport function timesRegistered(name?: string | RegExp) {\n return allMemos.pipe((stream) =>\n name ? stream.pipe(filter((item) => isMatch(item.name, name))) : stream\n );\n}\n\nexport function summariesLogged(name?: string) {\n return allSummaries.pipe((stream) =>\n name ? stream.pipe(filter((item) => isMatch(item.name, name))) : stream\n );\n}\n"],"file":"streams.js"}