UNPKG

13.5 kBSource Map (JSON)View Raw
1{"version":3,"file":"stagnant-honeycomb.browser.min.js","sources":["../index.mjs","../honeycomb.mjs"],"sourcesContent":["function defaultConfig(){\n\n function onevent(){}\n function onerror(){}\n function onsuccess(){}\n function onflush(){}\n \n // eslint-disable-next-line no-undef\n \n const ourConsole = {\n log(){},\n error(){},\n warn(){}\n }\n\n function generateId(){\n return Math.random().toString(15).slice(2,8)\n }\n\n return { \n onevent, onerror, onsuccess, onflush, console: ourConsole, generateId \n }\n}\n\nfunction Main(config={}){\n\n config = { ...defaultConfig(), ...config }\n\n const { generateId } = config\n\n async function dispatchEvent(event){\n await config.onevent(event)\n if( event.error ) {\n await config.onerror(event)\n } else {\n await config.onsuccess(event)\n }\n }\n\n function Event({\n parentId, id, startTime, endTime, name, data, error\n }){\n return { parentId, id, startTime, endTime, name, data, error }\n }\n\n function RootEvent(){\n const event = Event({\n parentId: null\n ,id: generateId()\n ,startTime: Date.now()\n ,endTime: Date.now()\n ,error: null\n ,data: {}\n })\n\n event.flush = async function flush(){\n delete event.flush\n event.endTime = Date.now()\n await dispatchEvent(event)\n await config.onflush(event)\n return event\n }\n\n return event\n }\n\n function setupEvent({ parentEvent, name, data, sync }){\n const event = Event({\n parentId: parentEvent.id\n ,id: generateId()\n ,name\n ,startTime: null\n ,endTime: null\n ,data: { ...parentEvent.data || {}, ...data }\n ,error: null\n ,sync: parentEvent.sync || sync\n })\n const childP = Instance(event)\n return { childP, event }\n }\n\n\n function Instance(parentEvent){\n \n function handler(...args){\n const callbackIndex = args.findIndex( x => typeof x == 'function' )\n let cb = args[callbackIndex]\n let rest = callbackIndex > 0 ? args.slice(0,callbackIndex) : args\n\n let [name, data] = rest\n \n if (typeof name != 'string') {\n data = name\n if( cb ) {\n name = data.name || cb.toString().replace( /\\s/g, '' ).replace( /(.)*=>/, '' );\n }\n }\n\n if ( data == null ) data = {}\n\n return { name, data, callback: cb }\n }\n\n function handlerData({ data }){\n parentEvent.data = { ...parentEvent.data, ...data }\n return null\n }\n\n async function handlerAsync({ event, childP, callback }){\n if ( parentEvent.sync ) {\n throw new Error('Cannot use an async trace within a synchronous trace')\n }\n \n try {\n event.startTime = Date.now()\n const out = await callback(childP)\n event.endTime = Date.now()\n return out\n } catch (e) {\n event.endTime = Date.now()\n event.error = e\n throw e\n } finally {\n dispatchEvent(event)\n .catch( e => config.console.error('Failed to dispatch event', e))\n }\n \n }\n\n function handlerSync({ callback, name, event, childP }){\n try {\n event.startTime = Date.now()\n const out = callback(childP)\n event.endTime = Date.now()\n if( out != null && 'then' in out ) {\n config.console.warn(name, 'A call to trace.sync was made but the response was async. This is likely a mistake and should be corrected.')\n }\n return out\n } catch (e) {\n event.endTime = Date.now()\n event.error = e\n throw e\n } finally {\n dispatchEvent(event)\n .catch( e => config.console.error('Failed to dispatch event', e))\n }\n }\n\n function routerOptions({ sync }, ...args){\n const { data, callback, name } = handler(...args)\n \n const {event,childP} = \n callback ? setupEvent({ parentEvent, name, data, sync }) : {}\n\n if( callback && sync ) {\n return handlerSync({ data, callback, childP, name, event })\n } else if ( callback && !sync ) {\n return handlerAsync({ data, callback, childP, name, event })\n } else {\n return handlerData({ data })\n }\n }\n\n async function routerAsync(...args){\n const out = await routerOptions({ sync: false }, ...args)\n return out\n }\n\n function routerSync(...args){\n const out = routerOptions({ sync: true }, ...args)\n return out\n }\n\n routerAsync.sync = routerSync\n return routerAsync\n }\n\n let rootEvent = RootEvent()\n let handlerInstance = Instance(rootEvent)\n handlerInstance.flush = rootEvent.flush\n handlerInstance.config = config\n return handlerInstance\n}\n\n/**\n * Safely invoke a callback even if trace is null.\n * \n * useful when there are multiple entry points into a function and some are not\n * passing in a trace.\n * \n * @param {*} trace \n * @param {...any} args \n * @returns \n */\nfunction call(trace, ...args){\n const cb = args.find( x => typeof x == 'function' )\n\n if ( trace ) {\n return trace( ...args )\n } else if ( cb ) {\n return cb( (...args) => call(null, ...args) )\n }\n return null\n}\n\nMain.call = call\n\n/**\n * Create a no-op trace if provided trace is null\n * \n * Much like stagnant.call, useful when there are multiple entry points into a function and some are not\n * passing in a trace.\n * \n * @param {*} trace \n * @param {...any} args \n * @returns \n */\nfunction ensure(trace){\n if( trace ) {\n return trace\n } else {\n return (...args) => call(null, ...args)\n }\n}\n\nMain.ensure = ensure\nexport default Main","/* globals process */\nimport stagnant from './index.mjs'\nimport fetch from 'node-fetch'\n\nexport default function Honey({ \n name: rootName='root'\n , dataset='default'\n , writeKey=process.env.HONEYCOMB_WRITE_KEY\n // pass in traceId/parentId from an existing trace\n // e.g. to continue a trace from another server, or \n // even the browser\n // otherwise leave blank\n , traceId= Math.random().toString(15).slice(2,8)\n , parentId= undefined\n , data={} \n , config={}\n}={}){\n\n // Traces aren't nested, but a trace can contain nested spans.\n // We create a root trace for every invocation of Honey\n // every other event subsequently is a span within that root trace\n const root = stagnant({\n async onevent(event){\n const name = event.parentId ? event.name : rootName\n const body = JSON.stringify({\n ...event.data\n , ...data\n , name\n , error: event.error ? event.error.message : undefined\n ,'error.stack': event.error ? event.error.stack : undefined\n , 'trace.trace_id': 'trace-'+ traceId\n , 'trace.span_id': 'span-' + event.id\n , 'trace.parent_id': event.parentId ? 'span-' + event.parentId : parentId\n , service_name: 'stagnant'\n , duration_ms: event.endTime - event.startTime\n })\n\n try {\n\n // console.log(name, event.error, event.endTime - event.startTime)\n const response = await fetch(`https://api.honeycomb.io/1/events/${dataset}`, {\n method: 'post'\n ,headers: {\n 'X-Honeycomb-Team': writeKey\n ,'X-Honeycomb-Event-Time': event.startTime\n ,'Content-Type': 'application/json'\n }\n ,body\n })\n root.config.console.log(name, response.status, body);\n if( !event.parentId ) {\n root.config.console.log('flushed', response.status )\n }\n } catch (e) {\n root.config.console.error(e)\n }\n\n }\n , ...config\n })\n\n return root\n}\n"],"names":["Main","config","onevent","onerror","onsuccess","onflush","console","[object Object]","generateId","Math","random","toString","slice","async","dispatchEvent","event","error","Event","parentId","id","startTime","endTime","name","data","Instance","parentEvent","routerOptions","sync","args","callback","callbackIndex","findIndex","x","cb","rest","replace","handler","childP","setupEvent","Date","now","out","warn","e","catch","handlerSync","Error","handlerAsync","handlerData","routerAsync","rootEvent","flush","RootEvent","handlerInstance","call","trace","find","ensure","rootName","dataset","writeKey","process","env","HONEYCOMB_WRITE_KEY","traceId","root","stagnant","body","JSON","stringify","message","undefined","error.stack","stack","trace.trace_id","trace.span_id","trace.parent_id","service_name","duration_ms","response","fetch","method","headers","X-Honeycomb-Team","X-Honeycomb-Event-Time","Content-Type","log","status"],"mappings":"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"}
\No newline at end of file