merkle_client.js 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642
  1. // Generated by IcedCoffeeScript 1.7.1-c
  2. (function() {
  3. var C, E, Leaf, MerkleClient, a_json_parse, athrow, createHash, db, env, iced, kbpgp, keys, log, make_esc, master_ring, pathcheck, req, __iced_k, __iced_k_noop, _merkle_client, _ref,
  4. __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
  5. iced = require('iced-runtime').iced;
  6. __iced_k = __iced_k_noop = function() {};
  7. db = require('./db');
  8. req = require('./req');
  9. log = require('./log');
  10. E = require('./err').E;
  11. make_esc = require('iced-error').make_esc;
  12. _ref = require('iced-utils').util, a_json_parse = _ref.a_json_parse, athrow = _ref.athrow;
  13. createHash = require('crypto').createHash;
  14. master_ring = require('./keyring').master_ring;
  15. keys = require('./keys');
  16. env = require('./env').env;
  17. C = require('./constants').constants;
  18. pathcheck = require('libkeybase').merkle.pathcheck;
  19. Leaf = require('libkeybase').merkle.leaf.Leaf;
  20. kbpgp = require('kbpgp');
  21. MerkleClient = (function() {
  22. MerkleClient.LATEST = "latest";
  23. function MerkleClient() {
  24. this._nodes = {};
  25. this._keys = {};
  26. this._verified = {};
  27. }
  28. MerkleClient.prototype.lookup_path = function(_arg, cb) {
  29. var uid, username;
  30. uid = _arg.uid, username = _arg.username;
  31. if ((uid == null) && (username == null)) {
  32. cb(new Error("lookup_path: one of uid or username must be specified"));
  33. return;
  34. }
  35. if ((uid != null) && (username != null)) {
  36. cb(new Error("lookup_path: only one of uid (" + uid + ") and username (" + username + ") can be specified"));
  37. return;
  38. }
  39. return req.get({
  40. endpoint: "merkle/path",
  41. args: {
  42. uid: uid,
  43. username: username
  44. }
  45. }, cb);
  46. };
  47. MerkleClient.prototype.check_key_fingerprint = function(_arg, cb) {
  48. var err, fingerprint;
  49. fingerprint = _arg.fingerprint;
  50. if (__indexOf.call(env().get_merkle_key_fingerprints(), fingerprint) >= 0) {
  51. err = null;
  52. } else {
  53. err = new E.KeyNotTrustedError("the fingerprint " + fingerprint + " isn't trusted");
  54. }
  55. return cb(err);
  56. };
  57. MerkleClient.prototype.find_key_data = function(_arg, cb) {
  58. var err, fingerprint, json, key_data, ___iced_passed_deferral, __iced_deferrals, __iced_k;
  59. __iced_k = __iced_k_noop;
  60. ___iced_passed_deferral = iced.findDeferral(arguments);
  61. fingerprint = _arg.fingerprint;
  62. err = key_data = null;
  63. (function(_this) {
  64. return (function(__iced_k) {
  65. if ((key_data = keys.lookup[fingerprint]) == null) {
  66. (function(__iced_k) {
  67. __iced_deferrals = new iced.Deferrals(__iced_k, {
  68. parent: ___iced_passed_deferral,
  69. filename: "/Users/max/src/keybase/node-client/src/merkle_client.iced",
  70. funcname: "MerkleClient.find_key_data"
  71. });
  72. req.get({
  73. endpoint: "key/special",
  74. args: {
  75. fingerprint: fingerprint
  76. }
  77. }, __iced_deferrals.defer({
  78. assign_fn: (function() {
  79. return function() {
  80. err = arguments[0];
  81. return json = arguments[1];
  82. };
  83. })(),
  84. lineno: 53
  85. }));
  86. __iced_deferrals._fulfill();
  87. })(function() {
  88. return __iced_k(err != null ? void 0 : (key_data = json.bundle) == null ? err = new E.KeyNotFoundError("have no key for " + fingerprint) : void 0);
  89. });
  90. } else {
  91. return __iced_k();
  92. }
  93. });
  94. })(this)((function(_this) {
  95. return function() {
  96. return cb(err, key_data);
  97. };
  98. })(this));
  99. };
  100. MerkleClient.prototype.get_merkle_pgp_key = function(_arg, cb) {
  101. var err, esc, fingerprint, index, key_data, obj, ret, ring, ___iced_passed_deferral, __iced_deferrals, __iced_k;
  102. __iced_k = __iced_k_noop;
  103. ___iced_passed_deferral = iced.findDeferral(arguments);
  104. fingerprint = _arg.fingerprint;
  105. ring = master_ring();
  106. esc = make_esc(cb, "MerkleClient::get_merkle_pgp_key");
  107. err = ret = null;
  108. log.debug("+ merkle get_merkle_pgp_key");
  109. (function(_this) {
  110. return (function(__iced_k) {
  111. if ((ret = _this._keys[fingerprint]) == null) {
  112. (function(__iced_k) {
  113. __iced_deferrals = new iced.Deferrals(__iced_k, {
  114. parent: ___iced_passed_deferral,
  115. filename: "/Users/max/src/keybase/node-client/src/merkle_client.iced",
  116. funcname: "MerkleClient.get_merkle_pgp_key"
  117. });
  118. ring.index2({}, esc(__iced_deferrals.defer({
  119. assign_fn: (function() {
  120. return function() {
  121. return index = arguments[0];
  122. };
  123. })(),
  124. lineno: 67
  125. })));
  126. __iced_deferrals._fulfill();
  127. })(function() {
  128. var _ref1;
  129. _ref1 = index.lookup().fingerprint.get_0_or_1(fingerprint), err = _ref1[0], obj = _ref1[1];
  130. (function(__iced_k) {
  131. if (err != null) {
  132. return __iced_k();
  133. } else {
  134. (function(__iced_k) {
  135. if (obj != null) {
  136. log.debug("| merkle key already found in keyring");
  137. return __iced_k(ret = ring.make_key({
  138. fingerprint: fingerprint
  139. }));
  140. } else {
  141. (function(__iced_k) {
  142. __iced_deferrals = new iced.Deferrals(__iced_k, {
  143. parent: ___iced_passed_deferral,
  144. filename: "/Users/max/src/keybase/node-client/src/merkle_client.iced",
  145. funcname: "MerkleClient.get_merkle_pgp_key"
  146. });
  147. _this.find_key_data({
  148. fingerprint: fingerprint
  149. }, esc(__iced_deferrals.defer({
  150. assign_fn: (function() {
  151. return function() {
  152. return key_data = arguments[0];
  153. };
  154. })(),
  155. lineno: 74
  156. })));
  157. __iced_deferrals._fulfill();
  158. })(function() {
  159. log.debug("| doing a merkle key import for " + fingerprint);
  160. ret = ring.make_key({
  161. fingerprint: fingerprint,
  162. key_data: key_data
  163. });
  164. (function(__iced_k) {
  165. __iced_deferrals = new iced.Deferrals(__iced_k, {
  166. parent: ___iced_passed_deferral,
  167. filename: "/Users/max/src/keybase/node-client/src/merkle_client.iced",
  168. funcname: "MerkleClient.get_merkle_pgp_key"
  169. });
  170. ret.save(esc(__iced_deferrals.defer({
  171. lineno: 77
  172. })));
  173. __iced_deferrals._fulfill();
  174. })(function() {
  175. return __iced_k(ret = ring.make_key({
  176. fingerprint: fingerprint
  177. }));
  178. });
  179. });
  180. }
  181. })(__iced_k);
  182. }
  183. })(function() {
  184. return __iced_k(ret != null ? _this._keys[fingerprint] = ret : void 0);
  185. });
  186. });
  187. } else {
  188. return __iced_k();
  189. }
  190. });
  191. })(this)((function(_this) {
  192. return function() {
  193. log.debug("- merkle get_merkle_pgp_key");
  194. return cb(err, ret);
  195. };
  196. })(this));
  197. };
  198. MerkleClient.prototype.rollback_check = function(_arg, cb) {
  199. var err, esc, last_root, p, q, root, ___iced_passed_deferral, __iced_deferrals, __iced_k;
  200. __iced_k = __iced_k_noop;
  201. ___iced_passed_deferral = iced.findDeferral(arguments);
  202. root = _arg.root;
  203. log.debug("+ Rollback check");
  204. esc = make_esc(cb, "MerkleClient::rollback_check");
  205. (function(_this) {
  206. return (function(__iced_k) {
  207. __iced_deferrals = new iced.Deferrals(__iced_k, {
  208. parent: ___iced_passed_deferral,
  209. filename: "/Users/max/src/keybase/node-client/src/merkle_client.iced",
  210. funcname: "MerkleClient.rollback_check"
  211. });
  212. _this.load_last_root(esc(__iced_deferrals.defer({
  213. assign_fn: (function() {
  214. return function() {
  215. return last_root = arguments[0];
  216. };
  217. })(),
  218. lineno: 90
  219. })));
  220. __iced_deferrals._fulfill();
  221. });
  222. })(this)((function(_this) {
  223. return function() {
  224. err = null;
  225. (function(__iced_k) {
  226. var _ref1, _ref2;
  227. if ((typeof last_root !== "undefined" && last_root !== null) && (((q = (_ref1 = last_root.payload.body) != null ? _ref1.seqno : void 0) == null) || q > (p = (_ref2 = root.payload.body) != null ? _ref2.seqno : void 0))) {
  228. return __iced_k(err = new E.VersionRollbackError("Merkle root version rollback detected: " + q + " > " + p));
  229. } else {
  230. (function(__iced_k) {
  231. __iced_deferrals = new iced.Deferrals(__iced_k, {
  232. parent: ___iced_passed_deferral,
  233. filename: "/Users/max/src/keybase/node-client/src/merkle_client.iced",
  234. funcname: "MerkleClient.rollback_check"
  235. });
  236. _this.store_this_root({
  237. root: root
  238. }, esc(__iced_deferrals.defer({
  239. lineno: 95
  240. })));
  241. __iced_deferrals._fulfill();
  242. })(__iced_k);
  243. }
  244. })(function() {
  245. log.debug("- Rollback check");
  246. return cb(err);
  247. });
  248. };
  249. })(this));
  250. };
  251. MerkleClient.prototype.store_this_root = function(_arg, cb) {
  252. var err, root, ___iced_passed_deferral, __iced_deferrals, __iced_k;
  253. __iced_k = __iced_k_noop;
  254. ___iced_passed_deferral = iced.findDeferral(arguments);
  255. root = _arg.root;
  256. (function(_this) {
  257. return (function(__iced_k) {
  258. __iced_deferrals = new iced.Deferrals(__iced_k, {
  259. parent: ___iced_passed_deferral,
  260. filename: "/Users/max/src/keybase/node-client/src/merkle_client.iced",
  261. funcname: "MerkleClient.store_this_root"
  262. });
  263. db.put({
  264. type: C.ids.merkle_root,
  265. key: root.hash,
  266. value: root,
  267. name: {
  268. type: C.lookups.merkle_root,
  269. name: MerkleClient.LATEST
  270. },
  271. debug: true
  272. }, __iced_deferrals.defer({
  273. assign_fn: (function() {
  274. return function() {
  275. return err = arguments[0];
  276. };
  277. })(),
  278. lineno: 111
  279. }));
  280. __iced_deferrals._fulfill();
  281. });
  282. })(this)((function(_this) {
  283. return function() {
  284. return cb(err);
  285. };
  286. })(this));
  287. };
  288. MerkleClient.prototype.load_last_root = function(cb) {
  289. var err, obj, ___iced_passed_deferral, __iced_deferrals, __iced_k;
  290. __iced_k = __iced_k_noop;
  291. ___iced_passed_deferral = iced.findDeferral(arguments);
  292. (function(_this) {
  293. return (function(__iced_k) {
  294. __iced_deferrals = new iced.Deferrals(__iced_k, {
  295. parent: ___iced_passed_deferral,
  296. filename: "/Users/max/src/keybase/node-client/src/merkle_client.iced",
  297. funcname: "MerkleClient.load_last_root"
  298. });
  299. db.lookup({
  300. type: C.lookups.merkle_root,
  301. name: MerkleClient.LATEST
  302. }, __iced_deferrals.defer({
  303. assign_fn: (function() {
  304. return function() {
  305. err = arguments[0];
  306. return obj = arguments[1];
  307. };
  308. })(),
  309. lineno: 117
  310. }));
  311. __iced_deferrals._fulfill();
  312. });
  313. })(this)((function(_this) {
  314. return function() {
  315. return cb(err, obj);
  316. };
  317. })(this));
  318. };
  319. MerkleClient.prototype.get_merkle_key_manager = function(_arg, cb) {
  320. var armored, blob, esc, fingerprint, key_manager, kid, path_response, pgp_key, ___iced_passed_deferral, __iced_deferrals, __iced_k, _ref1;
  321. __iced_k = __iced_k_noop;
  322. ___iced_passed_deferral = iced.findDeferral(arguments);
  323. path_response = _arg.path_response;
  324. esc = make_esc(cb, "MerkleClient::get_merkle_key_manager");
  325. fingerprint = null;
  326. _ref1 = path_response.root.sigs;
  327. for (kid in _ref1) {
  328. blob = _ref1[kid];
  329. if (blob.fingerprint != null) {
  330. fingerprint = blob.fingerprint;
  331. break;
  332. }
  333. }
  334. (function(_this) {
  335. return (function(__iced_k) {
  336. if (fingerprint == null) {
  337. (function(__iced_k) {
  338. __iced_deferrals = new iced.Deferrals(__iced_k, {
  339. parent: ___iced_passed_deferral,
  340. filename: "/Users/max/src/keybase/node-client/src/merkle_client.iced",
  341. funcname: "MerkleClient.get_merkle_key_manager"
  342. });
  343. athrow(new Error("Didn't find a PGP fingerprint among the merkle sigs."), esc(__iced_deferrals.defer({
  344. lineno: 130
  345. })));
  346. __iced_deferrals._fulfill();
  347. })(__iced_k);
  348. } else {
  349. return __iced_k();
  350. }
  351. });
  352. })(this)((function(_this) {
  353. return function() {
  354. (function(__iced_k) {
  355. __iced_deferrals = new iced.Deferrals(__iced_k, {
  356. parent: ___iced_passed_deferral,
  357. filename: "/Users/max/src/keybase/node-client/src/merkle_client.iced",
  358. funcname: "MerkleClient.get_merkle_key_manager"
  359. });
  360. _this.check_key_fingerprint({
  361. fingerprint: fingerprint
  362. }, esc(__iced_deferrals.defer({
  363. lineno: 131
  364. })));
  365. __iced_deferrals._fulfill();
  366. })(function() {
  367. (function(__iced_k) {
  368. __iced_deferrals = new iced.Deferrals(__iced_k, {
  369. parent: ___iced_passed_deferral,
  370. filename: "/Users/max/src/keybase/node-client/src/merkle_client.iced",
  371. funcname: "MerkleClient.get_merkle_key_manager"
  372. });
  373. _this.get_merkle_pgp_key({
  374. fingerprint: fingerprint
  375. }, esc(__iced_deferrals.defer({
  376. assign_fn: (function() {
  377. return function() {
  378. return pgp_key = arguments[0];
  379. };
  380. })(),
  381. lineno: 132
  382. })));
  383. __iced_deferrals._fulfill();
  384. })(function() {
  385. (function(__iced_k) {
  386. __iced_deferrals = new iced.Deferrals(__iced_k, {
  387. parent: ___iced_passed_deferral,
  388. filename: "/Users/max/src/keybase/node-client/src/merkle_client.iced",
  389. funcname: "MerkleClient.get_merkle_key_manager"
  390. });
  391. pgp_key.load(esc(__iced_deferrals.defer({
  392. lineno: 133
  393. })));
  394. __iced_deferrals._fulfill();
  395. })(function() {
  396. armored = pgp_key.key_data();
  397. (function(__iced_k) {
  398. __iced_deferrals = new iced.Deferrals(__iced_k, {
  399. parent: ___iced_passed_deferral,
  400. filename: "/Users/max/src/keybase/node-client/src/merkle_client.iced",
  401. funcname: "MerkleClient.get_merkle_key_manager"
  402. });
  403. kbpgp.KeyManager.import_from_armored_pgp({
  404. armored: armored
  405. }, esc(__iced_deferrals.defer({
  406. assign_fn: (function() {
  407. return function() {
  408. return key_manager = arguments[0];
  409. };
  410. })(),
  411. lineno: 135
  412. })));
  413. __iced_deferrals._fulfill();
  414. })(function() {
  415. return cb(null, key_manager);
  416. });
  417. });
  418. });
  419. });
  420. };
  421. })(this));
  422. };
  423. MerkleClient.prototype.get_root_with_parsed_payload = function(_arg, cb) {
  424. var esc, k, payload, root_clone, root_from_server, v, ___iced_passed_deferral, __iced_deferrals, __iced_k;
  425. __iced_k = __iced_k_noop;
  426. ___iced_passed_deferral = iced.findDeferral(arguments);
  427. root_from_server = _arg.root_from_server;
  428. esc = make_esc(cb, "MerkleClient::get_root_with_parsed_payload");
  429. root_clone = {};
  430. for (k in root_from_server) {
  431. v = root_from_server[k];
  432. root_clone[k] = v;
  433. }
  434. (function(_this) {
  435. return (function(__iced_k) {
  436. __iced_deferrals = new iced.Deferrals(__iced_k, {
  437. parent: ___iced_passed_deferral,
  438. filename: "/Users/max/src/keybase/node-client/src/merkle_client.iced",
  439. funcname: "MerkleClient.get_root_with_parsed_payload"
  440. });
  441. a_json_parse(root_clone.payload_json, esc(__iced_deferrals.defer({
  442. assign_fn: (function() {
  443. return function() {
  444. return payload = arguments[0];
  445. };
  446. })(),
  447. lineno: 146
  448. })));
  449. __iced_deferrals._fulfill();
  450. });
  451. })(this)((function(_this) {
  452. return function() {
  453. root_clone.payload_json = null;
  454. root_clone.payload = payload;
  455. return cb(null, root_clone);
  456. };
  457. })(this));
  458. };
  459. MerkleClient.prototype.find_and_verify = function(_arg, cb) {
  460. var esc, km, path_response, pathcheck_result, root, uid, username, ___iced_passed_deferral, __iced_deferrals, __iced_k;
  461. __iced_k = __iced_k_noop;
  462. ___iced_passed_deferral = iced.findDeferral(arguments);
  463. uid = _arg.uid, username = _arg.username;
  464. esc = make_esc(cb, "MerkleClient::find_and_verify");
  465. username = username.toLowerCase();
  466. log.debug("+ merkle find_and_verify: uid " + uid + ", username " + username);
  467. (function(_this) {
  468. return (function(__iced_k) {
  469. __iced_deferrals = new iced.Deferrals(__iced_k, {
  470. parent: ___iced_passed_deferral,
  471. filename: "/Users/max/src/keybase/node-client/src/merkle_client.iced",
  472. funcname: "MerkleClient.find_and_verify"
  473. });
  474. _this.lookup_path({
  475. uid: uid,
  476. username: username
  477. }, esc(__iced_deferrals.defer({
  478. assign_fn: (function() {
  479. return function() {
  480. return path_response = arguments[0];
  481. };
  482. })(),
  483. lineno: 157
  484. })));
  485. __iced_deferrals._fulfill();
  486. });
  487. })(this)((function(_this) {
  488. return function() {
  489. (function(__iced_k) {
  490. __iced_deferrals = new iced.Deferrals(__iced_k, {
  491. parent: ___iced_passed_deferral,
  492. filename: "/Users/max/src/keybase/node-client/src/merkle_client.iced",
  493. funcname: "MerkleClient.find_and_verify"
  494. });
  495. _this.get_merkle_key_manager({
  496. path_response: path_response
  497. }, esc(__iced_deferrals.defer({
  498. assign_fn: (function() {
  499. return function() {
  500. return km = arguments[0];
  501. };
  502. })(),
  503. lineno: 158
  504. })));
  505. __iced_deferrals._fulfill();
  506. })(function() {
  507. (function(__iced_k) {
  508. __iced_deferrals = new iced.Deferrals(__iced_k, {
  509. parent: ___iced_passed_deferral,
  510. filename: "/Users/max/src/keybase/node-client/src/merkle_client.iced",
  511. funcname: "MerkleClient.find_and_verify"
  512. });
  513. pathcheck({
  514. server_reply: path_response,
  515. km: km
  516. }, esc(__iced_deferrals.defer({
  517. assign_fn: (function() {
  518. return function() {
  519. return pathcheck_result = arguments[0];
  520. };
  521. })(),
  522. lineno: 159
  523. })));
  524. __iced_deferrals._fulfill();
  525. })(function() {
  526. (function(__iced_k) {
  527. if ((uid != null) && pathcheck_result.uid !== uid) {
  528. (function(__iced_k) {
  529. __iced_deferrals = new iced.Deferrals(__iced_k, {
  530. parent: ___iced_passed_deferral,
  531. filename: "/Users/max/src/keybase/node-client/src/merkle_client.iced",
  532. funcname: "MerkleClient.find_and_verify"
  533. });
  534. athrow(new Error("Expected uid " + uid + " does not match merkle response uid " + pathcheck_result.uid), esc(__iced_deferrals.defer({
  535. lineno: 161
  536. })));
  537. __iced_deferrals._fulfill();
  538. })(__iced_k);
  539. } else {
  540. return __iced_k();
  541. }
  542. })(function() {
  543. (function(__iced_k) {
  544. if ((username != null) && pathcheck_result.username !== username) {
  545. (function(__iced_k) {
  546. __iced_deferrals = new iced.Deferrals(__iced_k, {
  547. parent: ___iced_passed_deferral,
  548. filename: "/Users/max/src/keybase/node-client/src/merkle_client.iced",
  549. funcname: "MerkleClient.find_and_verify"
  550. });
  551. athrow(new Error("Expected username " + username + " does not match merkle response username " + pathcheck_result.username), esc(__iced_deferrals.defer({
  552. lineno: 163
  553. })));
  554. __iced_deferrals._fulfill();
  555. })(__iced_k);
  556. } else {
  557. return __iced_k();
  558. }
  559. })(function() {
  560. (function(__iced_k) {
  561. __iced_deferrals = new iced.Deferrals(__iced_k, {
  562. parent: ___iced_passed_deferral,
  563. filename: "/Users/max/src/keybase/node-client/src/merkle_client.iced",
  564. funcname: "MerkleClient.find_and_verify"
  565. });
  566. _this.get_root_with_parsed_payload({
  567. root_from_server: path_response.root
  568. }, esc(__iced_deferrals.defer({
  569. assign_fn: (function() {
  570. return function() {
  571. return root = arguments[0];
  572. };
  573. })(),
  574. lineno: 164
  575. })));
  576. __iced_deferrals._fulfill();
  577. })(function() {
  578. (function(__iced_k) {
  579. __iced_deferrals = new iced.Deferrals(__iced_k, {
  580. parent: ___iced_passed_deferral,
  581. filename: "/Users/max/src/keybase/node-client/src/merkle_client.iced",
  582. funcname: "MerkleClient.find_and_verify"
  583. });
  584. _this.rollback_check({
  585. root: root
  586. }, esc(__iced_deferrals.defer({
  587. lineno: 165
  588. })));
  589. __iced_deferrals._fulfill();
  590. })(function() {
  591. return cb(null, pathcheck_result.leaf, root, path_response.id_version);
  592. });
  593. });
  594. });
  595. });
  596. });
  597. });
  598. };
  599. })(this));
  600. };
  601. return MerkleClient;
  602. })();
  603. _merkle_client = null;
  604. exports.merkle_client = function() {
  605. if (_merkle_client == null) {
  606. _merkle_client = new MerkleClient();
  607. }
  608. return _merkle_client;
  609. };
  610. }).call(this);