|
"use strict"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true }); |
|
exports.ServerDuplexStreamImpl = exports.ServerWritableStreamImpl = exports.ServerReadableStreamImpl = exports.ServerUnaryCallImpl = void 0; |
|
exports.serverErrorToStatus = serverErrorToStatus; |
|
const events_1 = require("events"); |
|
const stream_1 = require("stream"); |
|
const constants_1 = require("./constants"); |
|
const metadata_1 = require("./metadata"); |
|
function serverErrorToStatus(error, overrideTrailers) { |
|
var _a; |
|
const status = { |
|
code: constants_1.Status.UNKNOWN, |
|
details: 'message' in error ? error.message : 'Unknown Error', |
|
metadata: (_a = overrideTrailers !== null && overrideTrailers !== void 0 ? overrideTrailers : error.metadata) !== null && _a !== void 0 ? _a : null, |
|
}; |
|
if ('code' in error && |
|
typeof error.code === 'number' && |
|
Number.isInteger(error.code)) { |
|
status.code = error.code; |
|
if ('details' in error && typeof error.details === 'string') { |
|
status.details = error.details; |
|
} |
|
} |
|
return status; |
|
} |
|
class ServerUnaryCallImpl extends events_1.EventEmitter { |
|
constructor(path, call, metadata, request) { |
|
super(); |
|
this.path = path; |
|
this.call = call; |
|
this.metadata = metadata; |
|
this.request = request; |
|
this.cancelled = false; |
|
} |
|
getPeer() { |
|
return this.call.getPeer(); |
|
} |
|
sendMetadata(responseMetadata) { |
|
this.call.sendMetadata(responseMetadata); |
|
} |
|
getDeadline() { |
|
return this.call.getDeadline(); |
|
} |
|
getPath() { |
|
return this.path; |
|
} |
|
getHost() { |
|
return this.call.getHost(); |
|
} |
|
} |
|
exports.ServerUnaryCallImpl = ServerUnaryCallImpl; |
|
class ServerReadableStreamImpl extends stream_1.Readable { |
|
constructor(path, call, metadata) { |
|
super({ objectMode: true }); |
|
this.path = path; |
|
this.call = call; |
|
this.metadata = metadata; |
|
this.cancelled = false; |
|
} |
|
_read(size) { |
|
this.call.startRead(); |
|
} |
|
getPeer() { |
|
return this.call.getPeer(); |
|
} |
|
sendMetadata(responseMetadata) { |
|
this.call.sendMetadata(responseMetadata); |
|
} |
|
getDeadline() { |
|
return this.call.getDeadline(); |
|
} |
|
getPath() { |
|
return this.path; |
|
} |
|
getHost() { |
|
return this.call.getHost(); |
|
} |
|
} |
|
exports.ServerReadableStreamImpl = ServerReadableStreamImpl; |
|
class ServerWritableStreamImpl extends stream_1.Writable { |
|
constructor(path, call, metadata, request) { |
|
super({ objectMode: true }); |
|
this.path = path; |
|
this.call = call; |
|
this.metadata = metadata; |
|
this.request = request; |
|
this.pendingStatus = { |
|
code: constants_1.Status.OK, |
|
details: 'OK', |
|
}; |
|
this.cancelled = false; |
|
this.trailingMetadata = new metadata_1.Metadata(); |
|
this.on('error', err => { |
|
this.pendingStatus = serverErrorToStatus(err); |
|
this.end(); |
|
}); |
|
} |
|
getPeer() { |
|
return this.call.getPeer(); |
|
} |
|
sendMetadata(responseMetadata) { |
|
this.call.sendMetadata(responseMetadata); |
|
} |
|
getDeadline() { |
|
return this.call.getDeadline(); |
|
} |
|
getPath() { |
|
return this.path; |
|
} |
|
getHost() { |
|
return this.call.getHost(); |
|
} |
|
_write(chunk, encoding, |
|
|
|
callback) { |
|
this.call.sendMessage(chunk, callback); |
|
} |
|
_final(callback) { |
|
var _a; |
|
callback(null); |
|
this.call.sendStatus(Object.assign(Object.assign({}, this.pendingStatus), { metadata: (_a = this.pendingStatus.metadata) !== null && _a !== void 0 ? _a : this.trailingMetadata })); |
|
} |
|
|
|
end(metadata) { |
|
if (metadata) { |
|
this.trailingMetadata = metadata; |
|
} |
|
return super.end(); |
|
} |
|
} |
|
exports.ServerWritableStreamImpl = ServerWritableStreamImpl; |
|
class ServerDuplexStreamImpl extends stream_1.Duplex { |
|
constructor(path, call, metadata) { |
|
super({ objectMode: true }); |
|
this.path = path; |
|
this.call = call; |
|
this.metadata = metadata; |
|
this.pendingStatus = { |
|
code: constants_1.Status.OK, |
|
details: 'OK', |
|
}; |
|
this.cancelled = false; |
|
this.trailingMetadata = new metadata_1.Metadata(); |
|
this.on('error', err => { |
|
this.pendingStatus = serverErrorToStatus(err); |
|
this.end(); |
|
}); |
|
} |
|
getPeer() { |
|
return this.call.getPeer(); |
|
} |
|
sendMetadata(responseMetadata) { |
|
this.call.sendMetadata(responseMetadata); |
|
} |
|
getDeadline() { |
|
return this.call.getDeadline(); |
|
} |
|
getPath() { |
|
return this.path; |
|
} |
|
getHost() { |
|
return this.call.getHost(); |
|
} |
|
_read(size) { |
|
this.call.startRead(); |
|
} |
|
_write(chunk, encoding, |
|
|
|
callback) { |
|
this.call.sendMessage(chunk, callback); |
|
} |
|
_final(callback) { |
|
var _a; |
|
callback(null); |
|
this.call.sendStatus(Object.assign(Object.assign({}, this.pendingStatus), { metadata: (_a = this.pendingStatus.metadata) !== null && _a !== void 0 ? _a : this.trailingMetadata })); |
|
} |
|
|
|
end(metadata) { |
|
if (metadata) { |
|
this.trailingMetadata = metadata; |
|
} |
|
return super.end(); |
|
} |
|
} |
|
exports.ServerDuplexStreamImpl = ServerDuplexStreamImpl; |
|
|