gnutella 1.0.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/CLI.md +189 -0
- package/DEVELOPER.md +193 -0
- package/LICENSE +674 -0
- package/QUICKSTART.md +133 -0
- package/README.md +74 -0
- package/bin/gnutella.ts +15 -0
- package/gnutella.json.example +18 -0
- package/package.json +72 -0
- package/src/cli.ts +692 -0
- package/src/cli_shared.ts +359 -0
- package/src/const.ts +138 -0
- package/src/gwebcache/bootstrap.ts +491 -0
- package/src/gwebcache/response.ts +391 -0
- package/src/gwebcache/shared.ts +116 -0
- package/src/gwebcache/types.ts +187 -0
- package/src/gwebcache_client.ts +13 -0
- package/src/protocol/browse_host.ts +552 -0
- package/src/protocol/client_blocking.ts +29 -0
- package/src/protocol/codec.ts +715 -0
- package/src/protocol/content_urn.ts +170 -0
- package/src/protocol/core_utils.ts +43 -0
- package/src/protocol/file_server.ts +245 -0
- package/src/protocol/ggep.ts +168 -0
- package/src/protocol/handshake.ts +199 -0
- package/src/protocol/http_download_reader.ts +112 -0
- package/src/protocol/magnet.ts +176 -0
- package/src/protocol/node.ts +416 -0
- package/src/protocol/node_handshake.ts +992 -0
- package/src/protocol/node_lifecycle.ts +210 -0
- package/src/protocol/node_protocol_runtime.ts +949 -0
- package/src/protocol/node_qrp_runtime.ts +97 -0
- package/src/protocol/node_query_routing.ts +208 -0
- package/src/protocol/node_state.ts +745 -0
- package/src/protocol/node_tls.ts +257 -0
- package/src/protocol/node_topology.ts +141 -0
- package/src/protocol/node_transfer.ts +455 -0
- package/src/protocol/node_types.ts +106 -0
- package/src/protocol/peer_state.ts +675 -0
- package/src/protocol/qrp.ts +549 -0
- package/src/protocol/query_search.ts +29 -0
- package/src/protocol/share_index.ts +131 -0
- package/src/protocol/share_library.ts +246 -0
- package/src/protocol.ts +36 -0
- package/src/shared.ts +236 -0
- package/src/types.ts +452 -0
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
import net from "node:net";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
|
|
4
|
+
import { LOCAL_ROUTE } from "../const";
|
|
5
|
+
import {
|
|
6
|
+
connectBootstrapPeers,
|
|
7
|
+
reportSelfToGWebCaches,
|
|
8
|
+
type GWebCacheBootstrapState,
|
|
9
|
+
} from "../gwebcache_client";
|
|
10
|
+
import { sleep } from "../shared";
|
|
11
|
+
import type {
|
|
12
|
+
ConfigDoc,
|
|
13
|
+
DownloadRecord,
|
|
14
|
+
GnutellaServentCollaboratorOverrides,
|
|
15
|
+
GnutellaServentCollaborators,
|
|
16
|
+
GnutellaEventListener,
|
|
17
|
+
GnutellaServentOptions,
|
|
18
|
+
PendingPush,
|
|
19
|
+
Route,
|
|
20
|
+
RuntimeConfig,
|
|
21
|
+
SearchHit,
|
|
22
|
+
ShareFile,
|
|
23
|
+
} from "../types";
|
|
24
|
+
import { fromHex16, randomId16, rawHex16 } from "./core_utils";
|
|
25
|
+
import {
|
|
26
|
+
applyRuntimeConfigPatch,
|
|
27
|
+
configDocForRuntime,
|
|
28
|
+
runtimeConfigFor,
|
|
29
|
+
} from "./peer_state";
|
|
30
|
+
import * as handshake from "./node_handshake";
|
|
31
|
+
import * as fileServer from "./file_server";
|
|
32
|
+
import * as lifecycle from "./node_lifecycle";
|
|
33
|
+
import * as protocolRuntime from "./node_protocol_runtime";
|
|
34
|
+
import * as qrpRuntime from "./node_qrp_runtime";
|
|
35
|
+
import * as state from "./node_state";
|
|
36
|
+
import { refreshShares, totalSharedKBytes } from "./share_library";
|
|
37
|
+
import * as tlsSupport from "./node_tls";
|
|
38
|
+
import * as topology from "./node_topology";
|
|
39
|
+
import * as transfer from "./node_transfer";
|
|
40
|
+
import type { ShareIndexEntry } from "./share_index";
|
|
41
|
+
import type { Peer } from "./node_types";
|
|
42
|
+
import { QrpTable } from "./qrp";
|
|
43
|
+
|
|
44
|
+
type BoundMethods<T extends Record<string, unknown>> = {
|
|
45
|
+
[K in keyof T as T[K] extends (...args: infer AllArgs) => unknown
|
|
46
|
+
? AllArgs extends [unknown, ...unknown[]]
|
|
47
|
+
? K
|
|
48
|
+
: never
|
|
49
|
+
: never]: T[K] extends (...args: infer AllArgs) => infer Result
|
|
50
|
+
? AllArgs extends [unknown, ...infer Rest]
|
|
51
|
+
? (...args: Rest) => Result
|
|
52
|
+
: never
|
|
53
|
+
: never;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
function bindNodeMethods<T extends Record<string, unknown>>(
|
|
57
|
+
mod: T,
|
|
58
|
+
): BoundMethods<T> {
|
|
59
|
+
const out: Record<string, unknown> = {};
|
|
60
|
+
for (const [name, fn] of Object.entries(mod)) {
|
|
61
|
+
if (typeof fn !== "function") continue;
|
|
62
|
+
out[name] = function (this: GnutellaServent, ...args: unknown[]) {
|
|
63
|
+
return (
|
|
64
|
+
fn as (node: GnutellaServent, ...args: unknown[]) => unknown
|
|
65
|
+
)(this, ...args);
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
return out as BoundMethods<T>;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function defaultCollaborators(): GnutellaServentCollaborators {
|
|
72
|
+
return {
|
|
73
|
+
clock: {
|
|
74
|
+
now: () => Date.now(),
|
|
75
|
+
},
|
|
76
|
+
scheduler: {
|
|
77
|
+
setTimeout: (fn, ms) => setTimeout(fn, ms),
|
|
78
|
+
clearTimeout: (timer) => clearTimeout(timer),
|
|
79
|
+
setInterval: (fn, ms) => setInterval(fn, ms),
|
|
80
|
+
clearInterval: (timer) => clearInterval(timer),
|
|
81
|
+
sleep,
|
|
82
|
+
},
|
|
83
|
+
netFactory: {
|
|
84
|
+
createConnection: (options) => net.createConnection(options),
|
|
85
|
+
createServer: (listener) => net.createServer(listener),
|
|
86
|
+
},
|
|
87
|
+
bootstrapClient: {
|
|
88
|
+
connectBootstrapPeers,
|
|
89
|
+
reportSelfToGWebCaches,
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function buildCollaborators(
|
|
95
|
+
overrides?: GnutellaServentCollaboratorOverrides,
|
|
96
|
+
): GnutellaServentCollaborators {
|
|
97
|
+
const defaults = defaultCollaborators();
|
|
98
|
+
return {
|
|
99
|
+
clock: { ...defaults.clock, ...overrides?.clock },
|
|
100
|
+
scheduler: { ...defaults.scheduler, ...overrides?.scheduler },
|
|
101
|
+
netFactory: { ...defaults.netFactory, ...overrides?.netFactory },
|
|
102
|
+
bootstrapClient: {
|
|
103
|
+
...defaults.bootstrapClient,
|
|
104
|
+
...overrides?.bootstrapClient,
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const nodeCoreMethods = {
|
|
110
|
+
randomId16(_node: GnutellaServent): Buffer {
|
|
111
|
+
return randomId16();
|
|
112
|
+
},
|
|
113
|
+
rawHex16(_node: GnutellaServent, hex: string): Buffer {
|
|
114
|
+
return rawHex16(hex);
|
|
115
|
+
},
|
|
116
|
+
now(node: GnutellaServent): number {
|
|
117
|
+
return node.collaborators.clock.now();
|
|
118
|
+
},
|
|
119
|
+
sleep(node: GnutellaServent, ms: number): Promise<void> {
|
|
120
|
+
return node.collaborators.scheduler.sleep(ms);
|
|
121
|
+
},
|
|
122
|
+
createConnection(
|
|
123
|
+
node: GnutellaServent,
|
|
124
|
+
options: net.NetConnectOpts,
|
|
125
|
+
): net.Socket {
|
|
126
|
+
return node.collaborators.netFactory.createConnection(options);
|
|
127
|
+
},
|
|
128
|
+
createServer(
|
|
129
|
+
node: GnutellaServent,
|
|
130
|
+
listener: (socket: net.Socket) => void,
|
|
131
|
+
): net.Server {
|
|
132
|
+
return node.collaborators.netFactory.createServer(listener);
|
|
133
|
+
},
|
|
134
|
+
connectBootstrapPeers(
|
|
135
|
+
node: GnutellaServent,
|
|
136
|
+
options: Parameters<
|
|
137
|
+
GnutellaServentCollaborators["bootstrapClient"]["connectBootstrapPeers"]
|
|
138
|
+
>[0],
|
|
139
|
+
) {
|
|
140
|
+
return node.collaborators.bootstrapClient.connectBootstrapPeers(
|
|
141
|
+
options,
|
|
142
|
+
);
|
|
143
|
+
},
|
|
144
|
+
reportSelfToGWebCaches(
|
|
145
|
+
node: GnutellaServent,
|
|
146
|
+
options: Parameters<
|
|
147
|
+
GnutellaServentCollaborators["bootstrapClient"]["reportSelfToGWebCaches"]
|
|
148
|
+
>[0],
|
|
149
|
+
) {
|
|
150
|
+
return node.collaborators.bootstrapClient.reportSelfToGWebCaches(
|
|
151
|
+
options,
|
|
152
|
+
);
|
|
153
|
+
},
|
|
154
|
+
updateRuntimeConfig(
|
|
155
|
+
node: GnutellaServent,
|
|
156
|
+
patch: Partial<RuntimeConfig>,
|
|
157
|
+
): RuntimeConfig {
|
|
158
|
+
node.runtimeConfig = applyRuntimeConfigPatch(
|
|
159
|
+
node.runtimeConfig,
|
|
160
|
+
patch,
|
|
161
|
+
);
|
|
162
|
+
node.doc.config = configDocForRuntime(node.runtimeConfig);
|
|
163
|
+
return node.runtimeConfig;
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
type CoreMethods = BoundMethods<typeof nodeCoreMethods>;
|
|
168
|
+
type StateMethods = BoundMethods<typeof state>;
|
|
169
|
+
const shareLibraryMethods = { refreshShares, totalSharedKBytes };
|
|
170
|
+
type ShareLibraryMethods = BoundMethods<typeof shareLibraryMethods>;
|
|
171
|
+
type LifecycleMethods = BoundMethods<typeof lifecycle>;
|
|
172
|
+
type HandshakeMethods = BoundMethods<typeof handshake>;
|
|
173
|
+
type FileServerMethods = BoundMethods<typeof fileServer>;
|
|
174
|
+
type ProtocolRuntimeMethods = BoundMethods<typeof protocolRuntime>;
|
|
175
|
+
type QrpRuntimeMethods = BoundMethods<typeof qrpRuntime>;
|
|
176
|
+
type TopologyMethods = BoundMethods<typeof topology>;
|
|
177
|
+
type TlsMethods = BoundMethods<typeof tlsSupport>;
|
|
178
|
+
type TransferMethods = BoundMethods<typeof transfer>;
|
|
179
|
+
|
|
180
|
+
export class GnutellaServent {
|
|
181
|
+
configPath: string;
|
|
182
|
+
doc: ConfigDoc;
|
|
183
|
+
persistedState: ConfigDoc["state"];
|
|
184
|
+
runtimeConfig: RuntimeConfig;
|
|
185
|
+
collaborators: GnutellaServentCollaborators;
|
|
186
|
+
serventId: Buffer;
|
|
187
|
+
server: net.Server | null = null;
|
|
188
|
+
peers = new Map<string, Peer>();
|
|
189
|
+
dialing = new Set<string>();
|
|
190
|
+
peerSeq = 0;
|
|
191
|
+
shares: ShareFile[] = [];
|
|
192
|
+
sharesByIndex = new Map<number, ShareFile>();
|
|
193
|
+
sharesByUrn = new Map<string, ShareFile>();
|
|
194
|
+
shareIndexEntries = new Map<string, ShareIndexEntry>();
|
|
195
|
+
shareIndexLoaded = false;
|
|
196
|
+
shareRefreshGeneration = 0;
|
|
197
|
+
shareHashTask: Promise<void> | null = null;
|
|
198
|
+
seen = new Map<string, number>();
|
|
199
|
+
pingRoutes = new Map<string, Route | typeof LOCAL_ROUTE>();
|
|
200
|
+
queryRoutes = new Map<string, Route | typeof LOCAL_ROUTE>();
|
|
201
|
+
pushRoutes = new Map<string, Route>();
|
|
202
|
+
lastResults: SearchHit[] = [];
|
|
203
|
+
resultSeq = 1;
|
|
204
|
+
downloads: DownloadRecord[] = [];
|
|
205
|
+
pendingPushes = new Map<string, PendingPush[]>();
|
|
206
|
+
activeAutoDownloadPaths = new Set<string>();
|
|
207
|
+
timers: NodeJS.Timeout[] = [];
|
|
208
|
+
timeouts: NodeJS.Timeout[] = [];
|
|
209
|
+
startedAtMs: number;
|
|
210
|
+
stopped = false;
|
|
211
|
+
listeners = new Set<GnutellaEventListener>();
|
|
212
|
+
qrpTable = new QrpTable();
|
|
213
|
+
pongCache = new Map<string, { payload: Buffer; at: number }>();
|
|
214
|
+
gwebCacheBootstrapState: GWebCacheBootstrapState = {};
|
|
215
|
+
gwebCacheReportTimer?: NodeJS.Timeout;
|
|
216
|
+
gwebCacheReportAttempted = false;
|
|
217
|
+
gwebCacheReported = false;
|
|
218
|
+
learnedAdvertisedHost?: string;
|
|
219
|
+
pendingAdvertisedHost?: string;
|
|
220
|
+
pendingAdvertisedSubnets = new Set<string>();
|
|
221
|
+
declare randomId16: CoreMethods["randomId16"];
|
|
222
|
+
declare rawHex16: CoreMethods["rawHex16"];
|
|
223
|
+
declare now: CoreMethods["now"];
|
|
224
|
+
declare sleep: CoreMethods["sleep"];
|
|
225
|
+
declare createConnection: CoreMethods["createConnection"];
|
|
226
|
+
declare createServer: CoreMethods["createServer"];
|
|
227
|
+
declare connectBootstrapPeers: CoreMethods["connectBootstrapPeers"];
|
|
228
|
+
declare reportSelfToGWebCaches: CoreMethods["reportSelfToGWebCaches"];
|
|
229
|
+
declare updateRuntimeConfig: CoreMethods["updateRuntimeConfig"];
|
|
230
|
+
declare subscribe: StateMethods["subscribe"];
|
|
231
|
+
declare emitEvent: StateMethods["emitEvent"];
|
|
232
|
+
declare emitMaintenanceError: StateMethods["emitMaintenanceError"];
|
|
233
|
+
declare schedule: StateMethods["schedule"];
|
|
234
|
+
declare scheduleOnce: StateMethods["scheduleOnce"];
|
|
235
|
+
declare cancelTimeout: StateMethods["cancelTimeout"];
|
|
236
|
+
declare peerInfo: StateMethods["peerInfo"];
|
|
237
|
+
declare peerCount: StateMethods["peerCount"];
|
|
238
|
+
declare config: StateMethods["config"];
|
|
239
|
+
declare getBlockedIps: StateMethods["getBlockedIps"];
|
|
240
|
+
declare isBlockedHost: StateMethods["isBlockedHost"];
|
|
241
|
+
declare configuredAdvertisedHost: StateMethods["configuredAdvertisedHost"];
|
|
242
|
+
declare currentAdvertisedPort: StateMethods["currentAdvertisedPort"];
|
|
243
|
+
declare currentAdvertisedHost: StateMethods["currentAdvertisedHost"];
|
|
244
|
+
declare selfHosts: StateMethods["selfHosts"];
|
|
245
|
+
declare isSelfPeer: StateMethods["isSelfPeer"];
|
|
246
|
+
declare maybeObserveAdvertisedHost: StateMethods["maybeObserveAdvertisedHost"];
|
|
247
|
+
declare trackPendingAdvertisedHost: StateMethods["trackPendingAdvertisedHost"];
|
|
248
|
+
declare absorbHandshakeHeaders: StateMethods["absorbHandshakeHeaders"];
|
|
249
|
+
declare save: StateMethods["save"];
|
|
250
|
+
declare refreshShares: ShareLibraryMethods["refreshShares"];
|
|
251
|
+
declare totalSharedKBytes: ShareLibraryMethods["totalSharedKBytes"];
|
|
252
|
+
declare addKnownPeer: StateMethods["addKnownPeer"];
|
|
253
|
+
declare updateKnownPeerLastSeen: StateMethods["updateKnownPeerLastSeen"];
|
|
254
|
+
declare peerSeenTimestamp: StateMethods["peerSeenTimestamp"];
|
|
255
|
+
declare pruneBlockedKnownPeers: StateMethods["pruneBlockedKnownPeers"];
|
|
256
|
+
declare pruneExpiredKnownPeers: StateMethods["pruneExpiredKnownPeers"];
|
|
257
|
+
declare shouldBootstrapFreshPeers: StateMethods["shouldBootstrapFreshPeers"];
|
|
258
|
+
declare rememberPeerAddresses: StateMethods["rememberPeerAddresses"];
|
|
259
|
+
declare markPeerSeenIfStable: StateMethods["markPeerSeenIfStable"];
|
|
260
|
+
declare blockIp: StateMethods["blockIp"];
|
|
261
|
+
declare unblockIp: StateMethods["unblockIp"];
|
|
262
|
+
declare scheduleGWebCacheReport: StateMethods["scheduleGWebCacheReport"];
|
|
263
|
+
declare refreshGWebCacheReport: StateMethods["refreshGWebCacheReport"];
|
|
264
|
+
declare announceSelfToGWebCaches: StateMethods["announceSelfToGWebCaches"];
|
|
265
|
+
declare peerDialState: StateMethods["peerDialState"];
|
|
266
|
+
declare connectToPeer: StateMethods["connectToPeer"];
|
|
267
|
+
declare markSeen: StateMethods["markSeen"];
|
|
268
|
+
declare hasSeen: StateMethods["hasSeen"];
|
|
269
|
+
declare pruneSeenEntries: StateMethods["pruneSeenEntries"];
|
|
270
|
+
declare pruneRouteEntries: StateMethods["pruneRouteEntries"];
|
|
271
|
+
declare prunePushRoutes: StateMethods["prunePushRoutes"];
|
|
272
|
+
declare prunePendingPushQueues: StateMethods["prunePendingPushQueues"];
|
|
273
|
+
declare prunePongCache: StateMethods["prunePongCache"];
|
|
274
|
+
declare pruneMaps: StateMethods["pruneMaps"];
|
|
275
|
+
declare getPeers: StateMethods["getPeers"];
|
|
276
|
+
declare getShares: StateMethods["getShares"];
|
|
277
|
+
declare getResults: StateMethods["getResults"];
|
|
278
|
+
declare clearResults: StateMethods["clearResults"];
|
|
279
|
+
declare getKnownPeers: StateMethods["getKnownPeers"];
|
|
280
|
+
declare getDownloads: StateMethods["getDownloads"];
|
|
281
|
+
declare getServentIdHex: StateMethods["getServentIdHex"];
|
|
282
|
+
declare getStatus: StateMethods["getStatus"];
|
|
283
|
+
declare reserveAutoDownloadPath: StateMethods["reserveAutoDownloadPath"];
|
|
284
|
+
declare start: LifecycleMethods["start"];
|
|
285
|
+
declare stop: LifecycleMethods["stop"];
|
|
286
|
+
declare startServer: LifecycleMethods["startServer"];
|
|
287
|
+
declare connectKnownPeers: LifecycleMethods["connectKnownPeers"];
|
|
288
|
+
declare connectPeer: LifecycleMethods["connectPeer"];
|
|
289
|
+
declare tlsEnabled: TlsMethods["tlsEnabled"];
|
|
290
|
+
declare socketUsesTls: TlsMethods["socketUsesTls"];
|
|
291
|
+
declare canUpgradeSocketToTls: TlsMethods["canUpgradeSocketToTls"];
|
|
292
|
+
declare peerRequestedTlsUpgrade: TlsMethods["peerRequestedTlsUpgrade"];
|
|
293
|
+
declare peerAcceptedTlsUpgrade: TlsMethods["peerAcceptedTlsUpgrade"];
|
|
294
|
+
declare clientAcceptedTlsUpgrade: TlsMethods["clientAcceptedTlsUpgrade"];
|
|
295
|
+
declare tlsUpgradeToken: TlsMethods["tlsUpgradeToken"];
|
|
296
|
+
declare upgradeSocketToTls: TlsMethods["upgradeSocketToTls"];
|
|
297
|
+
declare baseHandshakeHeaders: HandshakeMethods["baseHandshakeHeaders"];
|
|
298
|
+
declare buildServerHandshakeHeaders: HandshakeMethods["buildServerHandshakeHeaders"];
|
|
299
|
+
declare buildClientFinalHeaders: HandshakeMethods["buildClientFinalHeaders"];
|
|
300
|
+
declare buildCapabilities: HandshakeMethods["buildCapabilities"];
|
|
301
|
+
declare selectTryPeers: HandshakeMethods["selectTryPeers"];
|
|
302
|
+
declare maybeAbsorbTryHeaders: HandshakeMethods["maybeAbsorbTryHeaders"];
|
|
303
|
+
declare reject06: HandshakeMethods["reject06"];
|
|
304
|
+
declare handleProbe: HandshakeMethods["handleProbe"];
|
|
305
|
+
declare handleUndecidedProbe: HandshakeMethods["handleUndecidedProbe"];
|
|
306
|
+
declare handleInbound06Probe: HandshakeMethods["handleInbound06Probe"];
|
|
307
|
+
declare rejectLegacyInboundProbe: HandshakeMethods["rejectLegacyInboundProbe"];
|
|
308
|
+
declare startHttpProbeSession: HandshakeMethods["startHttpProbeSession"];
|
|
309
|
+
declare startGivProbeSession: HandshakeMethods["startGivProbeSession"];
|
|
310
|
+
declare finishInbound06Probe: HandshakeMethods["finishInbound06Probe"];
|
|
311
|
+
declare tryDecideProbe: HandshakeMethods["tryDecideProbe"];
|
|
312
|
+
declare connectPeer06: HandshakeMethods["connectPeer06"];
|
|
313
|
+
declare nodeMode: TopologyMethods["nodeMode"];
|
|
314
|
+
declare classifyPeerRole: TopologyMethods["classifyPeerRole"];
|
|
315
|
+
declare peerRole: TopologyMethods["peerRole"];
|
|
316
|
+
declare countPeersByRole: TopologyMethods["countPeersByRole"];
|
|
317
|
+
declare connectedLeafCount: TopologyMethods["connectedLeafCount"];
|
|
318
|
+
declare connectedMeshPeerCount: TopologyMethods["connectedMeshPeerCount"];
|
|
319
|
+
declare availableDialSlots: TopologyMethods["availableDialSlots"];
|
|
320
|
+
declare canAcceptPeerRole: TopologyMethods["canAcceptPeerRole"];
|
|
321
|
+
declare shouldRelayQueries: TopologyMethods["shouldRelayQueries"];
|
|
322
|
+
declare shouldRelayPings: TopologyMethods["shouldRelayPings"];
|
|
323
|
+
declare isLeafPeer: TopologyMethods["isLeafPeer"];
|
|
324
|
+
declare isMeshPeer: TopologyMethods["isMeshPeer"];
|
|
325
|
+
declare attachPeer: ProtocolRuntimeMethods["attachPeer"];
|
|
326
|
+
declare startHttpSession: ProtocolRuntimeMethods["startHttpSession"];
|
|
327
|
+
declare pendingHttpSessionHeadEnd: ProtocolRuntimeMethods["pendingHttpSessionHeadEnd"];
|
|
328
|
+
declare shiftHttpSessionHead: ProtocolRuntimeMethods["shiftHttpSessionHead"];
|
|
329
|
+
declare shiftHttpSessionRequest: ProtocolRuntimeMethods["shiftHttpSessionRequest"];
|
|
330
|
+
declare processHttpSessionRequests: ProtocolRuntimeMethods["processHttpSessionRequests"];
|
|
331
|
+
declare drainHttpSession: ProtocolRuntimeMethods["drainHttpSession"];
|
|
332
|
+
declare consumePeerBuffer: ProtocolRuntimeMethods["consumePeerBuffer"];
|
|
333
|
+
declare validateDescriptor: ProtocolRuntimeMethods["validateDescriptor"];
|
|
334
|
+
declare sendRaw: ProtocolRuntimeMethods["sendRaw"];
|
|
335
|
+
declare sendToPeer: ProtocolRuntimeMethods["sendToPeer"];
|
|
336
|
+
declare forwardToRoute: ProtocolRuntimeMethods["forwardToRoute"];
|
|
337
|
+
declare broadcast: ProtocolRuntimeMethods["broadcast"];
|
|
338
|
+
declare broadcastQuery: ProtocolRuntimeMethods["broadcastQuery"];
|
|
339
|
+
declare normalizeQueryLifetime: ProtocolRuntimeMethods["normalizeQueryLifetime"];
|
|
340
|
+
declare isIndexQuery: ProtocolRuntimeMethods["isIndexQuery"];
|
|
341
|
+
declare shouldIgnoreQuery: ProtocolRuntimeMethods["shouldIgnoreQuery"];
|
|
342
|
+
declare enqueuePendingPush: ProtocolRuntimeMethods["enqueuePendingPush"];
|
|
343
|
+
declare shiftPendingPush: ProtocolRuntimeMethods["shiftPendingPush"];
|
|
344
|
+
declare cachePongPayload: ProtocolRuntimeMethods["cachePongPayload"];
|
|
345
|
+
declare shouldIgnoreDescriptor: ProtocolRuntimeMethods["shouldIgnoreDescriptor"];
|
|
346
|
+
declare rejectRelayedLeafDescriptor: ProtocolRuntimeMethods["rejectRelayedLeafDescriptor"];
|
|
347
|
+
declare onPingDescriptor: ProtocolRuntimeMethods["onPingDescriptor"];
|
|
348
|
+
declare onQueryDescriptor: ProtocolRuntimeMethods["onQueryDescriptor"];
|
|
349
|
+
declare dispatchDescriptor: ProtocolRuntimeMethods["dispatchDescriptor"];
|
|
350
|
+
declare handleDescriptor: ProtocolRuntimeMethods["handleDescriptor"];
|
|
351
|
+
declare onRouteTableUpdate: QrpRuntimeMethods["onRouteTableUpdate"];
|
|
352
|
+
declare sendQrpTable: QrpRuntimeMethods["sendQrpTable"];
|
|
353
|
+
declare sendBye: ProtocolRuntimeMethods["sendBye"];
|
|
354
|
+
declare respondPong: ProtocolRuntimeMethods["respondPong"];
|
|
355
|
+
declare respondQueryHit: ProtocolRuntimeMethods["respondQueryHit"];
|
|
356
|
+
declare onPong: ProtocolRuntimeMethods["onPong"];
|
|
357
|
+
declare onQueryHit: ProtocolRuntimeMethods["onQueryHit"];
|
|
358
|
+
declare onPush: ProtocolRuntimeMethods["onPush"];
|
|
359
|
+
declare onBye: ProtocolRuntimeMethods["onBye"];
|
|
360
|
+
declare fulfillPush: ProtocolRuntimeMethods["fulfillPush"];
|
|
361
|
+
declare handleIncomingGet: FileServerMethods["handleIncomingGet"];
|
|
362
|
+
declare parseExistingGetRequest: FileServerMethods["parseExistingGetRequest"];
|
|
363
|
+
declare writeInvalidRangeResponse: FileServerMethods["writeInvalidRangeResponse"];
|
|
364
|
+
declare existingGetBodyLength: FileServerMethods["existingGetBodyLength"];
|
|
365
|
+
declare buildExistingGetResponseHeaders: FileServerMethods["buildExistingGetResponseHeaders"];
|
|
366
|
+
declare finishExistingGetResponse: FileServerMethods["finishExistingGetResponse"];
|
|
367
|
+
declare streamExistingGetBody: FileServerMethods["streamExistingGetBody"];
|
|
368
|
+
declare handleExistingGet: FileServerMethods["handleExistingGet"];
|
|
369
|
+
declare handleIncomingGiv: TransferMethods["handleIncomingGiv"];
|
|
370
|
+
declare downloadOverSocket: TransferMethods["downloadOverSocket"];
|
|
371
|
+
declare directDownloadViaRequest: TransferMethods["directDownloadViaRequest"];
|
|
372
|
+
declare directDownload: TransferMethods["directDownload"];
|
|
373
|
+
declare initializeHttpDownloadState: TransferMethods["initializeHttpDownloadState"];
|
|
374
|
+
declare writeHttpDownloadBody: TransferMethods["writeHttpDownloadBody"];
|
|
375
|
+
declare consumeHttpDownloadChunk: TransferMethods["consumeHttpDownloadChunk"];
|
|
376
|
+
declare readHttpDownload: TransferMethods["readHttpDownload"];
|
|
377
|
+
declare sendPush: TransferMethods["sendPush"];
|
|
378
|
+
declare downloadResult: TransferMethods["downloadResult"];
|
|
379
|
+
declare browsePeer: TransferMethods["browsePeer"];
|
|
380
|
+
declare sendPing: TransferMethods["sendPing"];
|
|
381
|
+
declare sendQuery: TransferMethods["sendQuery"];
|
|
382
|
+
|
|
383
|
+
constructor(
|
|
384
|
+
configPath: string,
|
|
385
|
+
doc: ConfigDoc,
|
|
386
|
+
options: GnutellaServentOptions = {},
|
|
387
|
+
) {
|
|
388
|
+
this.configPath = path.resolve(configPath);
|
|
389
|
+
this.doc = doc;
|
|
390
|
+
this.persistedState = this.doc.state;
|
|
391
|
+
this.runtimeConfig = applyRuntimeConfigPatch(
|
|
392
|
+
runtimeConfigFor(this.configPath, doc),
|
|
393
|
+
options.runtimeConfig || {},
|
|
394
|
+
);
|
|
395
|
+
this.doc.config = configDocForRuntime(this.runtimeConfig);
|
|
396
|
+
this.collaborators = buildCollaborators(options.collaborators);
|
|
397
|
+
this.startedAtMs = this.collaborators.clock.now();
|
|
398
|
+
this.serventId = fromHex16(doc.state.serventIdHex);
|
|
399
|
+
if (options.onEvent) this.listeners.add(options.onEvent);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
Object.assign(
|
|
404
|
+
GnutellaServent.prototype,
|
|
405
|
+
bindNodeMethods(nodeCoreMethods),
|
|
406
|
+
bindNodeMethods(state),
|
|
407
|
+
bindNodeMethods(shareLibraryMethods),
|
|
408
|
+
bindNodeMethods(lifecycle),
|
|
409
|
+
bindNodeMethods(tlsSupport),
|
|
410
|
+
bindNodeMethods(handshake),
|
|
411
|
+
bindNodeMethods(fileServer),
|
|
412
|
+
bindNodeMethods(topology),
|
|
413
|
+
bindNodeMethods(protocolRuntime),
|
|
414
|
+
bindNodeMethods(qrpRuntime),
|
|
415
|
+
bindNodeMethods(transfer),
|
|
416
|
+
);
|