@neo-one/utils
Version:
NEO•ONE shared utils.
1 lines • 14.8 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../src/CustomError.ts","../src/utils.ts","../src/finalize.ts","../src/labels.ts","../src/mergeScanLatest.ts","../src/neverComplete.ts","../src/onComplete.ts"],"sourcesContent":["// tslint:disable\n// @ts-ignore\nfunction inherits(subClass, superClass) {\n if (typeof superClass !== 'function' && superClass != null) {\n throw new TypeError('Super expression must either be null or a function');\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true,\n },\n });\n if (superClass) {\n Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : (subClass.__proto__ = superClass);\n }\n}\n\nexport let CustomError: typeof Error = (function(_super) {\n inherits(CustomError, _super);\n function CustomError() {\n // @ts-ignore\n var _newTarget = this.constructor;\n // @ts-ignore\n var _this = _super.apply(this, arguments); // 'Error' breaks prototype chain here\n _this.__proto__ = _newTarget.prototype; // restore prototype chain\n return _this;\n }\n return CustomError;\n})(Error) as any;\n","import _ from 'lodash';\n\nconst nowSeconds = (): number => Math.round(Date.now() / 1000);\n\nfunction nullthrows<T>(value: T | null | undefined): T {\n if (value == undefined) {\n throw new Error('Unexpected null');\n }\n\n return value;\n}\n\nfunction assertNever(_value: never): void {\n // do nothing\n}\n\n// tslint:disable-next-line no-any\nfunction isPromise(value: any): value is Promise<{}> {\n return value != undefined && value.then != undefined && typeof value.then === 'function';\n}\n\nfunction notNull<T>(value: T | null | undefined): value is T {\n return value != undefined;\n}\n\n// tslint:disable readonly-array\nfunction zip<T1, T2>(a: ArrayLike<T1>, b: ArrayLike<T2>): Array<[T1, T2]>;\nfunction zip<T1, T2, T3>(a: ArrayLike<T1>, b: ArrayLike<T2>, c: ArrayLike<T3>): Array<[T1, T2, T3]>;\nfunction zip<T>(...arrays: Array<ArrayLike<T> | null | undefined>): T[][] {\n // tslint:disable-next-line no-any\n return _.zip(...arrays) as any;\n}\n// tslint:enable readonly-array\n\nexport const utils = {\n nowSeconds,\n nullthrows,\n assertNever,\n notNull,\n isPromise,\n zip,\n};\n","import { Observable, Observer } from 'rxjs';\nimport { utils } from './utils';\n\n// tslint:disable-next-line no-let\nlet currentID = 0;\nconst getID = () => {\n const result = currentID;\n currentID += 1;\n\n return result;\n};\n\nexport function finalize<T>(\n func: (value: T | undefined) => Promise<void> | void,\n): (source$: Observable<T>) => Observable<T> {\n return (source$) =>\n Observable.create((observer: Observer<T>) => {\n let lastValue: T | undefined;\n const subscription = source$.subscribe({\n next: (value) => {\n lastValue = value;\n observer.next(value);\n },\n error: (error) => observer.error(error),\n complete: () => observer.complete(),\n });\n subscription.add(() => {\n const result = func(lastValue);\n if (utils.isPromise(result)) {\n const id = getID();\n let deleted = false;\n const promise = result.then(() => {\n deleted = true;\n finalize.shutdownPromises.delete(id);\n });\n if (!deleted) {\n finalize.shutdownPromises.set(id, promise);\n }\n }\n });\n\n return subscription;\n }) as Observable<T>;\n}\n\nexport namespace finalize {\n export const shutdownPromises: Map<number, Promise<void>> = new Map();\n export const wait = async () => {\n const promises = [...shutdownPromises.values()];\n if (promises.length === 0) {\n return;\n }\n\n await Promise.all(promises);\n await wait();\n };\n}\n","export enum labels {\n PLUGIN_NAME = 'plugin.name',\n RESOURCETYPE_NAME = 'resource_type.name',\n NODE_NAME = 'node.name',\n OP_CODE = 'neo.op.code',\n NEO_ADDRESS = 'neo.address',\n NODE_OPTIONSPATH = 'node.options_path',\n NEO_TRANSACTION_HASH = 'neo.transaction.hash',\n NEO_TRANSACTION_TYPE = 'neo.transaction.type',\n NEO_TRANSACTION_FOUND = 'neo.transaction.found',\n NEO_CONSENSUS_HASH = 'neo.consensus.hash',\n NEO_BLOCK_INDEX = 'neo.block.index',\n CALL_METHOD = 'call.method',\n INVOKE_METHOD = 'invoke.method',\n INVOKE_RAW_METHOD = 'invoke_raw.method',\n JSONRPC_TYPE = 'jsonrpc.type',\n COMMAND_NAME = 'command.name',\n}\n","// tslint:disable readonly-keyword no-object-mutation\nimport { Observable, ObservableInput, OperatorFunction, Subscriber, Subscription, TeardownLogic } from 'rxjs';\nimport { Operator } from 'rxjs/internal/Operator';\nimport { OuterSubscriber } from 'rxjs/internal/OuterSubscriber';\nimport { subscribeToResult } from 'rxjs/internal/util/subscribeToResult';\n\ntype LastValue<R> = { type: 'value'; value: R } | { type: 'empty' };\n// tslint:disable-next-line no-any\nconst EMPTY_LAST_VALUE: LastValue<any> = { type: 'empty' };\n\nexport class MergeScanSubscriber<T, R> extends OuterSubscriber<T, R> {\n private hasValue = false;\n private hasCompleted = false;\n private lastValue: LastValue<T> = EMPTY_LAST_VALUE;\n private active = false;\n private index = 0;\n private readonly accumulator: (acc: R | undefined, value: T) => ObservableInput<R>;\n private acc: R | undefined;\n\n public constructor(\n destination: Subscriber<R>,\n accumulator: (acc: R | undefined, value: T) => ObservableInput<R>,\n acc: R | undefined,\n ) {\n super(destination);\n this.accumulator = accumulator;\n this.acc = acc;\n }\n\n public notifyNext(_outerValue: T, innerValue: R): void {\n const { destination } = this;\n this.acc = innerValue;\n this.hasValue = true;\n if (destination.next !== undefined) {\n destination.next(innerValue);\n }\n }\n\n public notifyComplete(innerSub: Subscription): void {\n const { lastValue } = this;\n this.remove(innerSub);\n this.active = false;\n if (lastValue.type === 'value') {\n this.lastValue = EMPTY_LAST_VALUE;\n this.next(lastValue.value);\n } else if (!this.active && this.hasCompleted) {\n if (!this.hasValue && this.destination.next !== undefined) {\n this.destination.next(this.acc);\n }\n if (this.destination.complete !== undefined) {\n this.destination.complete();\n }\n }\n }\n\n protected _next(value: T): void {\n if (!this.active) {\n const { index, destination } = this;\n this.index += 1;\n try {\n const result = this.accumulator(this.acc, value);\n\n this.active = true;\n this._innerSub(result, value, index);\n } catch (error) {\n if (destination.error !== undefined) {\n destination.error(error);\n }\n }\n } else {\n this.lastValue = { type: 'value', value };\n }\n }\n\n protected _complete(): void {\n this.hasCompleted = true;\n if (!this.active && this.lastValue.type === 'empty') {\n if (!this.hasValue && this.destination.next !== undefined) {\n this.destination.next(this.acc);\n }\n if (this.destination.complete !== undefined) {\n this.destination.complete();\n }\n }\n }\n\n protected _innerSub(ish: {}, value: T, index: number): void {\n this.add(subscribeToResult(this, ish, value, index));\n }\n}\n\nexport class MergeScanOperator<T, R> implements Operator<T, R> {\n public readonly accumulator: (acc: R | undefined, value: T) => ObservableInput<R>;\n public readonly seed: R | undefined | undefined;\n public constructor(accumulator: (acc: R | undefined, value: T) => ObservableInput<R>, seed?: R) {\n this.accumulator = accumulator;\n this.seed = seed;\n }\n\n // tslint:disable-next-line\n public call(subscriber: Subscriber<R>, source: any): TeardownLogic {\n // tslint:disable-next-line\n return source.subscribe(new MergeScanSubscriber(subscriber, this.accumulator, this.seed));\n }\n}\n\nexport function mergeScanLatest<T, R>(\n accumulator: (acc: R | undefined, value: T) => ObservableInput<R>,\n seed?: R,\n): OperatorFunction<T, R> {\n return (source$: Observable<T>) =>\n (source$ as { lift: (value: Operator<T, R>) => Observable<R> }).lift(new MergeScanOperator(accumulator, seed));\n}\n","import { Observable, Observer } from 'rxjs';\n\nexport function neverComplete<T>(): (source$: Observable<T>) => Observable<T> {\n return (source$) =>\n Observable.create((observer: Observer<T>) =>\n source$.subscribe({\n next: (value) => observer.next(value),\n error: (error) => observer.error(error),\n complete: () => {\n // do nothing\n },\n }),\n ) as Observable<T>;\n}\n","import { Observable, Observer } from 'rxjs';\n\nexport function onComplete<T>(func: () => void): (source$: Observable<T>) => Observable<T> {\n return (source$) =>\n Observable.create((observer: Observer<T>) =>\n source$.subscribe({\n next: (value) => observer.next(value),\n error: (error) => observer.error(error),\n complete: () => {\n // tslint:disable-next-line no-expression-statement\n func();\n // tslint:disable-next-line no-expression-statement\n observer.complete();\n },\n }),\n ) as Observable<T>;\n}\n"],"names":["subClass","superClass","TypeError","prototype","Object","create","setPrototypeOf","__proto__","CustomError","_super","_newTarget","constructor","_this","apply","arguments","Error","nowSeconds","Math","round","Date","now","value","undefined","_value","then","arrays","_","zip","utils","currentID","getID","result","func","source$","Observable","observer","lastValue","subscription","subscribe","next","error","complete","add","isPromise","id","deleted","promise","shutdownPromises","delete","set","finalize","Map","promises","values","length","Promise","all","wait","labels","EMPTY_LAST_VALUE","OuterSubscriber","destination","accumulator","acc","_outerValue","innerValue","hasValue","innerSub","remove","active","type","hasCompleted","index","_innerSub","ish","subscribeToResult","seed","subscriber","source","MergeScanSubscriber","lift","MergeScanOperator"],"mappings":"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"}