Comparing version 2.1.8 to 2.1.9
@@ -25,4 +25,3 @@ "use strict"; | ||
const { metadata = (0, nice_grpc_common_1.Metadata)(), onHeader, onTrailer } = options; | ||
const signal = (options.signal ?? | ||
new AbortController().signal); | ||
const signal = options.signal ?? new AbortController().signal; | ||
const pipeAbortController = new AbortController(); | ||
@@ -29,0 +28,0 @@ const call = client.makeBidiStreamRequest(grpcMethodDefinition.path, grpcMethodDefinition.requestSerialize, grpcMethodDefinition.responseDeserialize, (0, convertMetadata_1.convertMetadataToGrpcJs)(metadata)); |
@@ -25,4 +25,3 @@ "use strict"; | ||
const { metadata = (0, nice_grpc_common_1.Metadata)(), onHeader, onTrailer } = options; | ||
const signal = (options.signal ?? | ||
new AbortController().signal); | ||
const signal = options.signal ?? new AbortController().signal; | ||
const call = client.makeServerStreamRequest(grpcMethodDefinition.path, grpcMethodDefinition.requestSerialize, grpcMethodDefinition.responseDeserialize, request, (0, convertMetadata_1.convertMetadataToGrpcJs)(metadata)); | ||
@@ -29,0 +28,0 @@ call.on('metadata', metadata => { |
@@ -1,1 +0,5 @@ | ||
export {}; | ||
/// <reference types="node" /> | ||
export type CallContextMaybeCancel = { | ||
signal: AbortSignal; | ||
cancel?: () => void; | ||
}; |
@@ -8,15 +8,29 @@ "use strict"; | ||
function createCallContext(call) { | ||
const ac = new AbortController(); | ||
const maybeCancel = { | ||
signal: ac.signal, | ||
cancel() { | ||
ac.abort(); | ||
}, | ||
}; | ||
const header = (0, nice_grpc_common_1.Metadata)(); | ||
const trailer = (0, nice_grpc_common_1.Metadata)(); | ||
const abortController = new AbortController(); | ||
if (call.cancelled) { | ||
abortController.abort(); | ||
maybeCancel.cancel?.(); | ||
maybeCancel.cancel = undefined; | ||
} | ||
else { | ||
call.on('close', () => { | ||
maybeCancel.cancel = undefined; | ||
}); | ||
call.on('finish', () => { | ||
maybeCancel.cancel = undefined; | ||
}); | ||
call.on('cancelled', () => { | ||
abortController.abort(); | ||
maybeCancel.cancel?.(); | ||
maybeCancel.cancel = undefined; | ||
}); | ||
} | ||
let headerSent = false; | ||
return { | ||
const context = { | ||
metadata: (0, convertMetadata_1.convertMetadataFromGrpcJs)(call.metadata), | ||
@@ -33,6 +47,7 @@ peer: call.getPeer(), | ||
trailer, | ||
signal: abortController.signal, | ||
signal: maybeCancel.signal, | ||
}; | ||
return { context, maybeCancel }; | ||
} | ||
exports.createCallContext = createCallContext; | ||
//# sourceMappingURL=createCallContext.js.map |
@@ -24,3 +24,3 @@ "use strict"; | ||
else { | ||
process.emitWarning(`${path}: Uncaught error in server implementation method: ${error instanceof Error ? error.stack : error}`); | ||
process.emitWarning(`${path}: Uncaught error in server implementation method. Server methods should only throw ServerError or AbortError. ${error instanceof Error ? error.stack : error}`); | ||
return { | ||
@@ -27,0 +27,0 @@ code: grpc_js_1.status.UNKNOWN, |
@@ -34,3 +34,3 @@ "use strict"; | ||
return call => { | ||
const context = (0, createCallContext_1.createCallContext)(call); | ||
const { context, maybeCancel } = (0, createCallContext_1.createCallContext)(call); | ||
Promise.resolve() | ||
@@ -68,2 +68,3 @@ .then(async () => { | ||
finally { | ||
maybeCancel.cancel = undefined; | ||
context.sendHeader(); | ||
@@ -75,3 +76,3 @@ } | ||
}, err => { | ||
call.destroy((0, createErrorStatusObject_1.createErrorStatusObject)(definition.path, err, (0, convertMetadata_1.convertMetadataToGrpcJs)(context.trailer))); | ||
call.emit('error', (0, createErrorStatusObject_1.createErrorStatusObject)(definition.path, err, (0, convertMetadata_1.convertMetadataToGrpcJs)(context.trailer))); | ||
}); | ||
@@ -78,0 +79,0 @@ }; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.createClientStreamingMethodHandler = void 0; | ||
const convertMetadata_1 = require("../utils/convertMetadata"); | ||
const isAsyncIterable_1 = require("../utils/isAsyncIterable"); | ||
const readableToAsyncIterable_1 = require("../utils/readableToAsyncIterable"); | ||
const createCallContext_1 = require("./createCallContext"); | ||
const createErrorStatusObject_1 = require("./createErrorStatusObject"); | ||
const readableToAsyncIterable_1 = require("../utils/readableToAsyncIterable"); | ||
const convertMetadata_1 = require("../utils/convertMetadata"); | ||
/** @internal */ | ||
@@ -33,3 +33,3 @@ function createClientStreamingMethodHandler(definition, implementation, middleware) { | ||
return (call, callback) => { | ||
const context = (0, createCallContext_1.createCallContext)(call); | ||
const { context, maybeCancel } = (0, createCallContext_1.createCallContext)(call); | ||
Promise.resolve() | ||
@@ -54,2 +54,3 @@ .then(async () => { | ||
finally { | ||
maybeCancel.cancel = undefined; | ||
context.sendHeader(); | ||
@@ -56,0 +57,0 @@ } |
@@ -33,3 +33,3 @@ "use strict"; | ||
return call => { | ||
const context = (0, createCallContext_1.createCallContext)(call); | ||
const { context, maybeCancel } = (0, createCallContext_1.createCallContext)(call); | ||
Promise.resolve() | ||
@@ -67,2 +67,3 @@ .then(async () => { | ||
finally { | ||
maybeCancel.cancel = undefined; | ||
context.sendHeader(); | ||
@@ -74,3 +75,3 @@ } | ||
}, err => { | ||
call.destroy((0, createErrorStatusObject_1.createErrorStatusObject)(definition.path, err, (0, convertMetadata_1.convertMetadataToGrpcJs)(context.trailer))); | ||
call.emit('error', (0, createErrorStatusObject_1.createErrorStatusObject)(definition.path, err, (0, convertMetadata_1.convertMetadataToGrpcJs)(context.trailer))); | ||
}); | ||
@@ -77,0 +78,0 @@ }; |
@@ -32,3 +32,3 @@ "use strict"; | ||
return (call, callback) => { | ||
const context = (0, createCallContext_1.createCallContext)(call); | ||
const { context, maybeCancel } = (0, createCallContext_1.createCallContext)(call); | ||
Promise.resolve() | ||
@@ -53,2 +53,3 @@ .then(async () => { | ||
finally { | ||
maybeCancel.cancel = undefined; | ||
context.sendHeader(); | ||
@@ -55,0 +56,0 @@ } |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.readableToAsyncIterable = void 0; | ||
let nodejsInternalsCompatibilityCheckedOnce = false; | ||
/** | ||
* Exactly once check that an object has Node.js readable stream internal object looks roughly like we expect. | ||
*/ | ||
function nodejsInternalsAccessible(obj) { | ||
if (nodejsInternalsCompatibilityCheckedOnce) { | ||
return true; | ||
} | ||
const safe = obj && | ||
typeof obj === 'object' && | ||
'errored' in obj && | ||
'errorEmitted' in obj && | ||
'endEmitted' in obj && | ||
'closeEmitted' in obj && | ||
typeof obj.errorEmitted === 'boolean' && | ||
typeof obj.endEmitted === 'boolean' && | ||
typeof obj.closeEmitted === 'boolean'; | ||
nodejsInternalsCompatibilityCheckedOnce = safe; | ||
return safe; | ||
} | ||
/** | ||
* This is a copy of NodeJS createAsyncIterator(stream), with removed stream | ||
@@ -24,2 +44,5 @@ * destruction. | ||
const state = stream._readableState; | ||
if (!nodejsInternalsAccessible(state)) { | ||
throw new Error('nice-grpc: _readableState members incompatible'); | ||
} | ||
let error = state.errored; | ||
@@ -26,0 +49,0 @@ let errorEmitted = state.errorEmitted; |
{ | ||
"name": "nice-grpc", | ||
"version": "2.1.8", | ||
"version": "2.1.9", | ||
"description": "A Node.js gRPC library that is nice to you", | ||
@@ -38,3 +38,3 @@ "keywords": [ | ||
"@types/google-protobuf": "^3.7.4", | ||
"@types/node": "^14.18.23", | ||
"@types/node": "^18.0.0", | ||
"defer-promise": "^2.0.1", | ||
@@ -47,7 +47,7 @@ "google-protobuf": "^3.14.0", | ||
"dependencies": { | ||
"@grpc/grpc-js": "~1.9.14", | ||
"@grpc/grpc-js": "^1.10.8", | ||
"abort-controller-x": "^0.4.0", | ||
"nice-grpc-common": "^2.0.2" | ||
}, | ||
"gitHead": "2d8eccc332adbf869b6450efe5de14125d7cb4e6" | ||
"gitHead": "706e43411400630c951a391695ca639f2af4d943" | ||
} |
@@ -13,3 +13,2 @@ import {Client, ClientWritableStream} from '@grpc/grpc-js'; | ||
} from '../service-definitions'; | ||
import {CompatAbortSignal} from '../utils/compatAbortSignal'; | ||
import { | ||
@@ -52,4 +51,3 @@ convertMetadataFromGrpcJs, | ||
const signal = (options.signal ?? | ||
new AbortController().signal) as CompatAbortSignal; | ||
const signal = options.signal ?? new AbortController().signal; | ||
@@ -56,0 +54,0 @@ const pipeAbortController = new AbortController(); |
@@ -13,3 +13,2 @@ import {Client} from '@grpc/grpc-js'; | ||
} from '../service-definitions'; | ||
import {CompatAbortSignal} from '../utils/compatAbortSignal'; | ||
import { | ||
@@ -52,4 +51,3 @@ convertMetadataFromGrpcJs, | ||
const signal = (options.signal ?? | ||
new AbortController().signal) as CompatAbortSignal; | ||
const signal = options.signal ?? new AbortController().signal; | ||
@@ -56,0 +54,0 @@ const call = client.makeServerStreamRequest( |
@@ -8,14 +8,38 @@ import {ServerSurfaceCall} from '@grpc/grpc-js/build/src/server-call'; | ||
// https://github.com/deeplay-io/nice-grpc/issues/607 | ||
// https://github.com/deeplay-io/nice-grpc/issues/555 | ||
export type CallContextMaybeCancel = { | ||
signal: AbortSignal; | ||
cancel?: () => void; | ||
}; | ||
/** @internal */ | ||
export function createCallContext(call: ServerSurfaceCall): CallContext { | ||
export function createCallContext(call: ServerSurfaceCall): { | ||
context: CallContext; | ||
maybeCancel: CallContextMaybeCancel; | ||
} { | ||
const ac = new AbortController(); | ||
const maybeCancel: CallContextMaybeCancel = { | ||
signal: ac.signal, | ||
cancel() { | ||
ac.abort(); | ||
}, | ||
}; | ||
const header = Metadata(); | ||
const trailer = Metadata(); | ||
const abortController = new AbortController(); | ||
if (call.cancelled) { | ||
abortController.abort(); | ||
maybeCancel.cancel?.(); | ||
maybeCancel.cancel = undefined; | ||
} else { | ||
call.on('close', () => { | ||
maybeCancel.cancel = undefined; | ||
}); | ||
call.on('finish', () => { | ||
maybeCancel.cancel = undefined; | ||
}); | ||
call.on('cancelled', () => { | ||
abortController.abort(); | ||
maybeCancel.cancel?.(); | ||
maybeCancel.cancel = undefined; | ||
}); | ||
@@ -26,3 +50,3 @@ } | ||
return { | ||
const context = { | ||
metadata: convertMetadataFromGrpcJs(call.metadata), | ||
@@ -40,4 +64,6 @@ peer: call.getPeer(), | ||
trailer, | ||
signal: abortController.signal, | ||
signal: maybeCancel.signal, | ||
}; | ||
return {context, maybeCancel}; | ||
} |
@@ -25,3 +25,3 @@ import {Metadata, status, StatusObject} from '@grpc/grpc-js'; | ||
process.emitWarning( | ||
`${path}: Uncaught error in server implementation method: ${ | ||
`${path}: Uncaught error in server implementation method. Server methods should only throw ServerError or AbortError. ${ | ||
error instanceof Error ? error.stack : error | ||
@@ -28,0 +28,0 @@ }`, |
@@ -12,5 +12,5 @@ import {handleBidiStreamingCall} from '@grpc/grpc-js'; | ||
import {readableToAsyncIterable} from '../utils/readableToAsyncIterable'; | ||
import {BidiStreamingMethodImplementation} from './ServiceImplementation'; | ||
import {createCallContext} from './createCallContext'; | ||
import {createErrorStatusObject} from './createErrorStatusObject'; | ||
import {BidiStreamingMethodImplementation} from './ServiceImplementation'; | ||
@@ -59,3 +59,3 @@ /** @internal */ | ||
return call => { | ||
const context = createCallContext(call); | ||
const {context, maybeCancel} = createCallContext(call); | ||
@@ -106,2 +106,3 @@ Promise.resolve() | ||
} finally { | ||
maybeCancel.cancel = undefined; | ||
context.sendHeader(); | ||
@@ -115,3 +116,4 @@ } | ||
err => { | ||
call.destroy( | ||
call.emit( | ||
'error', | ||
createErrorStatusObject( | ||
@@ -121,3 +123,3 @@ definition.path, | ||
convertMetadataToGrpcJs(context.trailer), | ||
) as any, | ||
), | ||
); | ||
@@ -124,0 +126,0 @@ }, |
@@ -7,9 +7,9 @@ import {handleClientStreamingCall} from '@grpc/grpc-js'; | ||
} from 'nice-grpc-common'; | ||
import {MethodDefinition} from '../service-definitions'; | ||
import {convertMetadataToGrpcJs} from '../utils/convertMetadata'; | ||
import {isAsyncIterable} from '../utils/isAsyncIterable'; | ||
import {readableToAsyncIterable} from '../utils/readableToAsyncIterable'; | ||
import {ClientStreamingMethodImplementation} from './ServiceImplementation'; | ||
import {createCallContext} from './createCallContext'; | ||
import {ClientStreamingMethodImplementation} from './ServiceImplementation'; | ||
import {createErrorStatusObject} from './createErrorStatusObject'; | ||
import {readableToAsyncIterable} from '../utils/readableToAsyncIterable'; | ||
import {MethodDefinition} from '../service-definitions'; | ||
import {convertMetadataToGrpcJs} from '../utils/convertMetadata'; | ||
@@ -58,3 +58,3 @@ /** @internal */ | ||
return (call, callback) => { | ||
const context = createCallContext(call); | ||
const {context, maybeCancel} = createCallContext(call); | ||
@@ -93,2 +93,3 @@ Promise.resolve() | ||
} finally { | ||
maybeCancel.cancel = undefined; | ||
context.sendHeader(); | ||
@@ -95,0 +96,0 @@ } |
@@ -11,5 +11,5 @@ import {handleServerStreamingCall} from '@grpc/grpc-js'; | ||
import {isAsyncIterable} from '../utils/isAsyncIterable'; | ||
import {ServerStreamingMethodImplementation} from './ServiceImplementation'; | ||
import {createCallContext} from './createCallContext'; | ||
import {createErrorStatusObject} from './createErrorStatusObject'; | ||
import {ServerStreamingMethodImplementation} from './ServiceImplementation'; | ||
@@ -58,3 +58,3 @@ /** @internal */ | ||
return call => { | ||
const context = createCallContext(call); | ||
const {context, maybeCancel} = createCallContext(call); | ||
@@ -105,2 +105,3 @@ Promise.resolve() | ||
} finally { | ||
maybeCancel.cancel = undefined; | ||
context.sendHeader(); | ||
@@ -114,3 +115,4 @@ } | ||
err => { | ||
call.destroy( | ||
call.emit( | ||
'error', | ||
createErrorStatusObject( | ||
@@ -120,3 +122,3 @@ definition.path, | ||
convertMetadataToGrpcJs(context.trailer), | ||
) as any, | ||
), | ||
); | ||
@@ -123,0 +125,0 @@ }, |
@@ -10,5 +10,5 @@ import {handleUnaryCall} from '@grpc/grpc-js'; | ||
import {isAsyncIterable} from '../utils/isAsyncIterable'; | ||
import {UnaryMethodImplementation} from './ServiceImplementation'; | ||
import {createCallContext} from './createCallContext'; | ||
import {createErrorStatusObject} from './createErrorStatusObject'; | ||
import {UnaryMethodImplementation} from './ServiceImplementation'; | ||
@@ -54,3 +54,3 @@ /** @internal */ | ||
return (call, callback) => { | ||
const context = createCallContext(call); | ||
const {context, maybeCancel} = createCallContext(call); | ||
@@ -89,2 +89,3 @@ Promise.resolve() | ||
} finally { | ||
maybeCancel.cancel = undefined; | ||
context.sendHeader(); | ||
@@ -91,0 +92,0 @@ } |
import {ObjectReadable} from '@grpc/grpc-js/build/src/object-stream'; | ||
type NodeInternalReadableState = { | ||
errored: unknown; | ||
errorEmitted: boolean; | ||
endEmitted: boolean; | ||
closeEmitted: boolean; | ||
}; | ||
let nodejsInternalsCompatibilityCheckedOnce = false; | ||
/** | ||
* Exactly once check that an object has Node.js readable stream internal object looks roughly like we expect. | ||
*/ | ||
function nodejsInternalsAccessible(obj: any): obj is NodeInternalReadableState { | ||
if (nodejsInternalsCompatibilityCheckedOnce) { | ||
return true; | ||
} | ||
const safe = | ||
obj && | ||
typeof obj === 'object' && | ||
'errored' in obj && | ||
'errorEmitted' in obj && | ||
'endEmitted' in obj && | ||
'closeEmitted' in obj && | ||
typeof obj.errorEmitted === 'boolean' && | ||
typeof obj.endEmitted === 'boolean' && | ||
typeof obj.closeEmitted === 'boolean'; | ||
nodejsInternalsCompatibilityCheckedOnce = safe; | ||
return safe; | ||
} | ||
/** | ||
* This is a copy of NodeJS createAsyncIterator(stream), with removed stream | ||
@@ -26,2 +58,5 @@ * destruction. | ||
const state = (stream as any)._readableState; | ||
if (!nodejsInternalsAccessible(state)) { | ||
throw new Error('nice-grpc: _readableState members incompatible'); | ||
} | ||
@@ -28,0 +63,0 @@ let error = state.errored; |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
204381
3636
99
+ Added@grpc/grpc-js@1.12.6(transitive)
+ Added@js-sdsl/ordered-map@4.4.2(transitive)
- Removed@grpc/grpc-js@1.9.15(transitive)
Updated@grpc/grpc-js@^1.10.8