@hiveio/dhive 1.3.4 → 1.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dhive.d.ts +17 -0
- package/dist/dhive.js +3 -3
- package/dist/dhive.js.gz +0 -0
- package/dist/dhive.js.map +1 -1
- package/lib/health-tracker.d.ts +17 -0
- package/lib/health-tracker.js +29 -1
- package/lib/utils.js +43 -13
- package/lib/version.js +1 -1
- package/package.json +1 -1
package/dist/dhive.d.ts
CHANGED
|
@@ -44,6 +44,12 @@ declare module 'dhive/health-tracker' {
|
|
|
44
44
|
* Default: 2 minutes.
|
|
45
45
|
*/
|
|
46
46
|
headBlockTtlMs?: number;
|
|
47
|
+
/**
|
|
48
|
+
* Default duration (ms) to skip a node after receiving a 429 response,
|
|
49
|
+
* used when the server doesn't provide a Retry-After header.
|
|
50
|
+
* Default: 10 seconds.
|
|
51
|
+
*/
|
|
52
|
+
defaultRateLimitMs?: number;
|
|
47
53
|
}
|
|
48
54
|
export class NodeHealthTracker {
|
|
49
55
|
private health;
|
|
@@ -55,6 +61,7 @@ declare module 'dhive/health-tracker' {
|
|
|
55
61
|
private readonly maxApiFailuresBeforeCooldown;
|
|
56
62
|
private readonly staleBlockThreshold;
|
|
57
63
|
private readonly headBlockTtlMs;
|
|
64
|
+
private readonly defaultRateLimitMs;
|
|
58
65
|
constructor(options?: HealthTrackerOptions);
|
|
59
66
|
private getOrCreate;
|
|
60
67
|
/**
|
|
@@ -67,6 +74,16 @@ declare module 'dhive/health-tracker' {
|
|
|
67
74
|
* Increments both the global consecutive failure counter and the API-specific counter.
|
|
68
75
|
*/
|
|
69
76
|
recordFailure(node: string, api: string): void;
|
|
77
|
+
/**
|
|
78
|
+
* Record that a node returned HTTP 429 (Too Many Requests).
|
|
79
|
+
* The node will be skipped until the rate limit expires.
|
|
80
|
+
* @param retryAfterSeconds Value from the Retry-After header, or undefined to use default.
|
|
81
|
+
*/
|
|
82
|
+
recordRateLimit(node: string, retryAfterSeconds?: number): void;
|
|
83
|
+
/**
|
|
84
|
+
* Check if a node is currently rate-limited (429 cooldown active).
|
|
85
|
+
*/
|
|
86
|
+
isRateLimited(node: string): boolean;
|
|
70
87
|
/**
|
|
71
88
|
* Record an API/plugin-specific failure (e.g. "method not found", "plugin not enabled").
|
|
72
89
|
* Only increments the per-API counter, NOT the global consecutive failure counter.
|
package/dist/dhive.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
!function(f){"object"==typeof exports&&"undefined"!=typeof module?module.exports=f():"function"==typeof define&&define.amd?define([],f):("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).dhive=f()}((function(){var define,module,exports;return function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,(function(r){return o(e[i][1][r]||r)}),p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}({"/Users/f/pjs/dhive/lib/version.js":[function(_dereq_,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default="1.3.
|
|
1
|
+
!function(f){"object"==typeof exports&&"undefined"!=typeof module?module.exports=f():"function"==typeof define&&define.amd?define([],f):("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).dhive=f()}((function(){var define,module,exports;return function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,(function(r){return o(e[i][1][r]||r)}),p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}({"/Users/f/pjs/dhive/lib/version.js":[function(_dereq_,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default="1.3.6"},{}],"/Users/f/pjs/dhive/node_modules/@ecency/bytebuffer/dist/bytebuffer-node.js":[function(_dereq_,module,exports){
|
|
2
2
|
/**
|
|
3
3
|
* @license bytebuffer.js (c) 2015 Daniel Wirtz <dcode@dcode.io>
|
|
4
4
|
* Backing buffer / Accessor: node Buffer
|
|
@@ -216,7 +216,7 @@ object-assign
|
|
|
216
216
|
* Nodes that fail for specific APIs are deprioritized for those APIs while
|
|
217
217
|
* remaining available for others. Stale nodes (behind on head block) are
|
|
218
218
|
* also deprioritized.
|
|
219
|
-
*/Object.defineProperty(exports,"__esModule",{value:!0}),exports.NodeHealthTracker=class{constructor(options={}){var _a,_b,_c,_d,_e,_f;this.health=new Map,this.bestKnownHeadBlock=0,this.bestKnownHeadBlockTime=0,this.nodeCooldownMs=null!==(_a=options.nodeCooldownMs)&&void 0!==_a?_a:3e4,this.apiCooldownMs=null!==(_b=options.apiCooldownMs)&&void 0!==_b?_b:6e4,this.maxFailuresBeforeCooldown=null!==(_c=options.maxFailuresBeforeCooldown)&&void 0!==_c?_c:3,this.maxApiFailuresBeforeCooldown=null!==(_d=options.maxApiFailuresBeforeCooldown)&&void 0!==_d?_d:2,this.staleBlockThreshold=null!==(_e=options.staleBlockThreshold)&&void 0!==_e?_e:30,this.headBlockTtlMs=null!==(_f=options.headBlockTtlMs)&&void 0!==_f?_f:12e4}getOrCreate(node){let state=this.health.get(node);return state||(state={apiFailures:new Map,consecutiveFailures:0,lastFailure:0,headBlock:0,headBlockUpdatedAt:0},this.health.set(node,state)),state}recordSuccess(node,api){const state=this.getOrCreate(node);state.consecutiveFailures=0,state.apiFailures.delete(api)}recordFailure(node,api){const state=this.getOrCreate(node);state.consecutiveFailures++,state.lastFailure=Date.now(),this.incrementApiFailure(state,api)}recordApiFailure(node,api){const state=this.getOrCreate(node);this.incrementApiFailure(state,api)}incrementApiFailure(state,api){const apiState=state.apiFailures.get(api)||{count:0,lastFailure:0};apiState.count++,apiState.lastFailure=Date.now(),state.apiFailures.set(api,apiState)}updateHeadBlock(node,headBlock){if(!headBlock||headBlock<=0)return;const state=this.getOrCreate(node);state.headBlock=headBlock,state.headBlockUpdatedAt=Date.now(),headBlock>this.bestKnownHeadBlock&&(this.bestKnownHeadBlock=headBlock,this.bestKnownHeadBlockTime=Date.now())}isNodeHealthy(node,api){const state=this.health.get(node);if(!state)return!0;const now=Date.now();if(state.consecutiveFailures>=this.maxFailuresBeforeCooldown&&now-state.lastFailure<this.nodeCooldownMs)return!1;if(api){const apiState=state.apiFailures.get(api);if(apiState&&apiState.count>=this.maxApiFailuresBeforeCooldown&&now-apiState.lastFailure<this.apiCooldownMs)return!1}return!(state.headBlock>0&&this.bestKnownHeadBlock>0&&now-state.headBlockUpdatedAt<this.headBlockTtlMs&&now-this.bestKnownHeadBlockTime<this.headBlockTtlMs&&this.bestKnownHeadBlock-state.headBlock>this.staleBlockThreshold)}getOrderedNodes(allNodes,api){const healthy=[],unhealthy=[];for(const node of allNodes)this.isNodeHealthy(node,api)?healthy.push(node):unhealthy.push(node);return[...healthy,...unhealthy]}reset(){this.health.clear(),this.bestKnownHeadBlock=0,this.bestKnownHeadBlockTime=0}getHealthSnapshot(){const snapshot=new Map;for(const[node,state]of this.health){const apiFailures={};for(const[api,failure]of state.apiFailures)apiFailures[api]={count:failure.count};snapshot.set(node,{consecutiveFailures:state.consecutiveFailures,headBlock:state.headBlock,apiFailures:apiFailures,healthy:this.isNodeHealthy(node)})}return snapshot}}},{}],"/Users/f/pjs/dhive/src/helpers/aes.ts":[function(_dereq_,module,exports){(function(Buffer){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});const assert=_dereq_("assert"),crypto_1=_dereq_("crypto"),ByteBuffer=_dereq_("@ecency/bytebuffer"),Long=ByteBuffer.Long;exports.encrypt=(private_key,public_key,message,nonce=uniqueNonce())=>crypt(private_key,public_key,nonce,message),exports.decrypt=(private_key,public_key,nonce,message,checksum)=>crypt(private_key,public_key,nonce,message,checksum).message;const crypt=(private_key,public_key,nonce,message,checksum)=>{const nonceL=toLongObj(nonce),S=private_key.get_shared_secret(public_key);let ebuf=new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY,ByteBuffer.LITTLE_ENDIAN);ebuf.writeUint64(nonceL),ebuf.append(S.toString("binary"),"binary"),ebuf=Buffer.from(ebuf.copy(0,ebuf.offset).toBinary(),"binary");const encryption_key=crypto_1.createHash("sha512").update(ebuf).digest(),iv=encryption_key.slice(32,48),tag=encryption_key.slice(0,32),check=crypto_1.createHash("sha256").update(encryption_key).digest().slice(0,4),cbuf=ByteBuffer.fromBinary(check.toString("binary"),ByteBuffer.DEFAULT_CAPACITY,ByteBuffer.LITTLE_ENDIAN);ByteBuffer.fromBinary(check.toString("binary"),ByteBuffer.DEFAULT_CAPACITY,ByteBuffer.LITTLE_ENDIAN);const check32=cbuf.readUint32();if(checksum){if(check32!==checksum)throw new Error("Invalid key");message=exports.cryptoJsDecrypt(message,tag,iv)}else message=exports.cryptoJsEncrypt(message,tag,iv);return{nonce:nonceL,message:message,checksum:check32}};exports.cryptoJsDecrypt=(message,tag,iv)=>{assert(message,"Missing cipher text");let messageBuffer=message;const decipher=crypto_1.createDecipheriv("aes-256-cbc",tag,iv);return messageBuffer=Buffer.concat([decipher.update(messageBuffer),decipher.final()]),messageBuffer},exports.cryptoJsEncrypt=(message,tag,iv)=>{assert(message,"Missing plain text");let messageBuffer=message;const cipher=crypto_1.createCipheriv("aes-256-cbc",tag,iv);return messageBuffer=Buffer.concat([cipher.update(messageBuffer),cipher.final()]),messageBuffer};let unique_nonce_entropy=null;const uniqueNonce=()=>{if(null===unique_nonce_entropy){const uint8randomArr=new Uint8Array(2);for(let i=0;i<2;++i)uint8randomArr[i]=crypto_1.randomBytes(2).readUInt8(i);unique_nonce_entropy=Math.round(uint8randomArr[0]<<8|uint8randomArr[1])}let long=Long.fromNumber(Date.now());const entropy=++unique_nonce_entropy%65535;return long=long.shiftLeft(16).or(Long.fromNumber(entropy)),long.toString()},toLongObj=o=>o?Long.isLong(o)?o:Long.fromString(o):o}).call(this,_dereq_("buffer").Buffer)},{"@ecency/bytebuffer":"/Users/f/pjs/dhive/node_modules/@ecency/bytebuffer/dist/bytebuffer-node.js",assert:"/Users/f/pjs/dhive/node_modules/assert/assert.js",buffer:"/Users/f/pjs/dhive/node_modules/buffer/index.js",crypto:"/Users/f/pjs/dhive/node_modules/crypto-browserify/index.js"}],"/Users/f/pjs/dhive/src/helpers/blockchain.ts":[function(_dereq_,module,exports){"use strict";
|
|
219
|
+
*/Object.defineProperty(exports,"__esModule",{value:!0}),exports.NodeHealthTracker=class{constructor(options={}){var _a,_b,_c,_d,_e,_f,_g;this.health=new Map,this.bestKnownHeadBlock=0,this.bestKnownHeadBlockTime=0,this.nodeCooldownMs=null!==(_a=options.nodeCooldownMs)&&void 0!==_a?_a:3e4,this.apiCooldownMs=null!==(_b=options.apiCooldownMs)&&void 0!==_b?_b:6e4,this.maxFailuresBeforeCooldown=null!==(_c=options.maxFailuresBeforeCooldown)&&void 0!==_c?_c:3,this.maxApiFailuresBeforeCooldown=null!==(_d=options.maxApiFailuresBeforeCooldown)&&void 0!==_d?_d:2,this.staleBlockThreshold=null!==(_e=options.staleBlockThreshold)&&void 0!==_e?_e:30,this.headBlockTtlMs=null!==(_f=options.headBlockTtlMs)&&void 0!==_f?_f:12e4,this.defaultRateLimitMs=null!==(_g=options.defaultRateLimitMs)&&void 0!==_g?_g:1e4}getOrCreate(node){let state=this.health.get(node);return state||(state={apiFailures:new Map,consecutiveFailures:0,lastFailure:0,headBlock:0,headBlockUpdatedAt:0},this.health.set(node,state)),state}recordSuccess(node,api){const state=this.getOrCreate(node);state.consecutiveFailures=0,state.apiFailures.delete(api)}recordFailure(node,api){const state=this.getOrCreate(node);state.consecutiveFailures++,state.lastFailure=Date.now(),this.incrementApiFailure(state,api)}recordRateLimit(node,retryAfterSeconds){const state=this.getOrCreate(node),delayMs=null!=retryAfterSeconds?1e3*retryAfterSeconds:this.defaultRateLimitMs;state.rateLimit={retryAfter:Date.now()+delayMs},state.consecutiveFailures++,state.lastFailure=Date.now()}isRateLimited(node){const state=this.health.get(node);return!!(null==state?void 0:state.rateLimit)&&Date.now()<state.rateLimit.retryAfter}recordApiFailure(node,api){const state=this.getOrCreate(node);this.incrementApiFailure(state,api)}incrementApiFailure(state,api){const apiState=state.apiFailures.get(api)||{count:0,lastFailure:0};apiState.count++,apiState.lastFailure=Date.now(),state.apiFailures.set(api,apiState)}updateHeadBlock(node,headBlock){if(!headBlock||headBlock<=0)return;const state=this.getOrCreate(node);state.headBlock=headBlock,state.headBlockUpdatedAt=Date.now(),headBlock>this.bestKnownHeadBlock&&(this.bestKnownHeadBlock=headBlock,this.bestKnownHeadBlockTime=Date.now())}isNodeHealthy(node,api){const state=this.health.get(node);if(!state)return!0;const now=Date.now();if(state.rateLimit&&now<state.rateLimit.retryAfter)return!1;if(state.consecutiveFailures>=this.maxFailuresBeforeCooldown&&now-state.lastFailure<this.nodeCooldownMs)return!1;if(api){const apiState=state.apiFailures.get(api);if(apiState&&apiState.count>=this.maxApiFailuresBeforeCooldown&&now-apiState.lastFailure<this.apiCooldownMs)return!1}return!(state.headBlock>0&&this.bestKnownHeadBlock>0&&now-state.headBlockUpdatedAt<this.headBlockTtlMs&&now-this.bestKnownHeadBlockTime<this.headBlockTtlMs&&this.bestKnownHeadBlock-state.headBlock>this.staleBlockThreshold)}getOrderedNodes(allNodes,api){const healthy=[],unhealthy=[];for(const node of allNodes)this.isNodeHealthy(node,api)?healthy.push(node):unhealthy.push(node);return[...healthy,...unhealthy]}reset(){this.health.clear(),this.bestKnownHeadBlock=0,this.bestKnownHeadBlockTime=0}getHealthSnapshot(){const snapshot=new Map;for(const[node,state]of this.health){const apiFailures={};for(const[api,failure]of state.apiFailures)apiFailures[api]={count:failure.count};snapshot.set(node,{consecutiveFailures:state.consecutiveFailures,headBlock:state.headBlock,apiFailures:apiFailures,healthy:this.isNodeHealthy(node)})}return snapshot}}},{}],"/Users/f/pjs/dhive/src/helpers/aes.ts":[function(_dereq_,module,exports){(function(Buffer){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});const assert=_dereq_("assert"),crypto_1=_dereq_("crypto"),ByteBuffer=_dereq_("@ecency/bytebuffer"),Long=ByteBuffer.Long;exports.encrypt=(private_key,public_key,message,nonce=uniqueNonce())=>crypt(private_key,public_key,nonce,message),exports.decrypt=(private_key,public_key,nonce,message,checksum)=>crypt(private_key,public_key,nonce,message,checksum).message;const crypt=(private_key,public_key,nonce,message,checksum)=>{const nonceL=toLongObj(nonce),S=private_key.get_shared_secret(public_key);let ebuf=new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY,ByteBuffer.LITTLE_ENDIAN);ebuf.writeUint64(nonceL),ebuf.append(S.toString("binary"),"binary"),ebuf=Buffer.from(ebuf.copy(0,ebuf.offset).toBinary(),"binary");const encryption_key=crypto_1.createHash("sha512").update(ebuf).digest(),iv=encryption_key.slice(32,48),tag=encryption_key.slice(0,32),check=crypto_1.createHash("sha256").update(encryption_key).digest().slice(0,4),cbuf=ByteBuffer.fromBinary(check.toString("binary"),ByteBuffer.DEFAULT_CAPACITY,ByteBuffer.LITTLE_ENDIAN);ByteBuffer.fromBinary(check.toString("binary"),ByteBuffer.DEFAULT_CAPACITY,ByteBuffer.LITTLE_ENDIAN);const check32=cbuf.readUint32();if(checksum){if(check32!==checksum)throw new Error("Invalid key");message=exports.cryptoJsDecrypt(message,tag,iv)}else message=exports.cryptoJsEncrypt(message,tag,iv);return{nonce:nonceL,message:message,checksum:check32}};exports.cryptoJsDecrypt=(message,tag,iv)=>{assert(message,"Missing cipher text");let messageBuffer=message;const decipher=crypto_1.createDecipheriv("aes-256-cbc",tag,iv);return messageBuffer=Buffer.concat([decipher.update(messageBuffer),decipher.final()]),messageBuffer},exports.cryptoJsEncrypt=(message,tag,iv)=>{assert(message,"Missing plain text");let messageBuffer=message;const cipher=crypto_1.createCipheriv("aes-256-cbc",tag,iv);return messageBuffer=Buffer.concat([cipher.update(messageBuffer),cipher.final()]),messageBuffer};let unique_nonce_entropy=null;const uniqueNonce=()=>{if(null===unique_nonce_entropy){const uint8randomArr=new Uint8Array(2);for(let i=0;i<2;++i)uint8randomArr[i]=crypto_1.randomBytes(2).readUInt8(i);unique_nonce_entropy=Math.round(uint8randomArr[0]<<8|uint8randomArr[1])}let long=Long.fromNumber(Date.now());const entropy=++unique_nonce_entropy%65535;return long=long.shiftLeft(16).or(Long.fromNumber(entropy)),long.toString()},toLongObj=o=>o?Long.isLong(o)?o:Long.fromString(o):o}).call(this,_dereq_("buffer").Buffer)},{"@ecency/bytebuffer":"/Users/f/pjs/dhive/node_modules/@ecency/bytebuffer/dist/bytebuffer-node.js",assert:"/Users/f/pjs/dhive/node_modules/assert/assert.js",buffer:"/Users/f/pjs/dhive/node_modules/buffer/index.js",crypto:"/Users/f/pjs/dhive/node_modules/crypto-browserify/index.js"}],"/Users/f/pjs/dhive/src/helpers/blockchain.ts":[function(_dereq_,module,exports){"use strict";
|
|
220
220
|
/**
|
|
221
221
|
* @file Hive blockchain helpers.
|
|
222
222
|
* @author Johan Nordberg <code@johan-nordberg.com>
|
|
@@ -420,5 +420,5 @@ object-assign
|
|
|
420
420
|
*
|
|
421
421
|
* You acknowledge that this software is not designed, licensed or intended for use
|
|
422
422
|
* in the design, construction, operation or maintenance of any military facility.
|
|
423
|
-
*/var __awaiter=function(thisArg,_arguments,P,generator){return new(P||(P=Promise))((function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){var value;result.done?resolve(result.value):(value=result.value,value instanceof P?value:new P((function(resolve){resolve(value)}))).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())}))};Object.defineProperty(exports,"__esModule",{value:!0});const cross_fetch_1=_dereq_("cross-fetch"),stream_1=_dereq_("stream"),PRE_CONNECTION_ERRORS=["ECONNREFUSED","ENOTFOUND","EHOSTUNREACH","EAI_AGAIN"],FAILOVER_ERRORS=[...PRE_CONNECTION_ERRORS,"timeout","database lock","CERT_HAS_EXPIRED","ECONNRESET","ERR_TLS_CERT_ALTNAME_INVALID","ETIMEDOUT","EPIPE","EPROTO"];function waitForEvent(emitter,eventName){return new Promise(((resolve,reject)=>{emitter.once(eventName,resolve)}))}function sleep(ms){return new Promise((resolve=>{setTimeout(resolve,ms)}))}function isPreConnectionError(error){return!(!error||!error.code)&&PRE_CONNECTION_ERRORS.some((code=>error.code.includes(code)))}function shouldFailover(error){return!error||!error.code||FAILOVER_ERRORS.some((code=>error.code.includes(code)))}function nextNode(nodes,currentIndex){return(currentIndex+1)%nodes.length}exports.waitForEvent=waitForEvent,exports.sleep=sleep,exports.iteratorStream=function(iterator){const stream=new stream_1.PassThrough({objectMode:!0});return(()=>__awaiter(this,void 0,void 0,(function*(){var e_1,_a;try{for(var iterator_1_1,iterator_1=function(o){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var i,m=o[Symbol.asyncIterator];return m?m.call(o):(o="function"==typeof __values?__values(o):o[Symbol.iterator](),i={},verb("next"),verb("throw"),verb("return"),i[Symbol.asyncIterator]=function(){return this},i);function verb(n){i[n]=o[n]&&function(v){return new Promise((function(resolve,reject){!function(resolve,reject,d,v){Promise.resolve(v).then((function(v){resolve({value:v,done:d})}),reject)}(resolve,reject,(v=o[n](v)).done,v.value)}))}}}(iterator);!(iterator_1_1=yield iterator_1.next()).done;){const item=iterator_1_1.value;stream.write(item)||(yield waitForEvent(stream,"drain"))}}catch(e_1_1){e_1={error:e_1_1}}finally{try{iterator_1_1&&!iterator_1_1.done&&(_a=iterator_1.return)&&(yield _a.call(iterator_1))}finally{if(e_1)throw e_1.error}}})))().then((()=>{stream.end()})).catch((error=>{stream.emit("error",error),stream.end()})),stream},exports.copy=function(object){return JSON.parse(JSON.stringify(object))},exports.retryingFetch=function(currentAddress,allAddresses,opts,timeout,failoverThreshold,consoleOnFailover,backoff,fetchTimeout,retryContext){return __awaiter(this,void 0,void 0,(function*(){const{healthTracker:healthTracker,api:api,isBroadcast:isBroadcast}=retryContext||{};let orderedNodes;null==retryContext||retryContext.consoleOnFailover,orderedNodes=Array.isArray(allAddresses)&&allAddresses.length>1?healthTracker?healthTracker.getOrderedNodes(allAddresses,api):[...allAddresses]:Array.isArray(allAddresses)?allAddresses:[allAddresses];let nodeIndex=0;const totalNodes=orderedNodes.length,startTime=Date.now();let lastError,nodesTriedInRound=0,round=0;for(;;){const node=orderedNodes[nodeIndex];try{fetchTimeout&&(opts.timeout=fetchTimeout(nodesTriedInRound));const response=yield cross_fetch_1.default(node,opts);if(!response.ok){if(
|
|
423
|
+
*/var __awaiter=function(thisArg,_arguments,P,generator){return new(P||(P=Promise))((function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){var value;result.done?resolve(result.value):(value=result.value,value instanceof P?value:new P((function(resolve){resolve(value)}))).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())}))};Object.defineProperty(exports,"__esModule",{value:!0});const cross_fetch_1=_dereq_("cross-fetch"),stream_1=_dereq_("stream"),PRE_CONNECTION_ERRORS=["ECONNREFUSED","ENOTFOUND","EHOSTUNREACH","EAI_AGAIN"],FAILOVER_ERRORS=[...PRE_CONNECTION_ERRORS,"timeout","database lock","CERT_HAS_EXPIRED","ECONNRESET","ERR_TLS_CERT_ALTNAME_INVALID","ETIMEDOUT","EPIPE","EPROTO"];function waitForEvent(emitter,eventName){return new Promise(((resolve,reject)=>{emitter.once(eventName,resolve)}))}function sleep(ms){return new Promise((resolve=>{setTimeout(resolve,ms)}))}function isPreConnectionError(error){return!(!error||!error.code)&&PRE_CONNECTION_ERRORS.some((code=>error.code.includes(code)))}function shouldFailover(error){return!error||!error.code||FAILOVER_ERRORS.some((code=>error.code.includes(code)))}function nextNode(nodes,currentIndex){return(currentIndex+1)%nodes.length}exports.waitForEvent=waitForEvent,exports.sleep=sleep,exports.iteratorStream=function(iterator){const stream=new stream_1.PassThrough({objectMode:!0});return(()=>__awaiter(this,void 0,void 0,(function*(){var e_1,_a;try{for(var iterator_1_1,iterator_1=function(o){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var i,m=o[Symbol.asyncIterator];return m?m.call(o):(o="function"==typeof __values?__values(o):o[Symbol.iterator](),i={},verb("next"),verb("throw"),verb("return"),i[Symbol.asyncIterator]=function(){return this},i);function verb(n){i[n]=o[n]&&function(v){return new Promise((function(resolve,reject){!function(resolve,reject,d,v){Promise.resolve(v).then((function(v){resolve({value:v,done:d})}),reject)}(resolve,reject,(v=o[n](v)).done,v.value)}))}}}(iterator);!(iterator_1_1=yield iterator_1.next()).done;){const item=iterator_1_1.value;stream.write(item)||(yield waitForEvent(stream,"drain"))}}catch(e_1_1){e_1={error:e_1_1}}finally{try{iterator_1_1&&!iterator_1_1.done&&(_a=iterator_1.return)&&(yield _a.call(iterator_1))}finally{if(e_1)throw e_1.error}}})))().then((()=>{stream.end()})).catch((error=>{stream.emit("error",error),stream.end()})),stream},exports.copy=function(object){return JSON.parse(JSON.stringify(object))},exports.retryingFetch=function(currentAddress,allAddresses,opts,timeout,failoverThreshold,consoleOnFailover,backoff,fetchTimeout,retryContext){var _b,_c;return __awaiter(this,void 0,void 0,(function*(){const{healthTracker:healthTracker,api:api,isBroadcast:isBroadcast}=retryContext||{};let orderedNodes;null==retryContext||retryContext.consoleOnFailover,orderedNodes=Array.isArray(allAddresses)&&allAddresses.length>1?healthTracker?healthTracker.getOrderedNodes(allAddresses,api):[...allAddresses]:Array.isArray(allAddresses)?allAddresses:[allAddresses];let nodeIndex=0;const totalNodes=orderedNodes.length,startTime=Date.now();let lastError,nodesTriedInRound=0,round=0;for(;;){const node=orderedNodes[nodeIndex];try{if(healthTracker&&healthTracker.isRateLimited(node))throw lastError=new Error(`Node ${node} is rate-limited, skipping`),healthTracker&&api&&healthTracker.recordFailure(node,api),lastError;fetchTimeout&&(opts.timeout=fetchTimeout(nodesTriedInRound));const response=yield cross_fetch_1.default(node,opts);if(!response.ok){if(429===response.status){const retryAfterHeader=null===(_c=null===(_b=response.headers)||void 0===_b?void 0:_b.get)||void 0===_c?void 0:_c.call(_b,"retry-after"),retryAfterSec=retryAfterHeader?parseInt(retryAfterHeader,10):void 0;throw healthTracker&&healthTracker.recordRateLimit(node,isNaN(retryAfterSec)?void 0:retryAfterSec),new Error("HTTP 429: Too Many Requests")}if(503===response.status)throw healthTracker&&api&&healthTracker.recordFailure(node,api),new Error("HTTP 503: Service Temporarily Unavailable");try{const resJson=yield response.json();if("2.0"===resJson.jsonrpc)return healthTracker&&api&&healthTracker.recordSuccess(node,api),{response:resJson,currentAddress:node}}catch(_d){}const statusText=response.statusText||`status code ${response.status}`;throw new Error(`HTTP ${response.status}: ${statusText}`)}const responseJson=yield response.json();return healthTracker&&api&&healthTracker.recordSuccess(node,api),{response:responseJson,currentAddress:node}}catch(error){if(lastError=error,healthTracker&&api&&healthTracker.recordFailure(node,api),isBroadcast){if(isPreConnectionError(error)&&totalNodes>1){if(nodeIndex=nextNode(orderedNodes,nodeIndex),nodesTriedInRound++,nodesTriedInRound>=totalNodes)throw error;continue}throw error}if(!shouldFailover(error))throw error;if(totalNodes>1&&nodesTriedInRound>0&&(yield sleep(50+50*Math.random())),totalNodes>1){if(nodeIndex=nextNode(orderedNodes,nodeIndex),nodesTriedInRound++,nodesTriedInRound>=totalNodes){if(nodesTriedInRound=0,failoverThreshold>0&&(round++,round>=failoverThreshold))throw error.message=`All ${totalNodes} nodes failed after ${failoverThreshold} rounds. Last error: [${error.code||"HTTP"}] ${error.message}. Nodes: ${orderedNodes.join(", ")}`,error;if(0!==timeout&&Date.now()-startTime>timeout)throw error;yield sleep(backoff(round))}}else{if(0!==timeout&&Date.now()-startTime>timeout)throw error;yield sleep(backoff(nodesTriedInRound++))}}}}))};const ByteBuffer=_dereq_("@ecency/bytebuffer"),serializer_1=_dereq_("./chain/serializer"),serialize=(serializer,data)=>{const buffer=new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY,ByteBuffer.LITTLE_ENDIAN);return serializer(buffer,data),buffer.flip(),buffer.toString("hex")};exports.buildWitnessUpdateOp=(owner,props)=>{const data={extensions:[],owner:owner,props:[]};for(const key of Object.keys(props)){let type;switch(key){case"key":case"new_signing_key":type=serializer_1.Types.PublicKey;break;case"account_subsidy_budget":case"account_subsidy_decay":case"maximum_block_size":type=serializer_1.Types.UInt32;break;case"hbd_interest_rate":type=serializer_1.Types.UInt16;break;case"url":type=serializer_1.Types.String;break;case"hbd_exchange_rate":type=serializer_1.Types.Price;break;case"account_creation_fee":type=serializer_1.Types.Asset;break;default:throw new Error(`Unknown witness prop: ${key}`)}data.props.push([key,serialize(type,props[key])])}return data.props.sort(((a,b)=>a[0].localeCompare(b[0]))),["witness_set_properties",data]};const JSBI=_dereq_("jsbi");exports.operationOrders={vote:0,comment:1,transfer:2,transfer_to_vesting:3,withdraw_vesting:4,limit_order_create:5,limit_order_cancel:6,feed_publish:7,convert:8,account_create:9,account_update:10,witness_update:11,account_witness_vote:12,account_witness_proxy:13,pow:14,custom:15,report_over_production:16,delete_comment:17,custom_json:18,comment_options:19,set_withdraw_vesting_route:20,limit_order_create2:21,claim_account:22,create_claimed_account:23,request_account_recovery:24,recover_account:25,change_recovery_account:26,escrow_transfer:27,escrow_dispute:28,escrow_release:29,pow2:30,escrow_approve:31,transfer_to_savings:32,transfer_from_savings:33,cancel_transfer_from_savings:34,custom_binary:35,decline_voting_rights:36,reset_account:37,set_reset_account:38,claim_reward_balance:39,delegate_vesting_shares:40,account_create_with_delegation:41,witness_set_properties:42,account_update2:43,create_proposal:44,update_proposal_votes:45,remove_proposal:46,update_proposal:47,collateralized_convert:48,recurrent_transfer:49,fill_convert_request:50,author_reward:51,curation_reward:52,comment_reward:53,liquidity_reward:54,interest:55,fill_vesting_withdraw:56,fill_order:57,shutdown_witness:58,fill_transfer_from_savings:59,hardfork:60,comment_payout_update:61,return_vesting_delegation:62,comment_benefactor_reward:63,producer_reward:64,clear_null_account_balance:65,proposal_pay:66,sps_fund:67,hardfork_hive:68,hardfork_hive_restore:69,delayed_voting:70,consolidate_treasury_balance:71,effective_comment_vote:72,ineffective_delete_comment:73,sps_convert:74,expired_account_notification:75,changed_recovery_account:76,transfer_to_vesting_completed:77,pow_reward:78,vesting_shares_split:79,account_created:80,fill_collateralized_convert_request:81,system_warning:82,fill_recurrent_transfer:83,failed_recurrent_transfer:84},exports.makeBitMaskFilter=function(allowedOperations){return allowedOperations.reduce(redFunction,[JSBI.BigInt(0),JSBI.BigInt(0)]).map((value=>JSBI.notEqual(value,JSBI.BigInt(0))?value.toString():null))};const redFunction=([low,high],allowedOperation)=>allowedOperation<64?[JSBI.bitwiseOr(low,JSBI.leftShift(JSBI.BigInt(1),JSBI.BigInt(allowedOperation))),high]:[low,JSBI.bitwiseOr(high,JSBI.leftShift(JSBI.BigInt(1),JSBI.BigInt(allowedOperation-64)))]},{"./chain/serializer":"/Users/f/pjs/dhive/src/chain/serializer.ts","@ecency/bytebuffer":"/Users/f/pjs/dhive/node_modules/@ecency/bytebuffer/dist/bytebuffer-node.js","cross-fetch":"/Users/f/pjs/dhive/node_modules/cross-fetch/dist/browser-ponyfill.js",jsbi:"/Users/f/pjs/dhive/node_modules/jsbi/dist/jsbi-umd.js",stream:"/Users/f/pjs/dhive/node_modules/stream-browserify/index.js"}]},{},["/Users/f/pjs/dhive/src/index-browser.ts"])("/Users/f/pjs/dhive/src/index-browser.ts")}));
|
|
424
424
|
//# sourceMappingURL=dhive.js.map
|
package/dist/dhive.js.gz
CHANGED
|
Binary file
|