Comparing version 3.1.4-9f3b4a9.0 to 3.1.4-a5ccae5.0
@@ -15,2 +15,3 @@ import * as Logger from 'bunyan'; | ||
protected log: Logger; | ||
protected initialized: boolean; | ||
private deferredEffects; | ||
@@ -32,2 +33,6 @@ private handlerVersionMap; | ||
/** | ||
* Performs all required initialization for the handler. | ||
*/ | ||
initialize(): Promise<void>; | ||
/** | ||
* Updates the `lastProcessedBlockNumber` and `lastProcessedBlockHash` meta state, coinciding with the block | ||
@@ -51,2 +56,6 @@ * that has just been processed. These are the same values read by `updateIndexState()`. | ||
/** | ||
* Idempotently performs any required setup. | ||
*/ | ||
protected abstract setup(): Promise<void>; | ||
/** | ||
* This method is used when matching the types of incoming actions against the types the `Updater`s and `Effect`s are | ||
@@ -83,2 +92,3 @@ * subscribed to. When this returns true, their corresponding functions will run. | ||
protected handleActions(state: any, context: any, nextBlock: NextBlock, isReplay: boolean): Promise<void>; | ||
private handleRollback; | ||
private range; | ||
@@ -88,2 +98,3 @@ private runOrDeferEffect; | ||
private getNextDeferredBlockNumber; | ||
private rollbackDeferredEffects; | ||
private initHandlerVersions; | ||
@@ -90,0 +101,0 @@ private refreshIndexState; |
@@ -36,2 +36,3 @@ "use strict"; | ||
this.handlerVersionName = 'v1'; | ||
this.initialized = false; | ||
this.deferredEffects = {}; | ||
@@ -50,12 +51,7 @@ this.handlerVersionMap = {}; | ||
const { isRollback, isEarliestBlock } = blockMeta; | ||
if (isRollback || (isReplay && isEarliestBlock)) { | ||
const rollbackBlockNumber = blockInfo.blockNumber - 1; | ||
const rollbackCount = this.lastProcessedBlockNumber - rollbackBlockNumber; | ||
this.log.info(`Rolling back ${rollbackCount} blocks to block ${rollbackBlockNumber}...`); | ||
yield this.rollbackTo(rollbackBlockNumber); | ||
yield this.refreshIndexState(); | ||
if (!this.initialized) { | ||
yield this.initialize(); | ||
this.initialized = true; | ||
} | ||
else if (this.lastProcessedBlockNumber === 0 && this.lastProcessedBlockHash === '') { | ||
yield this.refreshIndexState(); | ||
} | ||
yield this.handleRollback(isRollback, blockInfo.blockNumber, isReplay, isEarliestBlock); | ||
const nextBlockNeeded = this.lastProcessedBlockNumber + 1; | ||
@@ -100,2 +96,10 @@ // Just processed this block; skip | ||
/** | ||
* Performs all required initialization for the handler. | ||
*/ | ||
initialize() { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
yield this.setup(); | ||
}); | ||
} | ||
/** | ||
* This method is used when matching the types of incoming actions against the types the `Updater`s and `Effect`s are | ||
@@ -179,2 +183,17 @@ * subscribed to. When this returns true, their corresponding functions will run. | ||
} | ||
handleRollback(isRollback, blockNumber, isReplay, isEarliestBlock) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
if (isRollback || (isReplay && isEarliestBlock)) { | ||
const rollbackBlockNumber = blockNumber - 1; | ||
const rollbackCount = this.lastProcessedBlockNumber - rollbackBlockNumber; | ||
this.log.info(`Rolling back ${rollbackCount} blocks to block ${rollbackBlockNumber}...`); | ||
yield this.rollbackTo(rollbackBlockNumber); | ||
this.rollbackDeferredEffects(blockNumber); | ||
yield this.refreshIndexState(); | ||
} | ||
else if (this.lastProcessedBlockNumber === 0 && this.lastProcessedBlockHash === '') { | ||
yield this.refreshIndexState(); | ||
} | ||
}); | ||
} | ||
range(start, end) { | ||
@@ -185,2 +204,3 @@ return Array(end - start).fill(0).map((_, i) => i + start); | ||
const { block, lastIrreversibleBlockNumber } = nextBlock; | ||
const { blockNumber } = block.blockInfo; | ||
const shouldRunImmediately = (!effect.deferUntilIrreversible || block.blockInfo.blockNumber <= lastIrreversibleBlockNumber); | ||
@@ -190,7 +210,7 @@ if (shouldRunImmediately) { | ||
} | ||
else if (!this.deferredEffects[block.blockInfo.blockNumber]) { | ||
this.deferredEffects[block.blockInfo.blockNumber] = [() => effect.run(payload, block, context)]; | ||
} | ||
else { | ||
this.deferredEffects[block.blockInfo.blockNumber].push(() => effect.run(payload, block, context)); | ||
if (!this.deferredEffects[blockNumber]) { | ||
this.deferredEffects[blockNumber] = []; | ||
} | ||
this.deferredEffects[blockNumber].push(() => effect.run(payload, block, context)); | ||
} | ||
@@ -205,3 +225,4 @@ } | ||
if (this.deferredEffects[blockNumber]) { | ||
for (const deferredEffect of this.deferredEffects[blockNumber]) { | ||
const effects = this.deferredEffects[blockNumber]; | ||
for (const deferredEffect of effects) { | ||
deferredEffect(); | ||
@@ -220,2 +241,9 @@ } | ||
} | ||
rollbackDeferredEffects(rollbackTo) { | ||
const blockNumbers = Object.keys(this.deferredEffects).map((num) => parseInt(num, 10)); | ||
const toRollBack = blockNumbers.filter((bn) => bn >= rollbackTo); | ||
for (const blockNumber of toRollBack) { | ||
delete this.deferredEffects[blockNumber]; | ||
} | ||
} | ||
initHandlerVersions(handlerVersions) { | ||
@@ -222,0 +250,0 @@ if (handlerVersions.length === 0) { |
@@ -15,3 +15,3 @@ import * as Logger from 'bunyan'; | ||
protected log: Logger; | ||
private initialized; | ||
protected initialized: boolean; | ||
constructor(options?: ActionReaderOptions); | ||
@@ -41,2 +41,6 @@ /** | ||
/** | ||
* Performs all required initialization for the reader. | ||
*/ | ||
initialize(): Promise<void>; | ||
/** | ||
* Changes the state of the `AbstractActionReader` instance to have just processed the block at the given block | ||
@@ -54,2 +58,6 @@ * number. If the block exists in its temporary block history, it will use this, otherwise it will fetch the block | ||
/** | ||
* Idempotently performs any required setup. | ||
*/ | ||
protected abstract setup(): Promise<void>; | ||
/** | ||
* Incrementally rolls back reader state one block at a time, comparing the blockHistory with | ||
@@ -56,0 +64,0 @@ * newly fetched blocks. Fork resolution is finished when either the current block's previous hash |
@@ -59,6 +59,5 @@ "use strict"; | ||
}; | ||
// TODO: Should this only be called when updating headBlockNumber? | ||
this.lastIrreversibleBlockNumber = yield this.getLastIrreversibleBlockNumber(); | ||
if (!this.initialized) { | ||
yield this.initBlockState(); | ||
yield this.initialize(); | ||
} | ||
@@ -96,2 +95,12 @@ if (this.currentBlockNumber === this.headBlockNumber) { | ||
/** | ||
* Performs all required initialization for the reader. | ||
*/ | ||
initialize() { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
yield this.setup(); | ||
yield this.initBlockState(); | ||
this.initialized = true; | ||
}); | ||
} | ||
/** | ||
* Changes the state of the `AbstractActionReader` instance to have just processed the block at the given block | ||
@@ -164,2 +173,3 @@ * number. If the block exists in its temporary block history, it will use this, otherwise it will fetch the block | ||
return __awaiter(this, void 0, void 0, function* () { | ||
this.lastIrreversibleBlockNumber = yield this.getLastIrreversibleBlockNumber(); | ||
this.headBlockNumber = yield this.getLatestNeededBlockNumber(); | ||
@@ -171,3 +181,2 @@ if (this.currentBlockNumber < 0) { | ||
yield this.reloadHistory(); | ||
this.initialized = true; | ||
}); | ||
@@ -174,0 +183,0 @@ } |
@@ -22,2 +22,3 @@ import * as Logger from 'bunyan'; | ||
private error; | ||
private clean; | ||
constructor(actionReader: AbstractActionReader, actionHandler: AbstractActionHandler, pollInterval: number); | ||
@@ -52,2 +53,3 @@ /** | ||
protected checkForBlocks(isReplay?: boolean): Promise<void>; | ||
private readonly status; | ||
} |
@@ -19,2 +19,3 @@ "use strict"; | ||
const Logger = __importStar(require("bunyan")); | ||
const interfaces_1 = require("./interfaces"); | ||
/** | ||
@@ -32,2 +33,3 @@ * Coordinates implementations of `AbstractActionReader`s and `AbstractActionHandler`s in | ||
this.error = null; | ||
this.clean = true; | ||
this.log = Logger.createLogger({ name: 'demux' }); | ||
@@ -56,2 +58,3 @@ } | ||
} | ||
this.clean = false; | ||
this.running = true; | ||
@@ -89,2 +92,3 @@ this.error = null; | ||
this.log.info('Starting indexing.'); | ||
// tslint:disable-next-line:no-floating-promises | ||
this.watch(); | ||
@@ -109,16 +113,6 @@ return true; | ||
get info() { | ||
let status; | ||
if (this.running && !this.shouldPause) { | ||
status = 'indexing'; | ||
} | ||
else if (this.running && this.shouldPause) { | ||
status = 'pausing'; | ||
} | ||
else { | ||
status = 'paused'; | ||
} | ||
const info = { | ||
handler: this.actionHandler.info, | ||
reader: this.actionReader.info, | ||
status, | ||
indexingStatus: this.status, | ||
}; | ||
@@ -154,3 +148,18 @@ if (this.error) { | ||
} | ||
get status() { | ||
if (this.clean) { | ||
return interfaces_1.IndexingStatus.Initial; | ||
} | ||
if (this.running && !this.shouldPause) { | ||
return interfaces_1.IndexingStatus.Indexing; | ||
} | ||
if (this.running && this.shouldPause) { | ||
return interfaces_1.IndexingStatus.Pausing; | ||
} | ||
if (this.error) { | ||
return interfaces_1.IndexingStatus.Stopped; | ||
} | ||
return interfaces_1.IndexingStatus.Paused; | ||
} | ||
} | ||
exports.BaseActionWatcher = BaseActionWatcher; |
@@ -22,1 +22,9 @@ export declare class MismatchedBlockHashError extends Error { | ||
} | ||
declare class RethrownError extends Error { | ||
constructor(message: string, error?: Error); | ||
private extendStack; | ||
} | ||
export declare class NotInitializedError extends RethrownError { | ||
constructor(message?: string, error?: Error); | ||
} | ||
export {}; |
@@ -55,1 +55,32 @@ "use strict"; | ||
exports.UnresolvedForkError = UnresolvedForkError; | ||
// Adapted from https://stackoverflow.com/a/42755876 | ||
class RethrownError extends Error { | ||
constructor(message, error) { | ||
super(message); | ||
this.name = this.constructor.name; | ||
this.message = message; | ||
if (typeof Error.captureStackTrace === 'function') { | ||
Error.captureStackTrace(this, this.constructor); | ||
} | ||
else { | ||
this.stack = (new Error(message)).stack; | ||
} | ||
if (error) { | ||
this.extendStack(error); | ||
} | ||
Object.setPrototypeOf(this, RethrownError.prototype); | ||
} | ||
extendStack(error) { | ||
const messageLines = (this.message.match(/\n/g) || []).length + 1; | ||
if (this.stack) { | ||
this.stack = this.stack.split('\n').slice(0, messageLines + 1).join('\n') + '\n' + error.stack; | ||
} | ||
} | ||
} | ||
class NotInitializedError extends RethrownError { | ||
constructor(message, error) { | ||
super(`The proper initialization has not occurred. ${message}`, error); | ||
Object.setPrototypeOf(this, NotInitializedError.prototype); | ||
} | ||
} | ||
exports.NotInitializedError = NotInitializedError; |
@@ -1,2 +0,1 @@ | ||
export { Action, Block, BlockInfo, Effect, HandlerVersion, IndexState, Updater } from './interfaces'; | ||
export { AbstractActionHandler } from './AbstractActionHandler'; | ||
@@ -6,1 +5,3 @@ export { AbstractActionReader } from './AbstractActionReader'; | ||
export { ExpressActionWatcher } from './ExpressActionWatcher'; | ||
export * from './interfaces'; | ||
export * from './errors'; |
"use strict"; | ||
function __export(m) { | ||
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; | ||
} | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
@@ -11,1 +14,3 @@ var AbstractActionHandler_1 = require("./AbstractActionHandler"); | ||
exports.ExpressActionWatcher = ExpressActionWatcher_1.ExpressActionWatcher; | ||
__export(require("./interfaces")); | ||
__export(require("./errors")); |
@@ -15,7 +15,2 @@ export interface ActionReaderOptions { | ||
onlyIrreversible?: boolean; | ||
/** | ||
* This determines how many blocks in the past are cached. This is used for determining | ||
* block validity during both normal operation and when rolling back. | ||
*/ | ||
maxHistoryLength?: number; | ||
} | ||
@@ -91,4 +86,11 @@ export interface Block { | ||
} | ||
export declare enum IndexingStatus { | ||
Initial = "initial", | ||
Indexing = "indexing", | ||
Pausing = "pausing", | ||
Paused = "paused", | ||
Stopped = "stopped" | ||
} | ||
export interface DemuxInfo { | ||
status: string; | ||
indexingStatus: IndexingStatus; | ||
error?: Error; | ||
@@ -95,0 +97,0 @@ handler: HandlerInfo; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
var IndexingStatus; | ||
(function (IndexingStatus) { | ||
IndexingStatus["Initial"] = "initial"; | ||
IndexingStatus["Indexing"] = "indexing"; | ||
IndexingStatus["Pausing"] = "pausing"; | ||
IndexingStatus["Paused"] = "paused"; | ||
IndexingStatus["Stopped"] = "stopped"; | ||
})(IndexingStatus = exports.IndexingStatus || (exports.IndexingStatus = {})); |
{ | ||
"name": "demux", | ||
"version": "3.1.4-9f3b4a9.0", | ||
"version": "3.1.4-a5ccae5.0", | ||
"author": { | ||
@@ -14,7 +14,9 @@ "name": "Julien Heller", | ||
"devDependencies": { | ||
"@blockone/tslint-config-blockone": "^1.0.0", | ||
"@blockone/tslint-config-blockone": "^2.0.0", | ||
"@types/bunyan": "^1.8.5", | ||
"@types/express": "^4.16.0", | ||
"@types/jest": "^23.1.4", | ||
"@types/node": "^10.5.1", | ||
"@types/request-promise-native": "^1.0.15", | ||
"@types/supertest": "^2.0.7", | ||
"eslint": "^4.9.0", | ||
@@ -36,6 +38,6 @@ "eslint-config-airbnb-base": "12.1.0", | ||
"watch": "tsc -w", | ||
"example": "./run-example.sh", | ||
"example": "./scripts/run-example.sh", | ||
"lint": "tslint -c tslint.json -p tsconfig.json", | ||
"test": "jest --detectOpenHandles --maxWorkers=2", | ||
"build-docs": "./build-docs.sh", | ||
"build-docs": "./scripts/build-docs.sh", | ||
"current-version": "echo $npm_package_version" | ||
@@ -61,7 +63,5 @@ }, | ||
"dependencies": { | ||
"@types/express": "^4.16.0", | ||
"@types/supertest": "^2.0.7", | ||
"bunyan": "^1.8.12", | ||
"express": "^4.16.4" | ||
"bunyan": "1.8.12", | ||
"express": "4.16.4" | ||
} | ||
} |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
2
1305
0
64546
18
17
+ Addedbody-parser@1.18.3(transitive)
+ Addedbunyan@1.8.12(transitive)
+ Addedbytes@3.0.0(transitive)
+ Addedcontent-disposition@0.5.2(transitive)
+ Addedcookie@0.3.1(transitive)
+ Addeddepd@1.1.2(transitive)
+ Addeddestroy@1.0.4(transitive)
+ Addedexpress@4.16.4(transitive)
+ Addedfinalhandler@1.1.1(transitive)
+ Addedhttp-errors@1.6.3(transitive)
+ Addediconv-lite@0.4.23(transitive)
+ Addedinherits@2.0.3(transitive)
+ Addedmerge-descriptors@1.0.1(transitive)
+ Addedmime@1.4.1(transitive)
+ Addedon-finished@2.3.0(transitive)
+ Addedpath-to-regexp@0.1.7(transitive)
+ Addedqs@6.5.2(transitive)
+ Addedraw-body@2.3.3(transitive)
+ Addedsafe-buffer@5.1.2(transitive)
+ Addedsend@0.16.2(transitive)
+ Addedserve-static@1.13.2(transitive)
+ Addedsetprototypeof@1.1.0(transitive)
+ Addedstatuses@1.4.0(transitive)
- Removed@types/express@^4.16.0
- Removed@types/supertest@^2.0.7
- Removed@types/body-parser@1.19.5(transitive)
- Removed@types/connect@3.4.38(transitive)
- Removed@types/cookiejar@2.1.5(transitive)
- Removed@types/express@4.17.21(transitive)
- Removed@types/express-serve-static-core@4.19.6(transitive)
- Removed@types/http-errors@2.0.4(transitive)
- Removed@types/methods@1.1.4(transitive)
- Removed@types/mime@1.3.5(transitive)
- Removed@types/node@22.9.3(transitive)
- Removed@types/qs@6.9.17(transitive)
- Removed@types/range-parser@1.2.7(transitive)
- Removed@types/send@0.17.4(transitive)
- Removed@types/serve-static@1.15.7(transitive)
- Removed@types/superagent@8.1.9(transitive)
- Removed@types/supertest@2.0.16(transitive)
- Removedasynckit@0.4.0(transitive)
- Removedbody-parser@1.20.3(transitive)
- Removedbunyan@1.8.15(transitive)
- Removedbytes@3.1.2(transitive)
- Removedcall-bind@1.0.7(transitive)
- Removedcombined-stream@1.0.8(transitive)
- Removedcontent-disposition@0.5.4(transitive)
- Removedcookie@0.7.1(transitive)
- Removeddefine-data-property@1.1.4(transitive)
- Removeddelayed-stream@1.0.0(transitive)
- Removeddepd@2.0.0(transitive)
- Removeddestroy@1.2.0(transitive)
- Removedencodeurl@2.0.0(transitive)
- Removedes-define-property@1.0.0(transitive)
- Removedes-errors@1.3.0(transitive)
- Removedexpress@4.21.1(transitive)
- Removedfinalhandler@1.3.1(transitive)
- Removedform-data@4.0.1(transitive)
- Removedfunction-bind@1.1.2(transitive)
- Removedget-intrinsic@1.2.4(transitive)
- Removedgopd@1.0.1(transitive)
- Removedhas-property-descriptors@1.0.2(transitive)
- Removedhas-proto@1.0.3(transitive)
- Removedhas-symbols@1.0.3(transitive)
- Removedhasown@2.0.2(transitive)
- Removedhttp-errors@2.0.0(transitive)
- Removediconv-lite@0.4.24(transitive)
- Removedinherits@2.0.4(transitive)
- Removedmerge-descriptors@1.0.3(transitive)
- Removedmime@1.6.0(transitive)
- Removedms@2.1.3(transitive)
- Removedobject-inspect@1.13.3(transitive)
- Removedon-finished@2.4.1(transitive)
- Removedpath-to-regexp@0.1.10(transitive)
- Removedqs@6.13.0(transitive)
- Removedraw-body@2.5.2(transitive)
- Removedsafe-buffer@5.2.1(transitive)
- Removedsend@0.19.0(transitive)
- Removedserve-static@1.16.2(transitive)
- Removedset-function-length@1.2.2(transitive)
- Removedsetprototypeof@1.2.0(transitive)
- Removedside-channel@1.0.6(transitive)
- Removedstatuses@2.0.1(transitive)
- Removedtoidentifier@1.0.1(transitive)
- Removedundici-types@6.19.8(transitive)
Updatedbunyan@1.8.12
Updatedexpress@4.16.4