@leofcoin/peernet 2.0.0 → 3.1.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.
- package/README.md +45 -0
- package/docs/automatic-transport.md +37 -0
- package/exports/browser/{client-CAC7RVMf.js → client-DKKzPSlb.js} +252 -76
- package/exports/browser/{messages-Dw86z0zq.js → messages-DCePyqKC.js} +1 -1
- package/exports/browser/{peernet-B2jRhqGI.js → peernet-DjddqiXc.js} +460 -18
- package/exports/browser/peernet.js +1 -1
- package/exports/peernet.js +445 -3
- package/exports/types/archive.d.ts +69 -0
- package/exports/types/peernet.d.ts +7 -1
- package/package.json +9 -5
- package/.esdoc.json +0 -10
- package/.gitattributes +0 -2
- package/.github/workflows/release.yml +0 -34
- package/.prettierrc +0 -7
- package/.travis.yml +0 -27
- package/BREAKING_CHANGES.md +0 -35
- package/deploy.js +0 -8
- package/exports/browser/browser-D-r0O9Qn.js +0 -53
- package/exports/browser/browser-DvU1xNFS.js +0 -147
- package/exports/browser/browser-_hiyXwPp.js +0 -147
- package/exports/browser/client-86Tnax66.js +0 -2224
- package/exports/browser/client-BFxJts6j.js +0 -2224
- package/exports/browser/client-BVhUamQG.js +0 -2200
- package/exports/browser/client-BzvWzzLv.js +0 -2224
- package/exports/browser/client-C9GBz2Tf.js +0 -2224
- package/exports/browser/client-CQzuu6At.js +0 -2224
- package/exports/browser/client-CVkFejdx.js +0 -2224
- package/exports/browser/client-Cj_UUO8W.js +0 -2224
- package/exports/browser/client-CrGaeBjj.js +0 -2224
- package/exports/browser/client-DDC8C510.js +0 -2224
- package/exports/browser/client-ERocgKET.js +0 -2224
- package/exports/browser/client-a8rws3cu.js +0 -2224
- package/exports/browser/identity-CYVPDmkf.js +0 -8402
- package/exports/browser/identity-ChyyZSve.js +0 -8397
- package/exports/browser/index-BD0Anx7_.js +0 -37
- package/exports/browser/index-Bxr5Iztg.js +0 -37
- package/exports/browser/messages-BFCmg6Vb.js +0 -212
- package/exports/browser/messages-BHIC2mQu.js +0 -212
- package/exports/browser/messages-CimzJ4wr.js +0 -210
- package/exports/browser/messages-Cjoa_LGO.js +0 -210
- package/exports/browser/messages-D7JxkkDW.js +0 -212
- package/exports/browser/messages-DH0tgNM9.js +0 -207
- package/exports/browser/messages-DVHcNvs_.js +0 -212
- package/exports/browser/messages-DqL_g2qw.js +0 -210
- package/exports/browser/messages-UKnuelZ7.js +0 -207
- package/exports/browser/messages-XgZZUMma.js +0 -212
- package/exports/browser/messages-kfFyctPL.js +0 -210
- package/exports/browser/messages-psROnfRi.js +0 -212
- package/exports/browser/peernet-B9VL4Xwe.js +0 -9522
- package/exports/browser/peernet-C-HNdrcd.js +0 -9528
- package/exports/browser/peernet-C4rOvyyU.js +0 -9661
- package/exports/browser/peernet-Ca1iM2tN.js +0 -9336
- package/exports/browser/peernet-CbI0-jFn.js +0 -9651
- package/exports/browser/peernet-CtHScDyh.js +0 -9524
- package/exports/browser/peernet-DfuxUK3u.js +0 -9525
- package/exports/browser/peernet-DiEcNDLD.js +0 -9655
- package/exports/browser/peernet-DtuRXOzP.js +0 -9653
- package/exports/browser/peernet-r_9IyzTe.js +0 -9336
- package/exports/browser/peernet-rcD5XL1y.js +0 -9590
- package/exports/browser/peernet-rw8HJGOz.js +0 -9597
- package/exports/messages-CHKVVTVE.js +0 -204
- package/exports/messages-DaUtFfBh.js +0 -207
- package/index.html +0 -19
- package/rollup.config.js +0 -143
- package/src/dht/dht.ts +0 -142
- package/src/discovery/peer-discovery.js +0 -75
- package/src/errors/errors.js +0 -12
- package/src/file-transfer.ts +0 -194
- package/src/handlers/data.js +0 -15
- package/src/handlers/message.js +0 -34
- package/src/identity.ts +0 -172
- package/src/messages/chat.ts +0 -13
- package/src/messages/data-response.ts +0 -13
- package/src/messages/data.ts +0 -17
- package/src/messages/dht-response.ts +0 -13
- package/src/messages/dht.ts +0 -21
- package/src/messages/file-link.ts +0 -17
- package/src/messages/file.ts +0 -17
- package/src/messages/peer-response.ts +0 -13
- package/src/messages/peer.ts +0 -13
- package/src/messages/peernet.ts +0 -13
- package/src/messages/ps.ts +0 -13
- package/src/messages/request.ts +0 -13
- package/src/messages/response.ts +0 -13
- package/src/messages.js +0 -12
- package/src/peer-info.js +0 -9
- package/src/peernet.ts +0 -1113
- package/src/prompts/password/browser.js +0 -1
- package/src/prompts/password/node.js +0 -6
- package/src/prompts/password.js +0 -1
- package/src/proto/chat-message.proto.js +0 -6
- package/src/proto/data-response.proto.js +0 -4
- package/src/proto/data.proto.js +0 -4
- package/src/proto/dht-response.proto.js +0 -4
- package/src/proto/dht.proto.js +0 -4
- package/src/proto/file-link.proto.js +0 -5
- package/src/proto/file.proto.js +0 -10
- package/src/proto/peer-response.proto.js +0 -3
- package/src/proto/peer.proto.js +0 -3
- package/src/proto/peernet.proto.js +0 -7
- package/src/proto/ps.proto.js +0 -4
- package/src/proto/request.proto.js +0 -4
- package/src/proto/response.proto.js +0 -3
- package/src/types.ts +0 -25
- package/src/utils/utils.js +0 -77
- package/test/all.js +0 -5
- package/test/client.js +0 -15
- package/test/codec.js +0 -56
- package/test/file-transfer.test.js +0 -81
- package/test/fresh-empty-store.js +0 -15
- package/test/hash.js +0 -14
- package/test/index.js +0 -6
- package/test/lastBlock.js +0 -7
- package/test/messages.js +0 -26
- package/test/peer-data-exchange.test.js +0 -52
- package/test/peer-file-exchange.test.js +0 -78
- package/test/peernet.js +0 -17
- package/test/peernet.test.js +0 -477
- package/test-output.log +0 -84
- package/test.js +0 -63
- package/test2.js +0 -13
- package/test3.js +0 -16
- package/test4.js +0 -7
- package/tsconfig.json +0 -13
|
@@ -1,204 +0,0 @@
|
|
|
1
|
-
import { FormatInterface } from '@leofcoin/codec-format-interface';
|
|
2
|
-
|
|
3
|
-
var proto$b = {
|
|
4
|
-
data: new Uint8Array(),
|
|
5
|
-
signature: new Uint8Array(),
|
|
6
|
-
'from?': String(),
|
|
7
|
-
'to?': String(),
|
|
8
|
-
'id?': String()
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
class PeernetMessage extends FormatInterface {
|
|
12
|
-
get messageName() {
|
|
13
|
-
return 'PeernetMessage';
|
|
14
|
-
}
|
|
15
|
-
constructor(buffer) {
|
|
16
|
-
const name = 'peernet-message';
|
|
17
|
-
super(buffer, proto$b, { name });
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
var proto$a = {
|
|
22
|
-
hash: String(),
|
|
23
|
-
'store?': String()
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* @example `
|
|
28
|
-
new DHTMessage(hash, store)
|
|
29
|
-
// store = optional if not set, peernet checks every store
|
|
30
|
-
let message = new DHTMessage('hashmvbs124xcfd...', 'transaction')
|
|
31
|
-
message = new DHTMessage('hashmvbs124xcfd...', 'block')
|
|
32
|
-
`
|
|
33
|
-
*/
|
|
34
|
-
class DHTMessage extends FormatInterface {
|
|
35
|
-
get messageName() {
|
|
36
|
-
return 'PeernetDHTMessage';
|
|
37
|
-
}
|
|
38
|
-
constructor(data) {
|
|
39
|
-
const name = 'peernet-dht';
|
|
40
|
-
super(data, proto$a, { name });
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
var proto$9 = {
|
|
45
|
-
hash: String(),
|
|
46
|
-
has: Boolean()
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
class DHTMessageResponse extends FormatInterface {
|
|
50
|
-
get messageName() {
|
|
51
|
-
return 'PeernetDHTMessageResponse';
|
|
52
|
-
}
|
|
53
|
-
constructor(data) {
|
|
54
|
-
const name = 'peernet-dht-response';
|
|
55
|
-
super(data, proto$9, { name });
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
var proto$8 = {
|
|
60
|
-
hash: String(),
|
|
61
|
-
'store?': String()
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* @extends {CodecFormat}
|
|
66
|
-
*/
|
|
67
|
-
class DataMessage extends FormatInterface {
|
|
68
|
-
get messageName() {
|
|
69
|
-
return 'PeernetDataMessage';
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* @param {Buffer|String|Object|DataMessage} data - The data needed to create the DataMessage
|
|
73
|
-
*/
|
|
74
|
-
constructor(data) {
|
|
75
|
-
super(data, proto$8, { name: 'peernet-data' });
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
var proto$7 = {
|
|
80
|
-
data: new Uint8Array(),
|
|
81
|
-
topic: new Uint8Array()
|
|
82
|
-
};
|
|
83
|
-
|
|
84
|
-
class PsMessage extends FormatInterface {
|
|
85
|
-
get messageName() {
|
|
86
|
-
return 'PsMessage';
|
|
87
|
-
}
|
|
88
|
-
constructor(buffer) {
|
|
89
|
-
const name = 'peernet-ps';
|
|
90
|
-
super(buffer, proto$7, { name });
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
var proto$6 = {
|
|
95
|
-
id: String()
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
class PeerMessage extends FormatInterface {
|
|
99
|
-
get messageName() {
|
|
100
|
-
return 'PeernetPeerMessage';
|
|
101
|
-
}
|
|
102
|
-
constructor(data) {
|
|
103
|
-
const name = 'peernet-peer';
|
|
104
|
-
super(data, proto$6, { name });
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
var proto$5 = {
|
|
109
|
-
request: String(),
|
|
110
|
-
'requested?': new Uint8Array()
|
|
111
|
-
};
|
|
112
|
-
|
|
113
|
-
class RequestMessage extends FormatInterface {
|
|
114
|
-
get messageName() {
|
|
115
|
-
return 'PeernetRequestMessage';
|
|
116
|
-
}
|
|
117
|
-
constructor(data) {
|
|
118
|
-
const name = 'peernet-request';
|
|
119
|
-
super(data, proto$5, { name });
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
var proto$4 = {
|
|
124
|
-
response: new Uint8Array()
|
|
125
|
-
};
|
|
126
|
-
|
|
127
|
-
class ResponseMessage extends FormatInterface {
|
|
128
|
-
get messageName() {
|
|
129
|
-
return 'PeernetResponseMessage';
|
|
130
|
-
}
|
|
131
|
-
constructor(data) {
|
|
132
|
-
const name = 'peernet-response';
|
|
133
|
-
super(data, proto$4, { name });
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
var proto$3 = {
|
|
138
|
-
id: String()
|
|
139
|
-
};
|
|
140
|
-
|
|
141
|
-
class PeerMessageResponse extends FormatInterface {
|
|
142
|
-
get messageName() {
|
|
143
|
-
return 'PeernetPeerMessageResponse';
|
|
144
|
-
}
|
|
145
|
-
constructor(data) {
|
|
146
|
-
const name = 'peernet-peer-response';
|
|
147
|
-
super(data, proto$3, { name });
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
var proto$2 = {
|
|
152
|
-
hash: String(),
|
|
153
|
-
data: new Uint8Array()
|
|
154
|
-
};
|
|
155
|
-
|
|
156
|
-
class DataMessageResponse extends FormatInterface {
|
|
157
|
-
get messageName() {
|
|
158
|
-
return 'PeernetDataMessageResponse';
|
|
159
|
-
}
|
|
160
|
-
constructor(data) {
|
|
161
|
-
const name = 'peernet-data-response';
|
|
162
|
-
super(data, proto$2, { name });
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
var proto$1 = {
|
|
167
|
-
value: new Uint8Array(),
|
|
168
|
-
author: new Uint8Array(),
|
|
169
|
-
timestamp: Number(),
|
|
170
|
-
files: [new Uint8Array()]
|
|
171
|
-
};
|
|
172
|
-
|
|
173
|
-
class ChatMessage extends FormatInterface {
|
|
174
|
-
get messageName() {
|
|
175
|
-
return 'ChatMessage';
|
|
176
|
-
}
|
|
177
|
-
constructor(buffer) {
|
|
178
|
-
const name = 'chat-message';
|
|
179
|
-
super(buffer, proto$1, { name });
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
var proto = {
|
|
184
|
-
path: String(),
|
|
185
|
-
'content?': new Uint8Array(),
|
|
186
|
-
'links?': []
|
|
187
|
-
};
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* @extends {CodecFormat}
|
|
191
|
-
*/
|
|
192
|
-
class PeernetFile extends FormatInterface {
|
|
193
|
-
get messageName() {
|
|
194
|
-
return 'PeernetFile';
|
|
195
|
-
}
|
|
196
|
-
/**
|
|
197
|
-
* @param {Buffer|String|Object|DataMessage} data - The data needed to create the DataMessage
|
|
198
|
-
*/
|
|
199
|
-
constructor(data) {
|
|
200
|
-
super(data, proto, { name: 'peernet-file' });
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
export { ChatMessage, DHTMessage, DHTMessageResponse, DataMessage, DataMessageResponse, PeerMessage, PeerMessageResponse, PeernetFile, PeernetMessage, PsMessage, RequestMessage, ResponseMessage };
|
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
import { FormatInterface } from '@leofcoin/codec-format-interface';
|
|
2
|
-
|
|
3
|
-
var proto$b = {
|
|
4
|
-
data: new Uint8Array(),
|
|
5
|
-
signature: new Uint8Array(),
|
|
6
|
-
'from?': String(),
|
|
7
|
-
'to?': String(),
|
|
8
|
-
'id?': String()
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
class PeernetMessage extends FormatInterface {
|
|
12
|
-
get messageName() {
|
|
13
|
-
return 'PeernetMessage';
|
|
14
|
-
}
|
|
15
|
-
constructor(buffer) {
|
|
16
|
-
const name = 'peernet-message';
|
|
17
|
-
super(buffer, proto$b, { name });
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
var proto$a = {
|
|
22
|
-
hash: String(),
|
|
23
|
-
'store?': String()
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* @example `
|
|
28
|
-
new DHTMessage(hash, store)
|
|
29
|
-
// store = optional if not set, peernet checks every store
|
|
30
|
-
let message = new DHTMessage('hashmvbs124xcfd...', 'transaction')
|
|
31
|
-
message = new DHTMessage('hashmvbs124xcfd...', 'block')
|
|
32
|
-
`
|
|
33
|
-
*/
|
|
34
|
-
class DHTMessage extends FormatInterface {
|
|
35
|
-
get messageName() {
|
|
36
|
-
return 'PeernetDHTMessage';
|
|
37
|
-
}
|
|
38
|
-
constructor(data) {
|
|
39
|
-
const name = 'peernet-dht';
|
|
40
|
-
super(data, proto$a, { name });
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
var proto$9 = {
|
|
45
|
-
hash: String(),
|
|
46
|
-
has: Boolean()
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
class DHTMessageResponse extends FormatInterface {
|
|
50
|
-
get messageName() {
|
|
51
|
-
return 'PeernetDHTMessageResponse';
|
|
52
|
-
}
|
|
53
|
-
constructor(data) {
|
|
54
|
-
const name = 'peernet-dht-response';
|
|
55
|
-
super(data, proto$9, { name });
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
var proto$8 = {
|
|
60
|
-
hash: String(),
|
|
61
|
-
'store?': String()
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* @extends {CodecFormat}
|
|
66
|
-
*/
|
|
67
|
-
class DataMessage extends FormatInterface {
|
|
68
|
-
get messageName() {
|
|
69
|
-
return 'PeernetDataMessage';
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* @param {Buffer|String|Object|DataMessage} data - The data needed to create the DataMessage
|
|
73
|
-
*/
|
|
74
|
-
constructor(data) {
|
|
75
|
-
super(data, proto$8, { name: 'peernet-data' });
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
var proto$7 = {
|
|
80
|
-
data: new Uint8Array(),
|
|
81
|
-
topic: new Uint8Array()
|
|
82
|
-
};
|
|
83
|
-
|
|
84
|
-
class PsMessage extends FormatInterface {
|
|
85
|
-
get messageName() {
|
|
86
|
-
return 'PsMessage';
|
|
87
|
-
}
|
|
88
|
-
constructor(buffer) {
|
|
89
|
-
const name = 'peernet-ps';
|
|
90
|
-
super(buffer, proto$7, { name });
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
var proto$6 = {
|
|
95
|
-
id: String()
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
class PeerMessage extends FormatInterface {
|
|
99
|
-
get messageName() {
|
|
100
|
-
return 'PeernetPeerMessage';
|
|
101
|
-
}
|
|
102
|
-
constructor(data) {
|
|
103
|
-
const name = 'peernet-peer';
|
|
104
|
-
super(data, proto$6, { name });
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
var proto$5 = {
|
|
109
|
-
request: String(),
|
|
110
|
-
'requested?': new Uint8Array()
|
|
111
|
-
};
|
|
112
|
-
|
|
113
|
-
class RequestMessage extends FormatInterface {
|
|
114
|
-
get messageName() {
|
|
115
|
-
return 'PeernetRequestMessage';
|
|
116
|
-
}
|
|
117
|
-
constructor(data) {
|
|
118
|
-
const name = 'peernet-request';
|
|
119
|
-
super(data, proto$5, { name });
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
var proto$4 = {
|
|
124
|
-
response: new Uint8Array()
|
|
125
|
-
};
|
|
126
|
-
|
|
127
|
-
class ResponseMessage extends FormatInterface {
|
|
128
|
-
get messageName() {
|
|
129
|
-
return 'PeernetResponseMessage';
|
|
130
|
-
}
|
|
131
|
-
constructor(data) {
|
|
132
|
-
const name = 'peernet-response';
|
|
133
|
-
super(data, proto$4, { name });
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
var proto$3 = {
|
|
138
|
-
id: String()
|
|
139
|
-
};
|
|
140
|
-
|
|
141
|
-
class PeerMessageResponse extends FormatInterface {
|
|
142
|
-
get messageName() {
|
|
143
|
-
return 'PeernetPeerMessageResponse';
|
|
144
|
-
}
|
|
145
|
-
constructor(data) {
|
|
146
|
-
const name = 'peernet-peer-response';
|
|
147
|
-
super(data, proto$3, { name });
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
var proto$2 = {
|
|
152
|
-
hash: String(),
|
|
153
|
-
data: new Uint8Array()
|
|
154
|
-
};
|
|
155
|
-
|
|
156
|
-
class DataMessageResponse extends FormatInterface {
|
|
157
|
-
get messageName() {
|
|
158
|
-
return 'PeernetDataMessageResponse';
|
|
159
|
-
}
|
|
160
|
-
constructor(data) {
|
|
161
|
-
const name = 'peernet-data-response';
|
|
162
|
-
super(data, proto$2, { name });
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
var proto$1 = {
|
|
167
|
-
value: new Uint8Array(),
|
|
168
|
-
author: new Uint8Array(),
|
|
169
|
-
timestamp: Number(),
|
|
170
|
-
files: [new Uint8Array()]
|
|
171
|
-
};
|
|
172
|
-
|
|
173
|
-
class ChatMessage extends FormatInterface {
|
|
174
|
-
get messageName() {
|
|
175
|
-
return 'ChatMessage';
|
|
176
|
-
}
|
|
177
|
-
constructor(buffer) {
|
|
178
|
-
const name = 'chat-message';
|
|
179
|
-
super(buffer, proto$1, { name });
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
var proto = {
|
|
184
|
-
path: String(),
|
|
185
|
-
'content?': new Uint8Array(),
|
|
186
|
-
'links?': [],
|
|
187
|
-
'size?': Number(),
|
|
188
|
-
'chunkSize?': Number(),
|
|
189
|
-
'chunked?': Boolean()
|
|
190
|
-
};
|
|
191
|
-
|
|
192
|
-
/**
|
|
193
|
-
* @extends {CodecFormat}
|
|
194
|
-
*/
|
|
195
|
-
class PeernetFile extends FormatInterface {
|
|
196
|
-
get messageName() {
|
|
197
|
-
return 'PeernetFile';
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* @param {Buffer|String|Object|DataMessage} data - The data needed to create the DataMessage
|
|
201
|
-
*/
|
|
202
|
-
constructor(data) {
|
|
203
|
-
super(data, proto, { name: 'peernet-file' });
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
export { ChatMessage, DHTMessage, DHTMessageResponse, DataMessage, DataMessageResponse, PeerMessage, PeerMessageResponse, PeernetFile, PeernetMessage, PsMessage, RequestMessage, ResponseMessage };
|
package/index.html
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="en" dir="ltr">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="utf-8">
|
|
5
|
-
<title></title>
|
|
6
|
-
</head>
|
|
7
|
-
<body>
|
|
8
|
-
<!-- <script src="./dist/browser/peernet.js">
|
|
9
|
-
</script> -->
|
|
10
|
-
|
|
11
|
-
<script type="module">
|
|
12
|
-
import './exports/browser/peernet.js';
|
|
13
|
-
(async () => {
|
|
14
|
-
const peernet = await new Peernet({network: 'leofcoin:peach', networkVersion: 'peach'})
|
|
15
|
-
peernet.addRequestHandler('lastBlock', () => new peernet.protos['peernet-response']({response: new TextEncoder().encode(100)}))
|
|
16
|
-
})()
|
|
17
|
-
</script>
|
|
18
|
-
</body>
|
|
19
|
-
</html>
|
package/rollup.config.js
DELETED
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
import resolve from '@rollup/plugin-node-resolve'
|
|
2
|
-
import commonjs from '@rollup/plugin-commonjs'
|
|
3
|
-
import json from '@rollup/plugin-json'
|
|
4
|
-
import wasm from '@rollup/plugin-wasm'
|
|
5
|
-
import { readdir, readFile, writeFile } from 'node:fs/promises'
|
|
6
|
-
import { extname, relative, sep } from 'node:path'
|
|
7
|
-
import { rimrafSync } from 'rimraf'
|
|
8
|
-
import typescript from '@rollup/plugin-typescript'
|
|
9
|
-
|
|
10
|
-
const toPosix = (value) => value.split(sep).join('/')
|
|
11
|
-
|
|
12
|
-
const walk = async (dir) => {
|
|
13
|
-
const entries = await readdir(dir, { withFileTypes: true })
|
|
14
|
-
const files = []
|
|
15
|
-
|
|
16
|
-
for (const entry of entries) {
|
|
17
|
-
const fullPath = `${dir}/${entry.name}`
|
|
18
|
-
if (entry.isDirectory()) {
|
|
19
|
-
files.push(...(await walk(fullPath)))
|
|
20
|
-
continue
|
|
21
|
-
}
|
|
22
|
-
files.push(fullPath)
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
return files
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const isHashedChunk = (runtimePath) => /-[A-Za-z0-9_-]{8,}\.js$/.test(runtimePath)
|
|
29
|
-
|
|
30
|
-
const isPromptImport = (id) =>
|
|
31
|
-
id === './prompts/password.js' || id === './src/prompts/password.js' || id.endsWith('/src/prompts/password.js')
|
|
32
|
-
|
|
33
|
-
const runtimeFirstExports = ({ exportsDir = 'exports', declarationsDir = 'exports/types' } = {}) => ({
|
|
34
|
-
name: 'runtime-first-exports',
|
|
35
|
-
writeBundle: async () => {
|
|
36
|
-
const runtimeFiles = (await walk(exportsDir))
|
|
37
|
-
.map((file) => toPosix(relative(exportsDir, file)))
|
|
38
|
-
.filter((file) => extname(file) === '.js')
|
|
39
|
-
.filter((file) => !file.startsWith('types/'))
|
|
40
|
-
.filter((file) => !isHashedChunk(file))
|
|
41
|
-
.sort((a, b) => a.localeCompare(b))
|
|
42
|
-
|
|
43
|
-
const declarationFiles = (await walk(declarationsDir))
|
|
44
|
-
.map((file) => toPosix(relative(declarationsDir, file)))
|
|
45
|
-
.filter((file) => extname(file) === '.ts' && file.endsWith('.d.ts'))
|
|
46
|
-
|
|
47
|
-
const declarationByRuntime = new Map(declarationFiles.map((file) => [file.slice(0, -'.d.ts'.length), file]))
|
|
48
|
-
|
|
49
|
-
const declarationAliases = {
|
|
50
|
-
'prompts/password': 'prompts/password/node',
|
|
51
|
-
'browser/prompts/password': 'prompts/password/browser',
|
|
52
|
-
'browser/peernet': 'peernet',
|
|
53
|
-
'browser/identity': 'identity'
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
const packageExports = {
|
|
57
|
-
'.': { import: './exports/peernet.js', types: './exports/types/peernet.d.ts' },
|
|
58
|
-
'./browser': { import: './exports/browser/peernet.js', types: './exports/types/peernet.d.ts' },
|
|
59
|
-
'./browser.js': { import: './exports/browser/peernet.js', types: './exports/types/peernet.d.ts' },
|
|
60
|
-
'./node': { import: './exports/prompts/password.js', types: './exports/types/prompts/password/node.d.ts' },
|
|
61
|
-
'./node.js': { import: './exports/prompts/password.js', types: './exports/types/prompts/password/node.d.ts' }
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
for (const runtimeFile of runtimeFiles) {
|
|
65
|
-
const runtimeKey = runtimeFile.slice(0, -'.js'.length)
|
|
66
|
-
const exportKey = `./${runtimeKey}`
|
|
67
|
-
const exportJsKey = `./${runtimeKey}.js`
|
|
68
|
-
const importPath = `./${exportsDir}/${runtimeFile}`
|
|
69
|
-
const declarationKey = declarationAliases[runtimeKey] || runtimeKey
|
|
70
|
-
const declarationPath = declarationByRuntime.get(declarationKey)
|
|
71
|
-
const typesPath = declarationPath ? `./${declarationsDir}/${declarationPath}` : undefined
|
|
72
|
-
|
|
73
|
-
packageExports[exportKey] = typesPath ? { import: importPath, types: typesPath } : { import: importPath }
|
|
74
|
-
packageExports[exportJsKey] = typesPath ? { import: importPath, types: typesPath } : { import: importPath }
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
const packageJson = JSON.parse(await readFile('./package.json', 'utf8'))
|
|
78
|
-
packageJson.exports = packageExports
|
|
79
|
-
await writeFile('./package.json', `${JSON.stringify(packageJson, null, ' ')}\n`)
|
|
80
|
-
}
|
|
81
|
-
})
|
|
82
|
-
|
|
83
|
-
rimrafSync('./exports/**')
|
|
84
|
-
|
|
85
|
-
export default [
|
|
86
|
-
{
|
|
87
|
-
input: ['./src/peernet.ts', './src/identity.ts', './node_modules/@leofcoin/storage/exports/browser-store.js'],
|
|
88
|
-
output: {
|
|
89
|
-
format: 'es',
|
|
90
|
-
dir: 'exports/browser',
|
|
91
|
-
chunkFileNames: (chunkInfo) =>
|
|
92
|
-
chunkInfo.name === 'prompts/password' ? 'prompts/password.js' : '[name]-[hash].js',
|
|
93
|
-
manualChunks: (id) => (id.endsWith('/src/prompts/password.js') ? 'prompts/password' : undefined)
|
|
94
|
-
},
|
|
95
|
-
plugins: [
|
|
96
|
-
json(),
|
|
97
|
-
wasm(),
|
|
98
|
-
resolve({
|
|
99
|
-
browser: true,
|
|
100
|
-
preferBuiltins: false,
|
|
101
|
-
mainFields: ['browser', 'module', 'main']
|
|
102
|
-
}),
|
|
103
|
-
commonjs({
|
|
104
|
-
mainFields: ['browser', 'module', 'main']
|
|
105
|
-
}),
|
|
106
|
-
|
|
107
|
-
typescript({ compilerOptions: { outDir: 'exports/browser', declaration: false } })
|
|
108
|
-
]
|
|
109
|
-
},
|
|
110
|
-
{
|
|
111
|
-
input: ['./src/peernet.ts', './src/identity.ts', './node_modules/@leofcoin/storage/exports/store.js'],
|
|
112
|
-
output: {
|
|
113
|
-
format: 'es',
|
|
114
|
-
dir: 'exports',
|
|
115
|
-
paths: (id) => (isPromptImport(id) ? './prompts/password.js' : id)
|
|
116
|
-
},
|
|
117
|
-
plugins: [
|
|
118
|
-
typescript({
|
|
119
|
-
compilerOptions: {
|
|
120
|
-
outDir: 'exports',
|
|
121
|
-
declarationDir: 'exports/types'
|
|
122
|
-
}
|
|
123
|
-
})
|
|
124
|
-
],
|
|
125
|
-
external: (id) =>
|
|
126
|
-
isPromptImport(id) || id === './prompts/password/browser.js' || id === './prompts/password/node.js'
|
|
127
|
-
},
|
|
128
|
-
{
|
|
129
|
-
input: ['./src/prompts/password/browser.js'],
|
|
130
|
-
output: {
|
|
131
|
-
format: 'es',
|
|
132
|
-
file: 'exports/browser/prompts/password.js'
|
|
133
|
-
}
|
|
134
|
-
},
|
|
135
|
-
{
|
|
136
|
-
input: ['./src/prompts/password/node.js'],
|
|
137
|
-
output: {
|
|
138
|
-
format: 'es',
|
|
139
|
-
file: 'exports/prompts/password.js'
|
|
140
|
-
},
|
|
141
|
-
plugins: [runtimeFirstExports()]
|
|
142
|
-
}
|
|
143
|
-
]
|
package/src/dht/dht.ts
DELETED
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
export declare type DHTProvider = {
|
|
2
|
-
address: string
|
|
3
|
-
id: string
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
export declare type DHTProviderDistanceResult = {
|
|
7
|
-
provider: DHTProvider
|
|
8
|
-
/**
|
|
9
|
-
* distance on earth between peers in km
|
|
10
|
-
*/
|
|
11
|
-
distance: number
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export declare type DHTProviderMapValue = { [index: string]: DHTProvider }
|
|
15
|
-
|
|
16
|
-
declare type Coordinates = {
|
|
17
|
-
longitude: number
|
|
18
|
-
latitude: number
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Keep history of fetched address and ptr
|
|
23
|
-
* @property {Object} address
|
|
24
|
-
* @property {Object} ptr
|
|
25
|
-
*/
|
|
26
|
-
const lastFetched = {
|
|
27
|
-
address: {
|
|
28
|
-
value: undefined,
|
|
29
|
-
timestamp: 0
|
|
30
|
-
},
|
|
31
|
-
ptr: {
|
|
32
|
-
value: undefined,
|
|
33
|
-
timestamp: 0
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
const fetchedCoordinates = {}
|
|
38
|
-
|
|
39
|
-
export const getAddress = async () => {
|
|
40
|
-
const { address } = lastFetched
|
|
41
|
-
if (!address) {
|
|
42
|
-
const value = await fetch('https://icanhazip.com/')
|
|
43
|
-
address.value = await value.text()
|
|
44
|
-
address.timestamp = Math.round(new Date().getTime() / 1000)
|
|
45
|
-
lastFetched.address = address
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
return address.value
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const degreesToRadians = (degrees) => {
|
|
52
|
-
return (degrees * Math.PI) / 180
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
const distanceInKmBetweenEarthCoordinates = (lat1, lon1, lat2, lon2) => {
|
|
56
|
-
const earthRadiusKm = 6371
|
|
57
|
-
|
|
58
|
-
const dLat = degreesToRadians(lat2 - lat1)
|
|
59
|
-
const dLon = degreesToRadians(lon2 - lon1)
|
|
60
|
-
|
|
61
|
-
lat1 = degreesToRadians(lat1)
|
|
62
|
-
lat2 = degreesToRadians(lat2)
|
|
63
|
-
const a =
|
|
64
|
-
Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2)
|
|
65
|
-
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))
|
|
66
|
-
return earthRadiusKm * c
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
export default class DhtEarth {
|
|
70
|
-
providerMap: Map<string, DHTProviderMapValue> = new Map()
|
|
71
|
-
|
|
72
|
-
async getCoordinates(address: string): Promise<Coordinates> {
|
|
73
|
-
if (!fetchedCoordinates[address]) {
|
|
74
|
-
const request = `https://whereis.leofcoin.org/?ip=${address}`
|
|
75
|
-
let response = await fetch(request)
|
|
76
|
-
const { lat, lon } = (await response.json()) as { lat: number; lon: number }
|
|
77
|
-
fetchedCoordinates[address] = { latitude: lat, longitude: lon }
|
|
78
|
-
}
|
|
79
|
-
return fetchedCoordinates[address]
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* @param {Object} peer
|
|
84
|
-
* @param {Object} provider
|
|
85
|
-
* @return {Object} {provider, distance}
|
|
86
|
-
*/
|
|
87
|
-
async getDistance(
|
|
88
|
-
peer: { latitude: number; longitude: number },
|
|
89
|
-
provider: DHTProvider
|
|
90
|
-
): Promise<DHTProviderDistanceResult> {
|
|
91
|
-
const { latitude, longitude } = await this.getCoordinates(provider.address)
|
|
92
|
-
return {
|
|
93
|
-
provider,
|
|
94
|
-
distance: distanceInKmBetweenEarthCoordinates(peer.latitude, peer.longitude, latitude, longitude)
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
async closestPeer(providers: Array<any>): Promise<DHTProvider> {
|
|
99
|
-
let all = []
|
|
100
|
-
const address = await getAddress()
|
|
101
|
-
const peerLoc = await this.getCoordinates(address)
|
|
102
|
-
|
|
103
|
-
for (const provider of providers) {
|
|
104
|
-
if (!provider.address || provider.address === '127.0.0.1' || provider.address === '::1')
|
|
105
|
-
all.push({ provider, distance: 0 })
|
|
106
|
-
else all.push(this.getDistance(peerLoc, provider))
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// todo queue
|
|
110
|
-
all = await Promise.all(all)
|
|
111
|
-
all = all.sort((previous, current) => previous.distance - current.distance)
|
|
112
|
-
return all[0].provider
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
hasProvider(hash: string): boolean {
|
|
116
|
-
return this.providerMap.has(hash)
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
providersFor(hash: string): DHTProviderMapValue {
|
|
120
|
-
let providers: DHTProviderMapValue
|
|
121
|
-
if (this.providerMap.has(hash)) providers = this.providerMap.get(hash)
|
|
122
|
-
return providers
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
addProvider(provider: DHTProvider, hash: string) {
|
|
126
|
-
if (!provider.address) provider.address = '127.0.0.1'
|
|
127
|
-
let providers: DHTProviderMapValue = {}
|
|
128
|
-
if (this.providerMap.has(hash)) {
|
|
129
|
-
providers = this.providerMap.get(hash)
|
|
130
|
-
}
|
|
131
|
-
providers[provider.id] = provider
|
|
132
|
-
this.providerMap.set(hash, providers)
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
removeProvider(id: string, hash: string) {
|
|
136
|
-
if (this.providerMap.has(hash)) {
|
|
137
|
-
const providers = this.providerMap.get(hash)
|
|
138
|
-
delete providers[id]
|
|
139
|
-
this.providerMap.set(hash, providers)
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
}
|