Browse Source

Merge branch 'fix-replication' of CoBox/cobox-server into development

peg 2 years ago
parent
commit
b424571307

+ 2
- 1
bin/groups.js View File

@@ -1,7 +1,8 @@
1 1
 exports.command = 'groups'
2 2
 exports.desc = 'create, join, leave and mount'
3 3
 exports.builder = function (yargs) {
4
-  return yargs.commandDir('groups')
4
+  return yargs
5
+    .commandDir('groups')
5 6
     .demandCommand()
6 7
     .help()
7 8
     .argv

+ 4
- 2
main.js View File

@@ -4,9 +4,11 @@ const App = require('./')
4 4
 const Server = require('./server')
5 5
 const yargs = require('yargs')
6 6
 
7
-const config = Config(constants.storage)
8
-const location = config.options.get('mount')
9 7
 const argv = yargs.argv
8
+const storage = argv.storage || constants.storage
9
+console.log(storage)
10
+const config = Config(storage, { mount: argv.location })
11
+const location = config.options.get('mount')
10 12
 
11 13
 const app = App(config, argv)
12 14
 Server(app, { location, ...argv })

+ 1
- 1
package.json View File

@@ -1,6 +1,6 @@
1 1
 {
2 2
   "name": "cobox-server",
3
-  "description": "client device server for cobox, manage your groups and talk to your cobox device",
3
+  "description": "server for cobox, manage your groups and talk to your cobox device",
4 4
   "version": "1.0.0",
5 5
   "main": "index.js",
6 6
   "bin": {

+ 2
- 2
test/controllers/groups/all.test.js View File

@@ -16,8 +16,8 @@ describe('GET /groups', (context) => {
16 16
   context.beforeEach((c) => {
17 17
     storage = tmp()
18 18
     count = 3
19
-    seeds = seedGroups(count)
20
-    config = Config(storage, { seeds })
19
+    config = Config(storage)
20
+    seeds = seedGroups(config, count)
21 21
 
22 22
     groups = {
23 23
       store: Store(

+ 3
- 3
test/controllers/groups/connections/create.test.js View File

@@ -17,9 +17,9 @@ describe('POST /groups/:id/connections', (context) => {
17 17
   context.beforeEach((c) => {
18 18
     storage = tmp()
19 19
     count = 3
20
-    seeds = seedGroups(count)
21
-    seed = Object.values(seeds.groups.byKey)[0]
22
-    config = Config(storage, { seeds })
20
+    config = Config(storage)
21
+    seedGroups(config, count)
22
+    seed = config.groups.list()[0]
23 23
 
24 24
     groups = {
25 25
       store: Store(

+ 3
- 3
test/controllers/groups/connections/destroy.test.js View File

@@ -17,9 +17,9 @@ describe('DELETE /groups/:id/connections', (context) => {
17 17
   context.beforeEach((c) => {
18 18
     storage = tmp()
19 19
     count = 3
20
-    seeds = seedGroups(count)
21
-    seed = Object.values(seeds.groups.byKey)[0]
22
-    config = Config(storage, { seeds })
20
+    config = Config(storage)
21
+    seeds = seedGroups(config, count)
22
+    seed = config.groups.list()[0]
23 23
 
24 24
     groups = {
25 25
       store: Store(

+ 3
- 3
test/controllers/groups/create.test.js View File

@@ -18,9 +18,9 @@ describe('POST /groups', (context) => {
18 18
   context.beforeEach((c) => {
19 19
     storage = tmp()
20 20
     count = 3
21
-    seeds = seedGroups(count)
22
-    seed = Object.values(seeds.groups.byKey)[0]
23
-    config = Config(storage, { seeds })
21
+    config = Config(storage)
22
+    seeds = seedGroups(config, count)
23
+    seed = config.groups.list()[0]
24 24
 
25 25
     groups = {
26 26
       store: Store(

+ 3
- 3
test/controllers/groups/find.test.js View File

@@ -16,9 +16,9 @@ describe('GET /groups/:id', (context) => {
16 16
   context.beforeEach((c) => {
17 17
     storage = tmp()
18 18
     count = 3
19
-    seeds = seedGroups(count)
20
-    seed = Object.values(seeds.groups.byKey)[0]
21
-    config = Config(storage, { seeds })
19
+    config = Config(storage)
20
+    seeds = seedGroups(config, count)
21
+    seed = config.groups.list()[0]
22 22
 
23 23
     groups = {
24 24
       store: Store(

+ 3
- 3
test/controllers/groups/mounts/create.test.js View File

@@ -17,9 +17,9 @@ describe('POST /groups/:id/mounts', (context) => {
17 17
   context.beforeEach((c) => {
18 18
     storage = tmp()
19 19
     count = 3
20
-    seeds = seedGroups(count)
21
-    seed = Object.values(seeds.groups.byKey)[0]
22
-    config = Config(storage, { seeds })
20
+    config = Config(storage)
21
+    seeds = seedGroups(config, count)
22
+    seed = config.groups.list()[0]
23 23
 
24 24
     groups = {
25 25
       store: Store(

+ 3
- 3
test/controllers/groups/mounts/destroy.test.js View File

@@ -17,9 +17,9 @@ describe('DELETE /groups/:id/mounts', (context) => {
17 17
   context.beforeEach((c) => {
18 18
     storage = tmp()
19 19
     count = 3
20
-    seeds = seedGroups(count)
21
-    seed = Object.values(seeds.groups.byKey)[0]
22
-    config = Config(storage, { seeds })
20
+    config = Config(storage)
21
+    seeds = seedGroups(config, count)
22
+    seed = config.groups.list()[0]
23 23
 
24 24
     groups = {
25 25
       store: Store(

+ 2
- 2
test/controllers/replicators/all.test.js View File

@@ -15,9 +15,9 @@ describe('GET /replicators', (context) => {
15 15
 
16 16
   context.beforeEach((c) => {
17 17
     storage = tmp()
18
+    config = Config(storage)
18 19
     count = 3
19
-    seeds = seedReplicators(count)
20
-    config = Config(storage, { seeds })
20
+    seeds = seedReplicators(config, count)
21 21
 
22 22
     replicators = {
23 23
       store: Store(

+ 4
- 4
test/controllers/replicators/connections/create.test.js View File

@@ -17,9 +17,9 @@ describe('POST /replicators/:id/connections', (context) => {
17 17
   context.beforeEach((c) => {
18 18
     storage = tmp()
19 19
     count = 3
20
-    seeds = seedReplicators(count)
21
-    seed = Object.values(seeds.replicators.byKey)[0]
22
-    config = Config(storage, { seeds })
20
+    config = Config(storage)
21
+    seeds = seedReplicators(config, count)
22
+    seed = config.replicators.list()[0]
23 23
 
24 24
     replicators = {
25 25
       store: Store(
@@ -74,7 +74,7 @@ describe('POST /replicators/:id/connections', (context) => {
74 74
       var data = response._getJSONData()
75 75
       let errors = data.errors
76 76
       assert.ok(Array.isArray(errors), 'returns an error')
77
-      assert.same(errors[0].msg, 'replicator does not exist', 'returns an error message')
77
+      assert.same(errors[0].msg, 'replicator does not exist, provide an address to replicate.', 'returns an error message')
78 78
       cleanup(storage, next)
79 79
     })
80 80
   })

+ 4
- 4
test/controllers/replicators/connections/destroy.test.js View File

@@ -17,9 +17,9 @@ describe('DELETE /replicators/:id/connections', (context) => {
17 17
   context.beforeEach((c) => {
18 18
     storage = tmp()
19 19
     count = 3
20
-    seeds = seedReplicators(count)
21
-    seed = Object.values(seeds.replicators.byKey)[0]
22
-    config = Config(storage, { seeds })
20
+    config = Config(storage)
21
+    seeds = seedReplicators(config, count)
22
+    seed = config.replicators.list()[0]
23 23
 
24 24
     replicators = {
25 25
       store: Store(
@@ -73,7 +73,7 @@ describe('DELETE /replicators/:id/connections', (context) => {
73 73
       var data = response._getJSONData()
74 74
       let errors = data.errors
75 75
       assert.ok(Array.isArray(errors), 'returns an error')
76
-      assert.same(errors[0].msg, 'replicator does not exist', 'returns an error message')
76
+      assert.same(errors[0].msg, 'replicator does not exist, provide an address to replicate.', 'returns an error message')
77 77
       cleanup(storage, next)
78 78
     })
79 79
   })

+ 3
- 3
test/controllers/replicators/create.test.js View File

@@ -18,9 +18,9 @@ describe('POST /replicators', (context) => {
18 18
   context.beforeEach((c) => {
19 19
     storage = tmp()
20 20
     count = 3
21
-    seeds = seedReplicators(count)
22
-    seed = Object.values(seeds.replicators.byKey)[0]
23
-    config = Config(storage, { seeds })
21
+    config = Config(storage)
22
+    seeds = seedReplicators(config, count)
23
+    seed = config.replicators.list()[0]
24 24
 
25 25
     replicators = {
26 26
       store: Store(

+ 3
- 3
test/controllers/replicators/find.test.js View File

@@ -16,9 +16,9 @@ describe('GET /replicators/:id', (context) => {
16 16
   context.beforeEach((c) => {
17 17
     storage = tmp()
18 18
     count = 3
19
-    seeds = seedReplicators(count)
20
-    seed = Object.values(seeds.replicators.byKey)[0]
21
-    config = Config(storage, { seeds })
19
+    config = Config(storage)
20
+    seeds = seedReplicators(config, count)
21
+    seed = config.replicators.list()[0]
22 22
 
23 23
     replicators = {
24 24
       store: Store(

+ 8
- 12
test/fixtures/groups.js View File

@@ -1,21 +1,17 @@
1 1
 const crypto = require('cobox-crypto')
2 2
 const randomWords = require('random-words')
3 3
 
4
-module.exports = function seedGroups (num) {
4
+module.exports = function seedGroups (config, num) {
5 5
   const groups = Array
6 6
     .from(new Array(num).keys())
7
-    .reduce((acc, name) => {
8
-      var address = crypto.address().toString('hex'),
9
-        encryptionKey = crypto.encryptionKey().toString('hex'),
7
+    .forEach((i) => {
8
+      var address = crypto.address(),
9
+        encryptionKey = crypto.encryptionKey(),
10 10
         name = randomWords(1).pop()
11 11
 
12
-      var groupOpts = { name, address, encryptionKey }
12
+      var entry = { name, address, encryptionKey }
13
+      config.groups.set(name, entry)
14
+    })
13 15
 
14
-      acc.byKey[address] = groupOpts
15
-      acc.byName[name] = groupOpts
16
-
17
-      return acc
18
-    }, { byKey: [], byName: [] })
19
-
20
-  return { groups }
16
+  return config.save()
21 17
 }

+ 7
- 11
test/fixtures/replicators.js View File

@@ -1,20 +1,16 @@
1 1
 const crypto = require('cobox-crypto')
2 2
 const randomWords = require('random-words')
3 3
 
4
-module.exports = function seedReplicators (num) {
4
+module.exports = function seedReplicators (config, num) {
5 5
   const replicators = Array
6 6
     .from(new Array(num).keys())
7
-    .reduce((acc, name) => {
8
-      var address = crypto.address().toString('hex'),
7
+    .forEach((i) => {
8
+      var address = crypto.address(),
9 9
         name = randomWords(1).pop()
10 10
 
11
-      var opts = { name, address }
11
+      var entry = { name, address }
12
+      config.replicators.set(name, entry)
13
+    })
12 14
 
13
-      acc.byKey[address] = opts
14
-      acc.byName[name] = opts
15
-
16
-      return acc
17
-    }, { byKey: [], byName: [] })
18
-
19
-  return { replicators }
15
+  return config.save()
20 16
 }

+ 35
- 50
yarn.lock View File

@@ -603,11 +603,11 @@ clone@^2.1.2:
603 603
 
604 604
 "cobox-blind-replicator@git+https://ledger-git.dyne.org/cobox/cobox-blind-replicator":
605 605
   version "0.1.0"
606
-  resolved "git+https://ledger-git.dyne.org/cobox/cobox-blind-replicator#08659a99f391e59015d2a84522505ba1a90b6fef"
606
+  resolved "git+https://ledger-git.dyne.org/cobox/cobox-blind-replicator#47139886090986b9a26920f81cde8cb974c1cdd9"
607 607
   dependencies:
608 608
     assert "^2.0.0"
609
-    cobox-group-base "git+https://ledger-git.dyne.org/cobox/cobox-group-base"
610
-    cobox-swarm "git+https://ledger-git.dyne.org/cobox/cobox-swarm"
609
+    cobox-group-base "git+https://ledger-git.dyne.org/cobox/cobox-group-base#development"
610
+    cobox-swarm "git+https://ledger-git.dyne.org/cobox/cobox-swarm#development"
611 611
     thunky "^1.1.0"
612 612
 
613 613
 "cobox-config@git+https://ledger-git.dyne.org/CoBox/cobox-config#development":
@@ -684,6 +684,20 @@ cobox-constants@^1.0.0:
684 684
     random-access-file "^2.1.3"
685 685
     random-access-memory "^3.1.1"
686 686
 
687
+"cobox-group-base@git+https://ledger-git.dyne.org/cobox/cobox-group-base#development":
688
+  version "0.1.0"
689
+  resolved "git+https://ledger-git.dyne.org/cobox/cobox-group-base#18e4c70d130898b0c1db433c40e9acbe6a7945a5"
690
+  dependencies:
691
+    assert "^2.0.0"
692
+    call-me-maybe "^1.0.1"
693
+    cobox-config "git+https://ledger-git.dyne.org/CoBox/cobox-config#development"
694
+    cobox-constants "^1.0.0"
695
+    cobox-crypto "git+https://ledger-git.dyne.org/CoBox/cobox-crypto#development"
696
+    debug "^4.1.1"
697
+    multifeed "^5.1.1"
698
+    random-access-file "^2.1.3"
699
+    random-access-memory "^3.1.1"
700
+
687 701
 "cobox-group-store@git+https://ledger-git.dyne.org/cobox/cobox-group-store#development":
688 702
   version "1.0.0"
689 703
   resolved "git+https://ledger-git.dyne.org/cobox/cobox-group-store#28a2a2ad34aeeef5b31fcdda539374220b24be2e"
@@ -697,38 +711,23 @@ cobox-constants@^1.0.0:
697 711
 
698 712
 "cobox-group@git+https://ledger-git.dyne.org/cobox/cobox-group#development":
699 713
   version "2.0.0"
700
-  resolved "git+https://ledger-git.dyne.org/cobox/cobox-group#28629972954b0bbdd682504a78056549a4151045"
714
+  resolved "git+https://ledger-git.dyne.org/cobox/cobox-group#49904ec592669d60f5b2552a8e93af0847dc49c0"
701 715
   dependencies:
702 716
     assert "^2.0.0"
703
-    call-me-maybe "^1.0.1"
704 717
     cobox-config "git+https://ledger-git.dyne.org/cobox/cobox-config#development"
705 718
     cobox-constants "^1.0.0"
706 719
     cobox-crypto "git+https://ledger-git.dyne.org/cobox/cobox-crypto"
707 720
     cobox-group-base "git+https://ledger-git.dyne.org/cobox/cobox-group-base"
708 721
     cobox-swarm "git+https://ledger-git.dyne.org/cobox/cobox-swarm#development"
709 722
     kappa-core "^6.0.0"
710
-    kappa-drive "git+https://ledger-git.dyne.org/cobox/kappa-drive"
723
+    kappa-drive "git+https://ledger-git.dyne.org/cobox/kappa-drive#development"
711 724
     kappa-drive-mount "^1.0.1"
712 725
     kappa-view-query "^2.0.7"
713 726
     level "^5.0.1"
714 727
     level-live-stream "^1.4.12"
715 728
     memdb "^1.3.1"
716 729
     mkdirp "^0.5.1"
717
-    multifeed "^5.1.0"
718
-    os "^0.1.1"
719 730
     protocol-buffers "^4.1.0"
720
-    random-access-file "^2.1.3"
721
-    random-access-memory "^3.1.1"
722
-
723
-"cobox-swarm@git+https://ledger-git.dyne.org/cobox/cobox-swarm":
724
-  version "1.0.0"
725
-  resolved "git+https://ledger-git.dyne.org/cobox/cobox-swarm#cf71f7f2e3207e3d4b50e3403b192e8870d1c026"
726
-  dependencies:
727
-    dat-swarm-defaults "^1.0.2"
728
-    debug "^4.1.1"
729
-    discovery-swarm "^6.0.0"
730
-    hyperswarm "^2.3.1"
731
-    pump "^3.0.0"
732 731
 
733 732
 "cobox-swarm@git+https://ledger-git.dyne.org/cobox/cobox-swarm#development":
734 733
   version "1.0.0"
@@ -1094,9 +1093,9 @@ detect-libc@^1.0.2:
1094 1093
   integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
1095 1094
 
1096 1095
 dht-rpc@^4.2.0:
1097
-  version "4.2.0"
1098
-  resolved "https://registry.yarnpkg.com/dht-rpc/-/dht-rpc-4.2.0.tgz#940c56752b8fa1bb666ea2d1e78330805d6af7a4"
1099
-  integrity sha512-QngXvqy8VzIR2EwWTvZDKhDVKTVpXKRTQaqykWDgNnnILrHKp5Rd8dX9/nfc70sfpjE+7b6E1MtdVlRH1ce9Jw==
1096
+  version "4.3.0"
1097
+  resolved "https://registry.yarnpkg.com/dht-rpc/-/dht-rpc-4.3.0.tgz#53ba196c1119cb54a8a975a175aeeefa32fc13c4"
1098
+  integrity sha512-FYdyqwQ15SQcgsdJnkct4CxZ0h7oyeBqgoL/U5BwR3mn1qmb5wSKGo82bhgq864tLSa41oPefTyVRJH/4SO8TA==
1100 1099
   dependencies:
1101 1100
     codecs "^2.0.0"
1102 1101
     ipv4-peers "^2.0.0"
@@ -1231,9 +1230,9 @@ errno@~0.1.1:
1231 1230
     prr "~1.0.1"
1232 1231
 
1233 1232
 es-abstract@^1.12.0, es-abstract@^1.5.0:
1234
-  version "1.16.2"
1235
-  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.16.2.tgz#4e874331645e9925edef141e74fc4bd144669d34"
1236
-  integrity sha512-jYo/J8XU2emLXl3OLwfwtuFfuF2w6DYPs+xy9ZfVyPkDcrauu6LYrw/q2TyCtrbc/KUdCiC5e9UajRhgNkVopA==
1233
+  version "1.16.3"
1234
+  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.16.3.tgz#52490d978f96ff9f89ec15b5cf244304a5bca161"
1235
+  integrity sha512-WtY7Fx5LiOnSYgF5eg/1T+GONaGmpvpPdCpSnYij+U2gDTL0UPfWrhDw7b2IYb+9NQJsYpCA0wOQvZfsd6YwRw==
1237 1236
   dependencies:
1238 1237
     es-to-primitive "^1.2.1"
1239 1238
     function-bind "^1.1.1"
@@ -1787,7 +1786,7 @@ hypercore-crypto@^1.0.0:
1787 1786
     sodium-universal "^2.0.0"
1788 1787
     uint64be "^2.0.2"
1789 1788
 
1790
-hypercore-protocol@^6.11.0, hypercore-protocol@^6.5.0, hypercore-protocol@^6.8.0:
1789
+hypercore-protocol@^6.11.0, hypercore-protocol@^6.5.0:
1791 1790
   version "6.12.0"
1792 1791
   resolved "https://registry.yarnpkg.com/hypercore-protocol/-/hypercore-protocol-6.12.0.tgz#0fafa7c047a7e4c35b2d77639e2489f60d7b1a0d"
1793 1792
   integrity sha512-T3oy9/7QFejqJX2RGcCUU1944e5/eKbLlSz9JPTNN1QbYFJgat/r7eTyOO8SMSLUimUmQx6YBMKhgYbdKzp7Bw==
@@ -2360,9 +2359,9 @@ kappa-drive-mount@^1.0.1:
2360 2359
     mkdirp "^0.5.1"
2361 2360
     rimraf "^2.6.3"
2362 2361
 
2363
-kappa-drive@^1.1.0, "kappa-drive@git+https://ledger-git.dyne.org/cobox/kappa-drive":
2362
+kappa-drive@^1.1.0, "kappa-drive@git+https://ledger-git.dyne.org/cobox/kappa-drive#development":
2364 2363
   version "1.1.0"
2365
-  resolved "git+https://ledger-git.dyne.org/cobox/kappa-drive#9717a38159a7f5e727264a36d0f7edd184b791ab"
2364
+  resolved "git+https://ledger-git.dyne.org/cobox/kappa-drive#bcb3a48bd3fe8dda4969b86d65a5075b3e8f2281"
2366 2365
   dependencies:
2367 2366
     assert "^2.0.0"
2368 2367
     call-me-maybe "^1.0.1"
@@ -2381,7 +2380,6 @@ kappa-drive@^1.1.0, "kappa-drive@git+https://ledger-git.dyne.org/cobox/kappa-dri
2381 2380
     memdb "^1.3.1"
2382 2381
     minimist "^1.2.0"
2383 2382
     mountable-hypertrie "^0.10.4"
2384
-    multifeed "^4.1.5"
2385 2383
     protocol-buffers "^4.1.0"
2386 2384
     random-access-memory "^3.1.1"
2387 2385
     through2 "^3.0.1"
@@ -2883,23 +2881,10 @@ multifeed-index@^3.3.2:
2883 2881
   dependencies:
2884 2882
     inherits "^2.0.3"
2885 2883
 
2886
-multifeed@^4.1.5:
2887
-  version "4.2.1"
2888
-  resolved "https://registry.yarnpkg.com/multifeed/-/multifeed-4.2.1.tgz#0cc37210228c1ba31a0de0e3135014017ce03f48"
2889
-  integrity sha512-m2YSuv9Nwp5RLneT6eGB+5BMu0V2bDEiu73dFpeVUptj5oQJjbJXj9DUx496aEiDFexVK7yRkJKgrZBF8QUV9w==
2890
-  dependencies:
2891
-    debug "^4.1.0"
2892
-    hypercore-protocol "^6.8.0"
2893
-    inherits "^2.0.3"
2894
-    mutexify "^1.2.0"
2895
-    random-access-file "^2.0.1"
2896
-    random-access-memory "^3.1.1"
2897
-    through2 "^3.0.0"
2898
-
2899
-multifeed@^5.0.0, multifeed@^5.1.0:
2900
-  version "5.1.0"
2901
-  resolved "https://registry.yarnpkg.com/multifeed/-/multifeed-5.1.0.tgz#71fdfeb3b126eeecb4399f11b50f4c428b1bee47"
2902
-  integrity sha512-pDqv++tRgrbRTA4De/BJ1YqRExbTBpeJhxiKCLf92I6Wrr4uqlOTQA60wW59iXMOpzO/y64RlRkE3oNkrI/CkA==
2884
+multifeed@^5.0.0, multifeed@^5.1.0, multifeed@^5.1.1:
2885
+  version "5.1.1"
2886
+  resolved "https://registry.yarnpkg.com/multifeed/-/multifeed-5.1.1.tgz#d151c6fe641ec72a2f99b839f2155e4278f1baf6"
2887
+  integrity sha512-a/AHR/MXUF24CvCNc/lHZSw2eBrxH6gn0l2Ou95sij+pyU/AFJT70+0o1cMRnbWvMxeoC4pIKqEKSHqxY00O3w==
2903 2888
   dependencies:
2904 2889
     debug "^4.1.0"
2905 2890
     hypercore "^8.3.0"
@@ -4508,9 +4493,9 @@ unordered-array-remove@^1.0.2:
4508 4493
   integrity sha1-xUbo+I4xegzyZEyX7LV9umbSUO8=
4509 4494
 
4510 4495
 unordered-materialized-kv@^1.2.1:
4511
-  version "1.2.1"
4512
-  resolved "https://registry.yarnpkg.com/unordered-materialized-kv/-/unordered-materialized-kv-1.2.1.tgz#e6d689e2715e2adf537df9549156d6a306e29608"
4513
-  integrity sha512-Rwa4Or4sMGcSVxtO9dze0qyInVbSC8x/Lt6EZP8rbM43wQDbIvBnUXSlsqnQK4DpjOGYBNRVlT/PDDtFvtSpHA==
4496
+  version "1.3.0"
4497
+  resolved "https://registry.yarnpkg.com/unordered-materialized-kv/-/unordered-materialized-kv-1.3.0.tgz#54625bd766489c4ded0200d555b631ebc47177c4"
4498
+  integrity sha512-7L4XGdSRoBByKczlh09+7tN4ku9s8wOhQIkmRY8Ko6/lXd5spd/kBhGqdCGIcnltD+IVJrN1zX3Ic8WLHhS4hA==
4514 4499
   dependencies:
4515 4500
     once "^1.4.0"
4516 4501