node-datachannel 0.1.11 → 0.1.14

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.
Files changed (52) hide show
  1. package/CMakeLists.txt +13 -3
  2. package/README.md +2 -7
  3. package/node_modules/delegates/package.json +0 -1
  4. package/node_modules/has-unicode/package.json +0 -1
  5. package/node_modules/ini/ini.js +49 -37
  6. package/node_modules/ini/package.json +22 -19
  7. package/node_modules/node-abi/.github/workflows/update-abi.yml +1 -1
  8. package/node_modules/node-abi/.travis.yml +2 -4
  9. package/node_modules/node-abi/README.md +1 -1
  10. package/node_modules/node-abi/abi_registry.json +46 -1
  11. package/node_modules/node-abi/index.js +7 -1
  12. package/node_modules/node-abi/package.json +10 -11
  13. package/node_modules/node-abi/scripts/update-abi-registry.js +11 -5
  14. package/node_modules/prebuild-install/CHANGELOG.md +75 -1
  15. package/node_modules/prebuild-install/README.md +43 -12
  16. package/node_modules/prebuild-install/asset.js +1 -5
  17. package/node_modules/prebuild-install/bin.js +4 -11
  18. package/node_modules/prebuild-install/download.js +55 -43
  19. package/node_modules/prebuild-install/help.txt +2 -0
  20. package/node_modules/prebuild-install/log.js +12 -0
  21. package/node_modules/prebuild-install/package.json +14 -15
  22. package/node_modules/prebuild-install/proxy.js +2 -5
  23. package/node_modules/prebuild-install/rc.js +11 -32
  24. package/node_modules/prebuild-install/util.js +49 -3
  25. package/node_modules/readable-stream/package.json +0 -1
  26. package/node_modules/safe-buffer/package.json +0 -1
  27. package/node_modules/string-width/package.json +2 -3
  28. package/package.json +19 -10
  29. package/src/data-channel-wrapper.cpp +62 -30
  30. package/src/data-channel-wrapper.h +19 -9
  31. package/src/peer-connection-wrapper.cpp +56 -28
  32. package/src/peer-connection-wrapper.h +19 -9
  33. package/src/rtc-wrapper.cpp +11 -1
  34. package/src/rtc-wrapper.h +3 -1
  35. package/src/thread-safe-callback.cpp +69 -0
  36. package/src/thread-safe-callback.h +57 -0
  37. package/test/connectivity.js +2 -1
  38. package/test/test.js +111 -112
  39. package/node_modules/noop-logger/.npmignore +0 -1
  40. package/node_modules/noop-logger/History.md +0 -16
  41. package/node_modules/noop-logger/Makefile +0 -8
  42. package/node_modules/noop-logger/Readme.md +0 -27
  43. package/node_modules/noop-logger/circle.yml +0 -9
  44. package/node_modules/noop-logger/lib/index.js +0 -25
  45. package/node_modules/noop-logger/package.json +0 -51
  46. package/node_modules/noop-logger/test/index.js +0 -18
  47. package/node_modules/prebuild-install/.travis.yml +0 -12
  48. package/node_modules/prebuild-install/appveyor.yml +0 -40
  49. package/node_modules/which-pm-runs/LICENSE +0 -21
  50. package/node_modules/which-pm-runs/README.md +0 -29
  51. package/node_modules/which-pm-runs/index.js +0 -17
  52. package/node_modules/which-pm-runs/package.json +0 -64
package/test/test.js CHANGED
@@ -35,115 +35,114 @@ describe('PeerConnection Classes', () => {
35
35
  });
36
36
 
37
37
 
