@bitpay-labs/bitcore-wallet-service 11.7.2 → 11.8.0

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.
@@ -0,0 +1,2 @@
1
+ import 'chai/register-should';
2
+ //# sourceMappingURL=txhistory.paging.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"txhistory.paging.test.d.ts","sourceRoot":"","sources":["../../test/txhistory.paging.test.ts"],"names":[],"mappings":"AAGA,OAAO,sBAAsB,CAAC"}
@@ -0,0 +1,162 @@
1
+ 'use strict';
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const chai = __importStar(require("chai"));
37
+ require("chai/register-should");
38
+ const server_1 = require("../src/lib/server");
39
+ chai.should();
40
+ function makeTx(id) {
41
+ return {
42
+ id: `id${id}`,
43
+ txid: `txid${id}`,
44
+ confirmations: 100 - id,
45
+ blockheight: 1000 - id
46
+ };
47
+ }
48
+ function callGetTxHistoryV8(service, bc, wallet, opts, skip, limit) {
49
+ return new Promise((resolve, reject) => {
50
+ service.getTxHistoryV8(bc, wallet, opts, skip, limit, (err, res) => {
51
+ if (err)
52
+ return reject(err);
53
+ resolve(res);
54
+ });
55
+ });
56
+ }
57
+ describe('TxHistory Paging', function () {
58
+ function buildService(initialCacheNewest, getBcNewest) {
59
+ let cacheNewest = initialCacheNewest.slice();
60
+ let streamKey = null;
61
+ let streamItems = null;
62
+ const service = Object.create(server_1.WalletService.prototype);
63
+ service.userAgent = 'txhistory-test-agent';
64
+ service.syncWallet = (_wallet, next) => next();
65
+ service._getBlockchainHeight = (_chain, _network, cb) => cb(null, 1000, 'test-hash');
66
+ service._normalizeTxHistory = (_walletCacheKey, _txs, _dustThreshold, _bcHeight, cb) => cb(null, getBcNewest());
67
+ service.storage = {
68
+ getTxHistoryCacheStatusV8: (_walletCacheKey, cb) => cb(null, {
69
+ updatedHeight: 0,
70
+ tipIndex: cacheNewest.length ? cacheNewest.length - 1 : null,
71
+ tipTxId: cacheNewest.length ? cacheNewest[0].txid : null,
72
+ tipHeight: cacheNewest.length ? cacheNewest[0].blockheight : null
73
+ }),
74
+ getTxHistoryStreamV8: (_walletCacheKey, cb) => cb(null, streamKey && streamItems ? { streamKey, items: streamItems.slice() } : null),
75
+ clearTxHistoryStreamV8: (_walletCacheKey, cb) => {
76
+ streamKey = null;
77
+ streamItems = null;
78
+ cb();
79
+ },
80
+ storeTxHistoryStreamV8: (_walletCacheKey, inStreamKey, items, cb) => {
81
+ streamKey = inStreamKey;
82
+ streamItems = items.slice();
83
+ cb();
84
+ },
85
+ getTxHistoryCacheV8: (_walletCacheKey, skip, limit, cb) => cb(null, cacheNewest.slice(skip, skip + limit)),
86
+ storeTxHistoryCacheV8: (_walletCacheKey, _tipIndex, items, _updateHeight, cb) => {
87
+ cacheNewest = items.concat(cacheNewest);
88
+ cb();
89
+ }
90
+ };
91
+ const bc = {
92
+ getTransactions: (_wallet, _startBlock, cb) => cb(null, [])
93
+ };
94
+ const wallet = {
95
+ id: 'wallet1',
96
+ chain: 'btc',
97
+ network: 'livenet'
98
+ };
99
+ return { service, bc, wallet };
100
+ }
101
+ it('should preserve newest-first skip behavior by default', async function () {
102
+ const cacheNewest = [makeTx(5), makeTx(6), makeTx(7)];
103
+ const bcNewest = [makeTx(0), makeTx(1), makeTx(2), makeTx(3), makeTx(4)];
104
+ const { service, bc, wallet } = buildService(cacheNewest, () => bcNewest);
105
+ const result = await callGetTxHistoryV8(service, bc, wallet, {}, 2, 2);
106
+ result.items.map(tx => tx.id).should.deep.equal(['id2', 'id3']);
107
+ });
108
+ it('should return oldest-first pages when reverse is set', async function () {
109
+ const cacheNewest = [makeTx(5), makeTx(6), makeTx(7)];
110
+ const bcNewest = [makeTx(0), makeTx(1), makeTx(2), makeTx(3), makeTx(4)];
111
+ const { service, bc, wallet } = buildService(cacheNewest, () => bcNewest);
112
+ const result = await callGetTxHistoryV8(service, bc, wallet, { reverse: true }, 0, 2);
113
+ result.items.map(tx => tx.id).should.deep.equal(['id7', 'id6']);
114
+ });
115
+ it('should keep reverse skip stable when new transactions arrive at the tip', async function () {
116
+ const cacheNewest = [makeTx(5), makeTx(6), makeTx(7)];
117
+ let bcNewest = [makeTx(0), makeTx(1), makeTx(2), makeTx(3), makeTx(4)];
118
+ const { service, bc, wallet } = buildService(cacheNewest, () => bcNewest);
119
+ const firstPage = await callGetTxHistoryV8(service, bc, wallet, { reverse: true }, 0, 2);
120
+ firstPage.items.map(tx => tx.id).should.deep.equal(['id7', 'id6']);
121
+ bcNewest = [
122
+ {
123
+ id: 'newid0',
124
+ txid: 'newtxid0',
125
+ confirmations: 0,
126
+ blockheight: -1
127
+ },
128
+ {
129
+ id: 'newid1',
130
+ txid: 'newtxid1',
131
+ confirmations: 0,
132
+ blockheight: -1
133
+ },
134
+ ...bcNewest
135
+ ];
136
+ const secondPage = await callGetTxHistoryV8(service, bc, wallet, { reverse: true }, 2, 2);
137
+ secondPage.items.map(tx => tx.id).should.deep.equal(['id5', 'id4']);
138
+ });
139
+ it('should trim streamed txs that were promoted into cache before reverse paging', async function () {
140
+ const cacheNewest = [makeTx(3)];
141
+ const bcNewest = [makeTx(0), makeTx(1), makeTx(2), makeTx(3)];
142
+ const { service, bc, wallet } = buildService(cacheNewest, () => bcNewest);
143
+ const firstPage = await callGetTxHistoryV8(service, bc, wallet, { reverse: true }, 0, 2);
144
+ firstPage.useStream.should.equal(false);
145
+ firstPage.items.map(tx => tx.id).should.deep.equal(['id3', 'id2']);
146
+ const secondPage = await callGetTxHistoryV8(service, bc, wallet, { reverse: true }, 2, 2);
147
+ secondPage.useStream.should.equal(true);
148
+ secondPage.items.map(tx => tx.id).should.deep.equal(['id1', 'id0']);
149
+ });
150
+ it('should trim streamed txs that were promoted into cache before newest-first paging', async function () {
151
+ const cacheNewest = [makeTx(3)];
152
+ const bcNewest = [makeTx(0), makeTx(1), makeTx(2), makeTx(3)];
153
+ const { service, bc, wallet } = buildService(cacheNewest, () => bcNewest);
154
+ const firstPage = await callGetTxHistoryV8(service, bc, wallet, {}, 0, 2);
155
+ firstPage.useStream.should.equal(false);
156
+ firstPage.items.map(tx => tx.id).should.deep.equal(['id0', 'id1']);
157
+ const secondPage = await callGetTxHistoryV8(service, bc, wallet, {}, 2, 2);
158
+ secondPage.useStream.should.equal(true);
159
+ secondPage.items.map(tx => tx.id).should.deep.equal(['id2', 'id3']);
160
+ });
161
+ });
162
+ //# sourceMappingURL=txhistory.paging.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"txhistory.paging.test.js","sourceRoot":"","sources":["../../test/txhistory.paging.test.ts"],"names":[],"mappings":"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"}