/
var
/
www
/
greso.tech
/
server
/
nsm
/
node_modules
/
@grpc
/
grpc-js
/
build
/
src
/
/var/www/greso.tech/server/nsm/node_modules/@grpc/grpc-js/build/src
mkdir
upload
Name
Size
Mode
Actions
generated/
-
0755
rm
admin.d.ts
447
0644
edit
dl
rm
admin.js
1277
0644
edit
dl
rm
admin.js.map
471
0644
edit
dl
rm
backoff-timeout.d.ts
2187
0644
edit
dl
rm
backoff-timeout.js
5071
0644
edit
dl
rm
backoff-timeout.js.map
2911
0644
edit
dl
rm
call-credentials-filter.d.ts
684
0644
edit
dl
rm
call-credentials-filter.js
3274
0644
edit
dl
rm
call-credentials-filter.js.map
1724
0644
edit
dl
rm
call-credentials.d.ts
2407
0644
edit
dl
rm
call-credentials.js
5178
0644
edit
dl
rm
call-credentials.js.map
3363
0644
edit
dl
rm
call-interface.d.ts
2834
0644
edit
dl
rm
call-interface.js
3143
0644
edit
dl
rm
call-interface.js.map
1888
0644
edit
dl
rm
call-number.d.ts
53
0644
edit
dl
rm
call-number.js
885
0644
edit
dl
rm
call-number.js.map
240
0644
edit
dl
rm
call-stream.d.ts
5795
0644
edit
dl
rm
call-stream.js
30144
0644
edit
dl
rm
call-stream.js.map
18516
0644
edit
dl
rm
call.d.ts
3600
0644
edit
dl
rm
call.js
5073
0644
edit
dl
rm
call.js.map
2885
0644
edit
dl
rm
channel-credentials.d.ts
3859
0644
edit
dl
rm
channel-credentials.js
7316
0644
edit
dl
rm
channel-credentials.js.map
3679
0644
edit
dl
rm
channel-options.d.ts
2753
0644
edit
dl
rm
channel-options.js
2430
0644
edit
dl
rm
channel-options.js.map
1346
0644
edit
dl
rm
channel.d.ts
3747
0644
edit
dl
rm
channel.js
2729
0644
edit
dl
rm
channel.js.map
1423
0644
edit
dl
rm
channelz.d.ts
3900
0644
edit
dl
rm
channelz.js
22980
0644
edit
dl
rm
channelz.js.map
17367
0644
edit
dl
rm
client-interceptors.d.ts
4611
0644
edit
dl
rm
client-interceptors.js
17787
0644
edit
dl
rm
client-interceptors.js.map
10601
0644
edit
dl
rm
client.d.ts
5817
0644
edit
dl
rm
client.js
18974
0644
edit
dl
rm
client.js.map
11855
0644
edit
dl
rm
compression-algorithms.d.ts
94
0644
edit
dl
rm
compression-algorithms.js
1158
0644
edit
dl
rm
compression-algorithms.js.map
311
0644
edit
dl
rm
compression-filter.d.ts
1215
0644
edit
dl
rm
compression-filter.js
10307
0644
edit
dl
rm
compression-filter.js.map
6265
0644
edit
dl
rm
connectivity-state.d.ts
135
0644
edit
dl
rm
connectivity-state.js
1264
0644
edit
dl
rm
connectivity-state.js.map
327
0644
edit
dl
rm
constants.d.ts
944
0644
edit
dl
rm
constants.js
3106
0644
edit
dl
rm
constants.js.map
950
0644
edit
dl
rm
control-plane-status.d.ts
169
0644
edit
dl
rm
control-plane-status.js
1581
0644
edit
dl
rm
control-plane-status.js.map
670
0644
edit
dl
rm
deadline-filter.d.ts
825
0644
edit
dl
rm
deadline-filter.js
3628
0644
edit
dl
rm
deadline-filter.js.map
2579
0644
edit
dl
rm
deadline.d.ts
752
0644
edit
dl
rm
deadline.js
3351
0644
edit
dl
rm
deadline.js.map
1919
0644
edit
dl
rm
duration.d.ts
267
0644
edit
dl
rm
duration.js
1253
0644
edit
dl
rm
duration.js.map
606
0644
edit
dl
rm
error.d.ts
134
0644
edit
dl
rm
error.js
1236
0644
edit
dl
rm
error.js.map
520
0644
edit
dl
rm
events.d.ts
521
0644
edit
dl
rm
events.js
711
0644
edit
dl
rm
events.js.map
131
0644
edit
dl
rm
experimental.d.ts
1314
0644
edit
dl
rm
experimental.js
4211
0644
edit
dl
rm
experimental.js.map
764
0644
edit
dl
rm
filter-stack.d.ts
969
0644
edit
dl
rm
filter-stack.js
2542
0644
edit
dl
rm
filter-stack.js.map
2090
0644
edit
dl
rm
filter.d.ts
1192
0644
edit
dl
rm
filter.js
1111
0644
edit
dl
rm
filter.js.map
464
0644
edit
dl
rm
http_proxy.d.ts
727
0644
edit
dl
rm
http_proxy.js
9424
0644
edit
dl
rm
http_proxy.js.map
6084
0644
edit
dl
rm
index.d.ts
5350
0644
edit
dl
rm
index.js
9234
0644
edit
dl
rm
index.js.map
3099
0644
edit
dl
rm
internal-channel.d.ts
4889
0644
edit
dl
rm
internal-channel.js
21474
0644
edit
dl
rm
internal-channel.js.map
14231
0644
edit
dl
rm
load-balancer-child-handler.d.ts
815
0644
edit
dl
rm
load-balancer-child-handler.js
5236
0644
edit
dl
rm
load-balancer-child-handler.js.map
3246
0644
edit
dl
rm
load-balancer-outlier-detection.d.ts
2663
0644
edit
dl
rm
load-balancer-outlier-detection.js
25785
0644
edit
dl
rm
load-balancer-outlier-detection.js.map
18310
0644
edit
dl
rm
load-balancer-pick-first.d.ts
2828
0644
edit
dl
rm
load-balancer-pick-first.js
17509
0644
edit
dl
rm
load-balancer-pick-first.js.map
9506
0644
edit
dl
rm
load-balancer-round-robin.d.ts
804
0644
edit
dl
rm
load-balancer-round-robin.js
7816
0644
edit
dl
rm
load-balancer-round-robin.js.map
5019
0644
edit
dl
rm
load-balancer.d.ts
4453
0644
edit
dl
rm
load-balancer.js
4845
0644
edit
dl
rm
load-balancer.js.map
2428
0644
edit
dl
rm
load-balancing-call.d.ts
1847
0644
edit
dl
rm
load-balancing-call.js
11647
0644
edit
dl
rm
load-balancing-call.js.map
7531
0644
edit
dl
rm
logging.d.ts
477
0644
edit
dl
rm
logging.js
4006
0644
edit
dl
rm
logging.js.map
2795
0644
edit
dl
rm
make-client.d.ts
3002
0644
edit
dl
rm
make-client.js
5498
0644
edit
dl
rm
make-client.js.map
3112
0644
edit
dl
rm
max-message-size-filter.d.ts
762
0644
edit
dl
rm
max-message-size-filter.js
3360
0644
edit
dl
rm
max-message-size-filter.js.map
1596
0644
edit
dl
rm
metadata.d.ts
3241
0644
edit
dl
rm
metadata.js
8839
0644
edit
dl
rm
metadata.js.map
5645
0644
edit
dl
rm
object-stream.d.ts
1604
0644
edit
dl
rm
object-stream.js
718
0644
edit
dl
rm
object-stream.js.map
145
0644
edit
dl
rm
picker.d.ts
3039
0644
edit
dl
rm
picker.js
3108
0644
edit
dl
rm
picker.js.map
1252
0644
edit
dl
rm
resolver-dns.d.ts
232
0644
edit
dl
rm
resolver-dns.js
13390
0644
edit
dl
rm
resolver-dns.js.map
7558
0644
edit
dl
rm
resolver-ip.d.ts
39
0644
edit
dl
rm
resolver-ip.js
3833
0644
edit
dl
rm
resolver-ip.js.map
2512
0644
edit
dl
rm
resolver-uds.d.ts
39
0644
edit
dl
rm
resolver-uds.js
1522
0644
edit
dl
rm
resolver-uds.js.map
823
0644
edit
dl
rm
resolver.d.ts
4288
0644
edit
dl
rm
resolver.js
3231
0644
edit
dl
rm
resolver.js.map
1399
0644
edit
dl
rm
resolving-call.d.ts
1754
0644
edit
dl
rm
resolving-call.js
10711
0644
edit
dl
rm
resolving-call.js.map
8551
0644
edit
dl
rm
resolving-load-balancer.d.ts
2839
0644
edit
dl
rm
resolving-load-balancer.js
12027
0644
edit
dl
rm
resolving-load-balancer.js.map
6285
0644
edit
dl
rm
retrying-call.d.ts
3528
0644
edit
dl
rm
retrying-call.js
24658
0644
edit
dl
rm
retrying-call.js.map
18318
0644
edit
dl
rm
server-call.d.ts
8283
0644
edit
dl
rm
server-call.js
24281
0644
edit
dl
rm
server-call.js.map
19534
0644
edit
dl
rm
server-credentials.d.ts
511
0644
edit
dl
rm
server-credentials.js
2834
0644
edit
dl
rm
server-credentials.js.map
1787
0644
edit
dl
rm
server.d.ts
2214
0644
edit
dl
rm
server.js
38251
0644
edit
dl
rm
server.js.map
26851
0644
edit
dl
rm
service-config.d.ts
2163
0644
edit
dl
rm
service-config.js
16161
0644
edit
dl
rm
service-config.js.map
10475
0644
edit
dl
rm
status-builder.d.ts
657
0644
edit
dl
rm
status-builder.js
1767
0644
edit
dl
rm
status-builder.js.map
972
0644
edit
dl
rm
stream-decoder.d.ts
313
0644
edit
dl
rm
stream-decoder.js
4267
0644
edit
dl
rm
stream-decoder.js.map
2715
0644
edit
dl
rm
subchannel-address.d.ts
950
0644
edit
dl
rm
subchannel-address.js
2228
0644
edit
dl
rm
subchannel-address.js.map
1195
0644
edit
dl
rm
subchannel-call.d.ts
2258
0644
edit
dl
rm
subchannel-call.js
20012
0644
edit
dl
rm
subchannel-call.js.map
11156
0644
edit
dl
rm
subchannel-interface.d.ts
1842
0644
edit
dl
rm
subchannel-interface.js
1703
0644
edit
dl
rm
subchannel-interface.js.map
974
0644
edit
dl
rm
subchannel-pool.d.ts
1472
0644
edit
dl
rm
subchannel-pool.js
5674
0644
edit
dl
rm
subchannel-pool.js.map
2494
0644
edit
dl
rm
subchannel.d.ts
4654
0644
edit
dl
rm
subchannel.js
14590
0644
edit
dl
rm
subchannel.js.map
8187
0644
edit
dl
rm
tls-helpers.d.ts
149
0644
edit
dl
rm
tls-helpers.js
1272
0644
edit
dl
rm
tls-helpers.js.map
502
0644
edit
dl
rm
transport.d.ts
4473
0644
edit
dl
rm
transport.js
26888
0644
edit
dl
rm
transport.js.map
14801
0644
edit
dl
rm
uri-parser.d.ts
357
0644
edit
dl
rm
uri-parser.js
3274
0644
edit
dl
rm
uri-parser.js.map
2010
0644
edit
dl
rm
Edit:
/var/www/greso.tech/server/nsm/node_modules/@grpc/grpc-js/build/src/server.js
(38251B)
"use strict"; /* * Copyright 2019 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ Object.defineProperty(exports, "__esModule", { value: true }); exports.Server = void 0; const http2 = require("http2"); const constants_1 = require("./constants"); const server_call_1 = require("./server-call"); const server_credentials_1 = require("./server-credentials"); const resolver_1 = require("./resolver"); const logging = require("./logging"); const subchannel_address_1 = require("./subchannel-address"); const uri_parser_1 = require("./uri-parser"); const channelz_1 = require("./channelz"); const error_1 = require("./error"); const UNLIMITED_CONNECTION_AGE_MS = ~(1 << 31); const KEEPALIVE_MAX_TIME_MS = ~(1 << 31); const KEEPALIVE_TIMEOUT_MS = 20000; const { HTTP2_HEADER_PATH } = http2.constants; const TRACER_NAME = 'server'; function noop() { } function getUnimplementedStatusResponse(methodName) { return { code: constants_1.Status.UNIMPLEMENTED, details: `The server does not implement the method ${methodName}`, }; } function getDefaultHandler(handlerType, methodName) { const unimplementedStatusResponse = getUnimplementedStatusResponse(methodName); switch (handlerType) { case 'unary': return (call, callback) => { callback(unimplementedStatusResponse, null); }; case 'clientStream': return (call, callback) => { callback(unimplementedStatusResponse, null); }; case 'serverStream': return (call) => { call.emit('error', unimplementedStatusResponse); }; case 'bidi': return (call) => { call.emit('error', unimplementedStatusResponse); }; default: throw new Error(`Invalid handlerType ${handlerType}`); } } class Server { constructor(options) { var _a, _b, _c, _d; this.http2ServerList = []; this.handlers = new Map(); this.sessions = new Map(); this.started = false; this.serverAddressString = 'null'; // Channelz Info this.channelzEnabled = true; this.channelzTrace = new channelz_1.ChannelzTrace(); this.callTracker = new channelz_1.ChannelzCallTracker(); this.listenerChildrenTracker = new channelz_1.ChannelzChildrenTracker(); this.sessionChildrenTracker = new channelz_1.ChannelzChildrenTracker(); this.options = options !== null && options !== void 0 ? options : {}; if (this.options['grpc.enable_channelz'] === 0) { this.channelzEnabled = false; } this.channelzRef = (0, channelz_1.registerChannelzServer)(() => this.getChannelzInfo(), this.channelzEnabled); if (this.channelzEnabled) { this.channelzTrace.addTrace('CT_INFO', 'Server created'); } this.maxConnectionAgeMs = (_a = this.options['grpc.max_connection_age_ms']) !== null && _a !== void 0 ? _a : UNLIMITED_CONNECTION_AGE_MS; this.maxConnectionAgeGraceMs = (_b = this.options['grpc.max_connection_age_grace_ms']) !== null && _b !== void 0 ? _b : UNLIMITED_CONNECTION_AGE_MS; this.keepaliveTimeMs = (_c = this.options['grpc.keepalive_time_ms']) !== null && _c !== void 0 ? _c : KEEPALIVE_MAX_TIME_MS; this.keepaliveTimeoutMs = (_d = this.options['grpc.keepalive_timeout_ms']) !== null && _d !== void 0 ? _d : KEEPALIVE_TIMEOUT_MS; this.trace('Server constructed'); } getChannelzInfo() { return { trace: this.channelzTrace, callTracker: this.callTracker, listenerChildren: this.listenerChildrenTracker.getChildLists(), sessionChildren: this.sessionChildrenTracker.getChildLists() }; } getChannelzSessionInfoGetter(session) { return () => { var _a, _b, _c; const sessionInfo = this.sessions.get(session); const sessionSocket = session.socket; const remoteAddress = sessionSocket.remoteAddress ? (0, subchannel_address_1.stringToSubchannelAddress)(sessionSocket.remoteAddress, sessionSocket.remotePort) : null; const localAddress = sessionSocket.localAddress ? (0, subchannel_address_1.stringToSubchannelAddress)(sessionSocket.localAddress, sessionSocket.localPort) : null; let tlsInfo; if (session.encrypted) { const tlsSocket = sessionSocket; const cipherInfo = tlsSocket.getCipher(); const certificate = tlsSocket.getCertificate(); const peerCertificate = tlsSocket.getPeerCertificate(); tlsInfo = { cipherSuiteStandardName: (_a = cipherInfo.standardName) !== null && _a !== void 0 ? _a : null, cipherSuiteOtherName: cipherInfo.standardName ? null : cipherInfo.name, localCertificate: (certificate && 'raw' in certificate) ? certificate.raw : null, remoteCertificate: (peerCertificate && 'raw' in peerCertificate) ? peerCertificate.raw : null }; } else { tlsInfo = null; } const socketInfo = { remoteAddress: remoteAddress, localAddress: localAddress, security: tlsInfo, remoteName: null, streamsStarted: sessionInfo.streamTracker.callsStarted, streamsSucceeded: sessionInfo.streamTracker.callsSucceeded, streamsFailed: sessionInfo.streamTracker.callsFailed, messagesSent: sessionInfo.messagesSent, messagesReceived: sessionInfo.messagesReceived, keepAlivesSent: 0, lastLocalStreamCreatedTimestamp: null, lastRemoteStreamCreatedTimestamp: sessionInfo.streamTracker.lastCallStartedTimestamp, lastMessageSentTimestamp: sessionInfo.lastMessageSentTimestamp, lastMessageReceivedTimestamp: sessionInfo.lastMessageReceivedTimestamp, localFlowControlWindow: (_b = session.state.localWindowSize) !== null && _b !== void 0 ? _b : null, remoteFlowControlWindow: (_c = session.state.remoteWindowSize) !== null && _c !== void 0 ? _c : null }; return socketInfo; }; } trace(text) { logging.trace(constants_1.LogVerbosity.DEBUG, TRACER_NAME, '(' + this.channelzRef.id + ') ' + text); } addProtoService() { throw new Error('Not implemented. Use addService() instead'); } addService(service, implementation) { if (service === null || typeof service !== 'object' || implementation === null || typeof implementation !== 'object') { throw new Error('addService() requires two objects as arguments'); } const serviceKeys = Object.keys(service); if (serviceKeys.length === 0) { throw new Error('Cannot add an empty service to a server'); } serviceKeys.forEach((name) => { const attrs = service[name]; let methodType; if (attrs.requestStream) { if (attrs.responseStream) { methodType = 'bidi'; } else { methodType = 'clientStream'; } } else { if (attrs.responseStream) { methodType = 'serverStream'; } else { methodType = 'unary'; } } let implFn = implementation[name]; let impl; if (implFn === undefined && typeof attrs.originalName === 'string') { implFn = implementation[attrs.originalName]; } if (implFn !== undefined) { impl = implFn.bind(implementation); } else { impl = getDefaultHandler(methodType, name); } const success = this.register(attrs.path, impl, attrs.responseSerialize, attrs.requestDeserialize, methodType); if (success === false) { throw new Error(`Method handler for ${attrs.path} already provided.`); } }); } removeService(service) { if (service === null || typeof service !== 'object') { throw new Error('removeService() requires object as argument'); } const serviceKeys = Object.keys(service); serviceKeys.forEach((name) => { const attrs = service[name]; this.unregister(attrs.path); }); } bind(port, creds) { throw new Error('Not implemented. Use bindAsync() instead'); } bindAsync(port, creds, callback) { if (this.started === true) { throw new Error('server is already started'); } if (typeof port !== 'string') { throw new TypeError('port must be a string'); } if (creds === null || !(creds instanceof server_credentials_1.ServerCredentials)) { throw new TypeError('creds must be a ServerCredentials object'); } if (typeof callback !== 'function') { throw new TypeError('callback must be a function'); } const initialPortUri = (0, uri_parser_1.parseUri)(port); if (initialPortUri === null) { throw new Error(`Could not parse port "${port}"`); } const portUri = (0, resolver_1.mapUriDefaultScheme)(initialPortUri); if (portUri === null) { throw new Error(`Could not get a default scheme for port "${port}"`); } const serverOptions = { maxSendHeaderBlockLength: Number.MAX_SAFE_INTEGER, }; if ('grpc-node.max_session_memory' in this.options) { serverOptions.maxSessionMemory = this.options['grpc-node.max_session_memory']; } else { /* By default, set a very large max session memory limit, to effectively * disable enforcement of the limit. Some testing indicates that Node's * behavior degrades badly when this limit is reached, so we solve that * by disabling the check entirely. */ serverOptions.maxSessionMemory = Number.MAX_SAFE_INTEGER; } if ('grpc.max_concurrent_streams' in this.options) { serverOptions.settings = { maxConcurrentStreams: this.options['grpc.max_concurrent_streams'], }; } const deferredCallback = (error, port) => { process.nextTick(() => callback(error, port)); }; const setupServer = () => { let http2Server; if (creds._isSecure()) { const secureServerOptions = Object.assign(serverOptions, creds._getSettings()); http2Server = http2.createSecureServer(secureServerOptions); http2Server.on('secureConnection', (socket) => { /* These errors need to be handled by the user of Http2SecureServer, * according to https://github.com/nodejs/node/issues/35824 */ socket.on('error', (e) => { this.trace('An incoming TLS connection closed with error: ' + e.message); }); }); } else { http2Server = http2.createServer(serverOptions); } http2Server.setTimeout(0, noop); this._setupHandlers(http2Server); return http2Server; }; const bindSpecificPort = (addressList, portNum, previousCount) => { if (addressList.length === 0) { return Promise.resolve({ port: portNum, count: previousCount }); } return Promise.all(addressList.map((address) => { this.trace('Attempting to bind ' + (0, subchannel_address_1.subchannelAddressToString)(address)); let addr; if ((0, subchannel_address_1.isTcpSubchannelAddress)(address)) { addr = { host: address.host, port: portNum, }; } else { addr = address; } const http2Server = setupServer(); return new Promise((resolve, reject) => { const onError = (err) => { this.trace('Failed to bind ' + (0, subchannel_address_1.subchannelAddressToString)(address) + ' with error ' + err.message); resolve(err); }; http2Server.once('error', onError); http2Server.listen(addr, () => { const boundAddress = http2Server.address(); let boundSubchannelAddress; if (typeof boundAddress === 'string') { boundSubchannelAddress = { path: boundAddress }; } else { boundSubchannelAddress = { host: boundAddress.address, port: boundAddress.port }; } let channelzRef; channelzRef = (0, channelz_1.registerChannelzSocket)((0, subchannel_address_1.subchannelAddressToString)(boundSubchannelAddress), () => { return { localAddress: boundSubchannelAddress, remoteAddress: null, security: null, remoteName: null, streamsStarted: 0, streamsSucceeded: 0, streamsFailed: 0, messagesSent: 0, messagesReceived: 0, keepAlivesSent: 0, lastLocalStreamCreatedTimestamp: null, lastRemoteStreamCreatedTimestamp: null, lastMessageSentTimestamp: null, lastMessageReceivedTimestamp: null, localFlowControlWindow: null, remoteFlowControlWindow: null }; }, this.channelzEnabled); if (this.channelzEnabled) { this.listenerChildrenTracker.refChild(channelzRef); } this.http2ServerList.push({ server: http2Server, channelzRef: channelzRef }); this.trace('Successfully bound ' + (0, subchannel_address_1.subchannelAddressToString)(boundSubchannelAddress)); resolve('port' in boundSubchannelAddress ? boundSubchannelAddress.port : portNum); http2Server.removeListener('error', onError); }); }); })).then((results) => { let count = 0; for (const result of results) { if (typeof result === 'number') { count += 1; if (result !== portNum) { throw new Error('Invalid state: multiple port numbers added from single address'); } } } return { port: portNum, count: count + previousCount, }; }); }; const bindWildcardPort = (addressList) => { if (addressList.length === 0) { return Promise.resolve({ port: 0, count: 0 }); } const address = addressList[0]; const http2Server = setupServer(); return new Promise((resolve, reject) => { const onError = (err) => { this.trace('Failed to bind ' + (0, subchannel_address_1.subchannelAddressToString)(address) + ' with error ' + err.message); resolve(bindWildcardPort(addressList.slice(1))); }; http2Server.once('error', onError); http2Server.listen(address, () => { const boundAddress = http2Server.address(); const boundSubchannelAddress = { host: boundAddress.address, port: boundAddress.port }; let channelzRef; channelzRef = (0, channelz_1.registerChannelzSocket)((0, subchannel_address_1.subchannelAddressToString)(boundSubchannelAddress), () => { return { localAddress: boundSubchannelAddress, remoteAddress: null, security: null, remoteName: null, streamsStarted: 0, streamsSucceeded: 0, streamsFailed: 0, messagesSent: 0, messagesReceived: 0, keepAlivesSent: 0, lastLocalStreamCreatedTimestamp: null, lastRemoteStreamCreatedTimestamp: null, lastMessageSentTimestamp: null, lastMessageReceivedTimestamp: null, localFlowControlWindow: null, remoteFlowControlWindow: null }; }, this.channelzEnabled); if (this.channelzEnabled) { this.listenerChildrenTracker.refChild(channelzRef); } this.http2ServerList.push({ server: http2Server, channelzRef: channelzRef }); this.trace('Successfully bound ' + (0, subchannel_address_1.subchannelAddressToString)(boundSubchannelAddress)); resolve(bindSpecificPort(addressList.slice(1), boundAddress.port, 1)); http2Server.removeListener('error', onError); }); }); }; const resolverListener = { onSuccessfulResolution: (addressList, serviceConfig, serviceConfigError) => { // We only want one resolution result. Discard all future results resolverListener.onSuccessfulResolution = () => { }; if (addressList.length === 0) { deferredCallback(new Error(`No addresses resolved for port ${port}`), 0); return; } let bindResultPromise; if ((0, subchannel_address_1.isTcpSubchannelAddress)(addressList[0])) { if (addressList[0].port === 0) { bindResultPromise = bindWildcardPort(addressList); } else { bindResultPromise = bindSpecificPort(addressList, addressList[0].port, 0); } } else { // Use an arbitrary non-zero port for non-TCP addresses bindResultPromise = bindSpecificPort(addressList, 1, 0); } bindResultPromise.then((bindResult) => { if (bindResult.count === 0) { const errorString = `No address added out of total ${addressList.length} resolved`; logging.log(constants_1.LogVerbosity.ERROR, errorString); deferredCallback(new Error(errorString), 0); } else { if (bindResult.count < addressList.length) { logging.log(constants_1.LogVerbosity.INFO, `WARNING Only ${bindResult.count} addresses added out of total ${addressList.length} resolved`); } deferredCallback(null, bindResult.port); } }, (error) => { const errorString = `No address added out of total ${addressList.length} resolved`; logging.log(constants_1.LogVerbosity.ERROR, errorString); deferredCallback(new Error(errorString), 0); }); }, onError: (error) => { deferredCallback(new Error(error.details), 0); }, }; const resolver = (0, resolver_1.createResolver)(portUri, resolverListener, this.options); resolver.updateResolution(); } forceShutdown() { // Close the server if it is still running. for (const { server: http2Server, channelzRef: ref } of this.http2ServerList) { if (http2Server.listening) { http2Server.close(() => { if (this.channelzEnabled) { this.listenerChildrenTracker.unrefChild(ref); (0, channelz_1.unregisterChannelzRef)(ref); } }); } } this.started = false; // Always destroy any available sessions. It's possible that one or more // tryShutdown() calls are in progress. Don't wait on them to finish. this.sessions.forEach((channelzInfo, session) => { // Cast NGHTTP2_CANCEL to any because TypeScript doesn't seem to // recognize destroy(code) as a valid signature. // eslint-disable-next-line @typescript-eslint/no-explicit-any session.destroy(http2.constants.NGHTTP2_CANCEL); }); this.sessions.clear(); if (this.channelzEnabled) { (0, channelz_1.unregisterChannelzRef)(this.channelzRef); } } register(name, handler, serialize, deserialize, type) { if (this.handlers.has(name)) { return false; } this.handlers.set(name, { func: handler, serialize, deserialize, type, path: name, }); return true; } unregister(name) { return this.handlers.delete(name); } start() { if (this.http2ServerList.length === 0 || this.http2ServerList.every(({ server: http2Server }) => http2Server.listening !== true)) { throw new Error('server must be bound in order to start'); } if (this.started === true) { throw new Error('server is already started'); } if (this.channelzEnabled) { this.channelzTrace.addTrace('CT_INFO', 'Starting'); } this.started = true; } tryShutdown(callback) { const wrappedCallback = (error) => { if (this.channelzEnabled) { (0, channelz_1.unregisterChannelzRef)(this.channelzRef); } callback(error); }; let pendingChecks = 0; function maybeCallback() { pendingChecks--; if (pendingChecks === 0) { wrappedCallback(); } } // Close the server if necessary. this.started = false; for (const { server: http2Server, channelzRef: ref } of this.http2ServerList) { if (http2Server.listening) { pendingChecks++; http2Server.close(() => { if (this.channelzEnabled) { this.listenerChildrenTracker.unrefChild(ref); (0, channelz_1.unregisterChannelzRef)(ref); } maybeCallback(); }); } } this.sessions.forEach((channelzInfo, session) => { if (!session.closed) { pendingChecks += 1; session.close(maybeCallback); } }); if (pendingChecks === 0) { wrappedCallback(); } } addHttp2Port() { throw new Error('Not yet implemented'); } /** * Get the channelz reference object for this server. The returned value is * garbage if channelz is disabled for this server. * @returns */ getChannelzRef() { return this.channelzRef; } _verifyContentType(stream, headers) { const contentType = headers[http2.constants.HTTP2_HEADER_CONTENT_TYPE]; if (typeof contentType !== 'string' || !contentType.startsWith('application/grpc')) { stream.respond({ [http2.constants.HTTP2_HEADER_STATUS]: http2.constants.HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE, }, { endStream: true }); return false; } return true; } _retrieveHandler(headers) { const path = headers[HTTP2_HEADER_PATH]; this.trace('Received call to method ' + path + ' at address ' + this.serverAddressString); const handler = this.handlers.get(path); if (handler === undefined) { this.trace('No handler registered for method ' + path + '. Sending UNIMPLEMENTED status.'); throw getUnimplementedStatusResponse(path); } return handler; } _respondWithError(err, stream, channelzSessionInfo = null) { const call = new server_call_1.Http2ServerCallStream(stream, null, this.options); if (err.code === undefined) { err.code = constants_1.Status.INTERNAL; } if (this.channelzEnabled) { this.callTracker.addCallFailed(); channelzSessionInfo === null || channelzSessionInfo === void 0 ? void 0 : channelzSessionInfo.streamTracker.addCallFailed(); } call.sendError(err); } _channelzHandler(stream, headers) { var _a; const channelzSessionInfo = this.sessions.get(stream.session); this.callTracker.addCallStarted(); channelzSessionInfo === null || channelzSessionInfo === void 0 ? void 0 : channelzSessionInfo.streamTracker.addCallStarted(); if (!this._verifyContentType(stream, headers)) { this.callTracker.addCallFailed(); channelzSessionInfo === null || channelzSessionInfo === void 0 ? void 0 : channelzSessionInfo.streamTracker.addCallFailed(); return; } let handler; try { handler = this._retrieveHandler(headers); } catch (err) { this._respondWithError({ details: (0, error_1.getErrorMessage)(err), code: (_a = (0, error_1.getErrorCode)(err)) !== null && _a !== void 0 ? _a : undefined }, stream, channelzSessionInfo); return; } const call = new server_call_1.Http2ServerCallStream(stream, handler, this.options); call.once('callEnd', (code) => { if (code === constants_1.Status.OK) { this.callTracker.addCallSucceeded(); } else { this.callTracker.addCallFailed(); } }); if (channelzSessionInfo) { call.once('streamEnd', (success) => { if (success) { channelzSessionInfo.streamTracker.addCallSucceeded(); } else { channelzSessionInfo.streamTracker.addCallFailed(); } }); call.on('sendMessage', () => { channelzSessionInfo.messagesSent += 1; channelzSessionInfo.lastMessageSentTimestamp = new Date(); }); call.on('receiveMessage', () => { channelzSessionInfo.messagesReceived += 1; channelzSessionInfo.lastMessageReceivedTimestamp = new Date(); }); } if (!this._runHandlerForCall(call, handler, headers)) { this.callTracker.addCallFailed(); channelzSessionInfo === null || channelzSessionInfo === void 0 ? void 0 : channelzSessionInfo.streamTracker.addCallFailed(); call.sendError({ code: constants_1.Status.INTERNAL, details: `Unknown handler type: ${handler.type}` }); } } _streamHandler(stream, headers) { var _a; if (this._verifyContentType(stream, headers) !== true) { return; } let handler; try { handler = this._retrieveHandler(headers); } catch (err) { this._respondWithError({ details: (0, error_1.getErrorMessage)(err), code: (_a = (0, error_1.getErrorCode)(err)) !== null && _a !== void 0 ? _a : undefined }, stream, null); return; } const call = new server_call_1.Http2ServerCallStream(stream, handler, this.options); if (!this._runHandlerForCall(call, handler, headers)) { call.sendError({ code: constants_1.Status.INTERNAL, details: `Unknown handler type: ${handler.type}` }); } } _runHandlerForCall(call, handler, headers) { var _a; const metadata = call.receiveMetadata(headers); const encoding = (_a = metadata.get('grpc-encoding')[0]) !== null && _a !== void 0 ? _a : 'identity'; metadata.remove('grpc-encoding'); const { type } = handler; if (type === 'unary') { handleUnary(call, handler, metadata, encoding); } else if (type === 'clientStream') { handleClientStreaming(call, handler, metadata, encoding); } else if (type === 'serverStream') { handleServerStreaming(call, handler, metadata, encoding); } else if (type === 'bidi') { handleBidiStreaming(call, handler, metadata, encoding); } else { return false; } return true; } _setupHandlers(http2Server) { if (http2Server === null) { return; } const serverAddress = http2Server.address(); let serverAddressString = 'null'; if (serverAddress) { if (typeof serverAddress === 'string') { serverAddressString = serverAddress; } else { serverAddressString = serverAddress.address + ':' + serverAddress.port; } } this.serverAddressString = serverAddressString; const handler = this.channelzEnabled ? this._channelzHandler : this._streamHandler; http2Server.on('stream', handler.bind(this)); http2Server.on('session', (session) => { var _a, _b, _c, _d, _e; if (!this.started) { session.destroy(); return; } let channelzRef; channelzRef = (0, channelz_1.registerChannelzSocket)((_a = session.socket.remoteAddress) !== null && _a !== void 0 ? _a : 'unknown', this.getChannelzSessionInfoGetter(session), this.channelzEnabled); const channelzSessionInfo = { ref: channelzRef, streamTracker: new channelz_1.ChannelzCallTracker(), messagesSent: 0, messagesReceived: 0, lastMessageSentTimestamp: null, lastMessageReceivedTimestamp: null }; this.sessions.set(session, channelzSessionInfo); const clientAddress = session.socket.remoteAddress; if (this.channelzEnabled) { this.channelzTrace.addTrace('CT_INFO', 'Connection established by client ' + clientAddress); this.sessionChildrenTracker.refChild(channelzRef); } let connectionAgeTimer = null; let connectionAgeGraceTimer = null; let sessionClosedByServer = false; if (this.maxConnectionAgeMs !== UNLIMITED_CONNECTION_AGE_MS) { // Apply a random jitter within a +/-10% range const jitterMagnitude = this.maxConnectionAgeMs / 10; const jitter = Math.random() * jitterMagnitude * 2 - jitterMagnitude; connectionAgeTimer = (_c = (_b = setTimeout(() => { var _a, _b; sessionClosedByServer = true; if (this.channelzEnabled) { this.channelzTrace.addTrace('CT_INFO', 'Connection dropped by max connection age from ' + clientAddress); } try { session.goaway(http2.constants.NGHTTP2_NO_ERROR, ~(1 << 31), Buffer.from('max_age')); } catch (e) { // The goaway can't be sent because the session is already closed session.destroy(); return; } session.close(); /* Allow a grace period after sending the GOAWAY before forcibly * closing the connection. */ if (this.maxConnectionAgeGraceMs !== UNLIMITED_CONNECTION_AGE_MS) { connectionAgeGraceTimer = (_b = (_a = setTimeout(() => { session.destroy(); }, this.maxConnectionAgeGraceMs)).unref) === null || _b === void 0 ? void 0 : _b.call(_a); } }, this.maxConnectionAgeMs + jitter)).unref) === null || _c === void 0 ? void 0 : _c.call(_b); } const keeapliveTimeTimer = (_e = (_d = setInterval(() => { var _a, _b; const timeoutTImer = (_b = (_a = setTimeout(() => { sessionClosedByServer = true; if (this.channelzEnabled) { this.channelzTrace.addTrace('CT_INFO', 'Connection dropped by keepalive timeout from ' + clientAddress); } session.close(); }, this.keepaliveTimeoutMs)).unref) === null || _b === void 0 ? void 0 : _b.call(_a); try { session.ping((err, duration, payload) => { clearTimeout(timeoutTImer); }); } catch (e) { // The ping can't be sent because the session is already closed session.destroy(); } }, this.keepaliveTimeMs)).unref) === null || _e === void 0 ? void 0 : _e.call(_d); session.on('close', () => { if (this.channelzEnabled) { if (!sessionClosedByServer) { this.channelzTrace.addTrace('CT_INFO', 'Connection dropped by client ' + clientAddress); } this.sessionChildrenTracker.unrefChild(channelzRef); (0, channelz_1.unregisterChannelzRef)(channelzRef); } if (connectionAgeTimer) { clearTimeout(connectionAgeTimer); } if (connectionAgeGraceTimer) { clearTimeout(connectionAgeGraceTimer); } if (keeapliveTimeTimer) { clearTimeout(keeapliveTimeTimer); } this.sessions.delete(session); }); }); } } exports.Server = Server; function handleUnary(call, handler, metadata, encoding) { call.receiveUnaryMessage(encoding, (err, request) => { if (err) { call.sendError(err); return; } if (request === undefined || call.cancelled) { return; } const emitter = new server_call_1.ServerUnaryCallImpl(call, metadata, request); handler.func(emitter, (err, value, trailer, flags) => { call.sendUnaryMessage(err, value, trailer, flags); }); }); } function handleClientStreaming(call, handler, metadata, encoding) { const stream = new server_call_1.ServerReadableStreamImpl(call, metadata, handler.deserialize, encoding); function respond(err, value, trailer, flags) { stream.destroy(); call.sendUnaryMessage(err, value, trailer, flags); } if (call.cancelled) { return; } stream.on('error', respond); handler.func(stream, respond); } function handleServerStreaming(call, handler, metadata, encoding) { call.receiveUnaryMessage(encoding, (err, request) => { if (err) { call.sendError(err); return; } if (request === undefined || call.cancelled) { return; } const stream = new server_call_1.ServerWritableStreamImpl(call, metadata, handler.serialize, request); handler.func(stream); }); } function handleBidiStreaming(call, handler, metadata, encoding) { const stream = new server_call_1.ServerDuplexStreamImpl(call, metadata, handler.serialize, handler.deserialize, encoding); if (call.cancelled) { return; } handler.func(stream); } //# sourceMappingURL=server.js.map
Save
cmd:
run