38
- // describe('P2P', () => {
39
- // let peer1 = new nodeDataChannel.PeerConnection("Peer1", { iceServers: ["stun:stun.l.google.com:19302"] });
40
- // let peer2 = new nodeDataChannel.PeerConnection("Peer2", { iceServers: ["stun:stun.l.google.com:19302"] });
41
- // let dc1 = null;
42
- // let dc2 = null;
43
-
44
- // // Mocks
45
- // const p1StateMock = jest.fn();
46
- // const p1GatheringStateMock = jest.fn();
47
- // const p2StateMock = jest.fn();
48
- // const p2GatheringStateMock = jest.fn();
49
- // const p1SDPMock = jest.fn();
50
- // const p1CandidateMock = jest.fn();
51
- // const p2SDPMock = jest.fn();
52
- // const p2CandidateMock = jest.fn();
53
-
54
- // const p1DCMock = jest.fn();
55
- // const p1DCMessageMock = jest.fn();
56
- // const p2DCMock = jest.fn();
57
- // const p2DCMessageMock = jest.fn();
58
-
59
- // // Set Callbacks
60
- // peer1.onStateChange(p1StateMock);
61
- // peer1.onGatheringStateChange(p1GatheringStateMock);
62
- // peer1.onLocalDescription((sdp, type) => {
63
- // p1SDPMock();
64
- // peer2.setRemoteDescription(sdp, type);
65
- // });
66
- // peer1.onLocalCandidate((candidate, mid) => {
67
- // p1CandidateMock();
68
- // peer2.addRemoteCandidate(candidate, mid);
69
- // });
70
-
71
- // // Set Callbacks
72
- // peer2.onStateChange(p2StateMock);
73
- // peer2.onGatheringStateChange(p2GatheringStateMock);
74
- // peer2.onLocalDescription((sdp, type) => {
75
- // p2SDPMock();
76
- // peer1.setRemoteDescription(sdp, type);
77
- // });
78
- // peer2.onLocalCandidate((candidate, mid) => {
79
- // p2CandidateMock();
80
- // peer1.addRemoteCandidate(candidate, mid);
81
- // });
82
- // peer2.onDataChannel((dc) => {
83
- // p2DCMock();
84
- // dc2 = dc;
85
- // dc2.onMessage((msg) => {
86
- // p2DCMessageMock(msg);
87
- // });
88
- // dc2.sendMessage("Hello From Peer2");
89
- // });
90
-
91
- // dc1 = peer1.createDataChannel("test-p2p");
92
- // dc1.onOpen(() => {
93
- // p1DCMock();
94
- // dc1.sendMessage("Hello From Peer1");
95
- // });
96
- // dc1.onMessage((msg) => {
97
- // p1DCMessageMock(msg);
98
- // });
99
-
100
- // test('P2P', (done) => {
101
- // // Default is 5000 ms but we need more
102
- // jest.setTimeout(30000);
103
-
104
- // setTimeout(() => {
105
- // dc1.close();
106
- // dc2.close();
107
- // peer1.close();
108
- // peer2.close();
109
-
110
- // // Fee memory
111
- // dc1 = null;
112
- // dc2 = null;
113
- // peer1 = null;
114
- // peer2 = null;
115
-
116
- // // Cleanup Threads
117
- // nodeDataChannel.cleanup();
118
- // }, 8 * 1000);
119
-
120
- // setTimeout(() => {
121
- // // State Callbacks
122
- // expect(p1StateMock.mock.calls.length).toBeGreaterThanOrEqual(1);
123
- // expect(p1GatheringStateMock.mock.calls.length).toBeGreaterThanOrEqual(1);
124
- // expect(p2StateMock.mock.calls.length).toBeGreaterThanOrEqual(1);
125
- // expect(p2GatheringStateMock.mock.calls.length).toBeGreaterThanOrEqual(1);
126
-
127
- // // SDP
128
- // expect(p1SDPMock.mock.calls.length).toBe(1);
129
- // expect(p2SDPMock.mock.calls.length).toBe(1);
130
-
131
- // // Candidates
132
- // expect(p1CandidateMock.mock.calls.length).toBeGreaterThanOrEqual(1);
133
- // expect(p2CandidateMock.mock.calls.length).toBeGreaterThanOrEqual(1);
134
-
135
- // // DataChannel
136
- // expect(p1DCMock.mock.calls.length).toBe(1);
137
- // expect(p1DCMessageMock.mock.calls.length).toBe(1);
138
- // expect(p1DCMessageMock.mock.calls[0][0]).toEqual("Hello From Peer2");
139
- // expect(p2DCMock.mock.calls.length).toBe(1);
140
- // // These 2 tests fails randomly
141
- // // Needs investigation ?
142
- // // expect(p2DCMessageMock.mock.calls.length).toBe(1);
143
- // // expect(p2DCMessageMock.mock.calls[0][0]).toEqual("Hello From Peer1");
144
-
145
- // done();
146
- // }, 20 * 1000);
147
-
148
- // });
149
- // });
38
+ describe('P2P', () => {
39
+ // Default is 5000 ms but we need more
40
+ jest.setTimeout(30000);
41
+
42
+ let peer1 = new nodeDataChannel.PeerConnection("Peer1", { iceServers: ["stun:stun.l.google.com:19302"] });
43
+ let peer2 = new nodeDataChannel.PeerConnection("Peer2", { iceServers: ["stun:stun.l.google.com:19302"] });
44
+ let dc1 = null;
45
+ let dc2 = null;
46
+
47
+ // Mocks
48
+ const p1StateMock = jest.fn();
49
+ const p1GatheringStateMock = jest.fn();
50
+ const p2StateMock = jest.fn();
51
+ const p2GatheringStateMock = jest.fn();
52
+ const p1SDPMock = jest.fn();
53
+ const p1CandidateMock = jest.fn();
54
+ const p2SDPMock = jest.fn();
55
+ const p2CandidateMock = jest.fn();
56
+
57
+ const p1DCMock = jest.fn();
58
+ const p1DCMessageMock = jest.fn();
59
+ const p2DCMock = jest.fn();
60
+ const p2DCMessageMock = jest.fn();
61
+
62
+ // Set Callbacks
63
+ peer1.onStateChange(p1StateMock);
64
+ peer1.onGatheringStateChange(p1GatheringStateMock);
65
+ peer1.onLocalDescription((sdp, type) => {
66
+ p1SDPMock();
67
+ peer2.setRemoteDescription(sdp, type);
68
+ });
69
+ peer1.onLocalCandidate((candidate, mid) => {
70
+ p1CandidateMock();
71
+ peer2.addRemoteCandidate(candidate, mid);
72
+ });
73
+
74
+ // Set Callbacks
75
+ peer2.onStateChange(p2StateMock);
76
+ peer2.onGatheringStateChange(p2GatheringStateMock);
77
+ peer2.onLocalDescription((sdp, type) => {
78
+ p2SDPMock();
79
+ peer1.setRemoteDescription(sdp, type);
80
+ });
81
+ peer2.onLocalCandidate((candidate, mid) => {
82
+ p2CandidateMock();
83
+ peer1.addRemoteCandidate(candidate, mid);
84
+ });
85
+ peer2.onDataChannel((dc) => {
86
+ p2DCMock();
87
+ dc2 = dc;
88
+ dc2.onMessage((msg) => {
89
+ p2DCMessageMock(msg);
90
+ });
91
+ dc2.sendMessage("Hello From Peer2");
92
+ });
93
+
94
+ dc1 = peer1.createDataChannel("test-p2p");
95
+ dc1.onOpen(() => {
96
+ p1DCMock();
97
+ dc1.sendMessage("Hello From Peer1");
98
+ });
99
+ dc1.onMessage((msg) => {
100
+ p1DCMessageMock(msg);
101
+ });
102
+
103
+ test('P2P', (done) => {
104
+ setTimeout(() => {
105
+ dc1.close();
106
+ dc2.close();
107
+ peer1.close();
108
+ peer2.close();
109
+
110
+ // Fee memory
111
+ dc1 = null;
112
+ dc2 = null;
113
+ peer1 = null;
114
+ peer2 = null;
115
+
116
+ // Cleanup Threads
117
+ nodeDataChannel.cleanup();
118
+ }, 10 * 1000);
119
+
120
+ setTimeout(() => {
121
+ // State Callbacks
122
+ expect(p1StateMock.mock.calls.length).toBeGreaterThanOrEqual(1);
123
+ expect(p1GatheringStateMock.mock.calls.length).toBeGreaterThanOrEqual(1);
124
+ expect(p2StateMock.mock.calls.length).toBeGreaterThanOrEqual(1);
125
+ expect(p2GatheringStateMock.mock.calls.length).toBeGreaterThanOrEqual(1);
126
+
127
+ // SDP
128
+ expect(p1SDPMock.mock.calls.length).toBe(1);
129
+ expect(p2SDPMock.mock.calls.length).toBe(1);
130
+
131
+ // Candidates
132
+ expect(p1CandidateMock.mock.calls.length).toBeGreaterThanOrEqual(1);
133
+ expect(p2CandidateMock.mock.calls.length).toBeGreaterThanOrEqual(1);
134
+
135
+ // DataChannel
136
+ expect(p1DCMock.mock.calls.length).toBe(1);
137
+ expect(p1DCMessageMock.mock.calls.length).toBe(1);
138
+ expect(p1DCMessageMock.mock.calls[0][0]).toEqual("Hello From Peer2");
139
+ expect(p2DCMock.mock.calls.length).toBe(1);
140
+
141
+ expect(p2DCMessageMock.mock.calls.length).toBe(1);
142
+ expect(p2DCMessageMock.mock.calls[0][0]).toEqual("Hello From Peer1");
143
+
144
+ done();
145
+ }, 12 * 1000);
146
+
147
+ });
148
+ });
@@ -1 +0,0 @@
1
- node_modules
@@ -1,16 +0,0 @@
1
-
2
- 0.1.1 / 2016-02-16
3
- ==================
4
-
5
- * add logger.verbose
6
-
7
- 0.1.0 / 2014-04-04
8
- ==================
9
-
10
- * add ci
11
- * add critical, alert and emergency
12
- * docs
13
-
14
- 0.0.1 - February 27, 2013
15
- -------------------------
16
- :sparkles:
@@ -1,8 +0,0 @@
1
-
2
- node_modules: package.json
3
- @npm install
4
-
5
- test: node_modules
6
- @./node_modules/.bin/mocha --reporter spec
7
-
8
- .PHONY: test
@@ -1,27 +0,0 @@
1
- [![Build Status](https://circleci.com/gh/segmentio/noop-logger.png?circle-token=3281390270513cae0e50fd18b8d972eb48a56879)](https://circleci.com/gh/segmentio/noop-logger)
2
-
3
- # noop-logger
4
-
5
- A logger that does exactly nothing, useful when you want to test modules that require a logger to be passed in.
6
-
7
- ## Installation
8
-
9
- $ npm install noop-logger
10
-
11
- ## API
12
-
13
- Exposes the following noops:
14
-
15
- - `logger.debug`
16
- - `logger.info`
17
- - `logger.warn`
18
- - `logger.error`
19
- - `logger.critical`
20
- - `logger.alert`
21
- - `logger.emergency`
22
- - `logger.notice`
23
- - `logger.fatal`
24
-
25
- ## License
26
-
27
- MIT
@@ -1,9 +0,0 @@
1
- machine:
2
- node:
3
- version: 0.10.26
4
- checkout:
5
- post:
6
- - echo "_auth = `printf $AUTH`" > npmrc
7
- dependencies:
8
- override:
9
- - npm install --userconfig npmrc --registry https://segmentio.registry.nodejitsu.com --no-strict-ssl --always-auth
@@ -1,25 +0,0 @@
1
-
2
- /**
3
- * Methods.
4
- */
5
-
6
- var methods = [
7
- 'debug',
8
- 'info',
9
- 'warn',
10
- 'error',
11
- 'critical',
12
- 'alert',
13
- 'emergency',
14
- 'notice',
15
- 'verbose',
16
- 'fatal'
17
- ];
18
-
19
- /**
20
- * Expose methods.
21
- */
22
-
23
- methods.forEach(function(method){
24
- exports[method] = function(){};
25
- });
@@ -1,51 +0,0 @@
1
- {
2
- "_args": [
3
- [
4
- "noop-logger@0.1.1",
5
- "/home/runner/work/node-datachannel/node-datachannel"
6
- ]
7
- ],
8
- "_from": "noop-logger@0.1.1",
9
- "_id": "noop-logger@0.1.1",
10
- "_inBundle": false,
11
- "_integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=",
12
- "_location": "/noop-logger",
13
- "_phantomChildren": {},
14
- "_requested": {
15
- "type": "version",
16
- "registry": true,
17
- "raw": "noop-logger@0.1.1",
18
- "name": "noop-logger",
19
- "escapedName": "noop-logger",
20
- "rawSpec": "0.1.1",
21
- "saveSpec": null,
22
- "fetchSpec": "0.1.1"
23
- },
24
- "_requiredBy": [
25
- "/prebuild",
26
- "/prebuild-install"
27
- ],
28
- "_resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz",
29
- "_spec": "0.1.1",
30
- "_where": "/home/runner/work/node-datachannel/node-datachannel",
31
- "bugs": {
32
- "url": "https://github.com/segmentio/noop-logger/issues"
33
- },
34
- "dependencies": {},
35
- "description": "A logger that does exactly nothing.",
36
- "devDependencies": {
37
- "mocha": "1.x"
38
- },
39
- "homepage": "https://github.com/segmentio/noop-logger#readme",
40
- "license": "MIT",
41
- "main": "lib/index.js",
42
- "name": "noop-logger",
43
- "repository": {
44
- "type": "git",
45
- "url": "git://github.com/segmentio/noop-logger.git"
46
- },
47
- "scripts": {
48
- "test": "mocha"
49
- },
50
- "version": "0.1.1"
51
- }
@@ -1,18 +0,0 @@
1
-
2
- var assert = require('assert');
3
- var logger = require('..');
4
-
5
- describe('noop-logger', function(){
6
- it('should expose methods', function(){
7
- assert.equal('function', typeof logger.debug);
8
- assert.equal('function', typeof logger.info);
9
- assert.equal('function', typeof logger.warn);
10
- assert.equal('function', typeof logger.error);
11
- assert.equal('function', typeof logger.critical);
12
- assert.equal('function', typeof logger.alert);
13
- assert.equal('function', typeof logger.emergency);
14
- assert.equal('function', typeof logger.notice);
15
- assert.equal('function', typeof logger.verbose);
16
- assert.equal('function', typeof logger.fatal);
17
- });
18
- });
@@ -1,12 +0,0 @@
1
- language: node_js
2
-
3
- os:
4
- - linux
5
- - osx
6
-
7
- node_js:
8
- - 6
9
- - 8
10
- - 10
11
- - 12
12
- - 14
@@ -1,40 +0,0 @@
1
- # http://www.appveyor.com/docs/appveyor-yml
2
-
3
- # Don't actually build
4
- build: off
5
-
6
- # Skip tag builds
7
- skip_tags: true
8
-
9
- # Set build version format
10
- version: "{build}"
11
-
12
- # Set up build environment
13
- environment:
14
- # Test against these versions of Node.js
15
- matrix:
16
- - nodejs_version: "14.2.0"
17
- - nodejs_version: "12"
18
- - nodejs_version: "10"
19
- - nodejs_version: "8"
20
- - nodejs_version: "6"
21
-
22
- # Build on both platforms
23
- platform:
24
- - x86
25
- - x64
26
-
27
- # Install scripts (runs after repo cloning)
28
- install:
29
- # Get the latest version of $env:nodejs_version
30
- - ps: Update-NodeJsInstallation (Get-NodeJsLatestBuild $env:nodejs_version) $env:platform
31
- # Output useful info for debugging
32
- - node --version
33
- - npm --version
34
- # Install modules
35
- - npm install
36
-
37
- # Post-install test scripts
38
- test_script:
39
- # Run module tests
40
- - npm test
@@ -1,21 +0,0 @@
1
- The MIT License (MIT)
2
-
3
- Copyright (c) 2017 Zoltan Kochan
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
@@ -1,29 +0,0 @@
1
- # which-pm-runs
2
-
3
- > Detects what package manager executes the process
4
-
5
- [![npm version](https://img.shields.io/npm/v/which-pm-runs.svg)](https://www.npmjs.com/package/which-pm-runs) [![Build Status](https://img.shields.io/travis/zkochan/which-pm-runs/master.svg)](https://travis-ci.org/zkochan/which-pm-runs)
6
-
7
- ## Installation
8
-
9
- ```
10
- npm i which-pm-runs
11
- ```
12
-
13
- ## Usage
14
-
15
- ```js
16
- 'use strict'
17
- const whichPMRuns = require('which-pm-runs')
18
-
19
- whichPMRuns()
20
- //> {name: "pnpm", version: "0.64.2"}
21
- ```
22
-
23
- ## Related
24
-
25
- * [which-pm](https://github.com/zkochan/which-pm) - Detects what package manager was used for installation
26
-
27
- ## License
28
-
29
- [MIT](LICENSE) © [Zoltan Kochan](http://kochan.io)
@@ -1,17 +0,0 @@
1
- 'use strict'
2
-
3
- module.exports = function () {
4
- if (!process.env.npm_config_user_agent) {
5
- return undefined
6
- }
7
- return pmFromUserAgent(process.env.npm_config_user_agent)
8
- }
9
-
10
- function pmFromUserAgent (userAgent) {
11
- const pmSpec = userAgent.split(' ')[0]
12
- const separatorPos = pmSpec.lastIndexOf('/')
13
- return {
14
- name: pmSpec.substr(0, separatorPos),
15
- version: pmSpec.substr(separatorPos + 1)
16
- }
17
- }
@@ -1,64 +0,0 @@
1
- {
2
- "_args": [
3
- [
4
- "which-pm-runs@1.0.0",
5
- "/home/runner/work/node-datachannel/node-datachannel"
6
- ]
7
- ],
8
- "_from": "which-pm-runs@1.0.0",
9
- "_id": "which-pm-runs@1.0.0",
10
- "_inBundle": false,
11
- "_integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=",
12
- "_location": "/which-pm-runs",
13
- "_phantomChildren": {},
14
- "_requested": {
15
- "type": "version",
16
- "registry": true,
17
- "raw": "which-pm-runs@1.0.0",
18
- "name": "which-pm-runs",
19
- "escapedName": "which-pm-runs",
20
- "rawSpec": "1.0.0",
21
- "saveSpec": null,
22
- "fetchSpec": "1.0.0"
23
- },
24
- "_requiredBy": [
25
- "/prebuild-install"
26
- ],
27
- "_resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz",
28
- "_spec": "1.0.0",
29
- "_where": "/home/runner/work/node-datachannel/node-datachannel",
30
- "author": {
31
- "name": "Zoltan Kochan"
32
- },
33
- "bugs": {
34
- "url": "https://github.com/zkochan/which-pm-runs/issues"
35
- },
36
- "description": "Detects what package manager executes the process",
37
- "devDependencies": {
38
- "execa": "^0.6.3",
39
- "npm": "^4.4.4",
40
- "pnpm": "^0.64.3",
41
- "tape": "^4.6.3",
42
- "yarn": "^0.22.0"
43
- },
44
- "files": [
45
- "index.js"
46
- ],
47
- "homepage": "https://github.com/zkochan/which-pm-runs#readme",
48
- "keywords": [
49
- "npm",
50
- "pnpm",
51
- "yarn"
52
- ],
53
- "license": "MIT",
54
- "main": "index.js",
55
- "name": "which-pm-runs",
56
- "repository": {
57
- "type": "git",
58
- "url": "git+https://github.com/zkochan/which-pm-runs.git"
59
- },
60
- "scripts": {
61
- "test": "tape test"
62
- },
63
- "version": "1.0.0"
64
- }