Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: avoid unhandled exception when reusing a closed client #1640

Merged
merged 3 commits into from
Aug 30, 2024

Conversation

orgads
Copy link
Contributor

@orgads orgads commented Aug 25, 2024

Example:

  • Execute streamingRecognize
  • When done, close the client
  • Execute streamingRecognize again, with data already in the stream
  • Unhandled exception occurs.
TypeError [ERR_INVALID_ARG_TYPE]: The "chunk" argument must be of type string or an instance of Buffer or Uint8Array. Received an instance of Object
    at _write (node:internal/streams/writable:474:13)
    at Writable.write (node:internal/streams/writable:502:10)
    at Duplexify._write (/project/node_modules/duplexify/index.js:212:22)
    at doWrite (/project/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:390:139)
    at writeOrBuffer (/project/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:381:5)
    at Writable.write (/project/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:302:11)
    at Pumpify.<anonymous> (/project/node_modules/@google-cloud/speech/build/src/helpers.js:79:27)
    at Object.onceWrapper (node:events:633:26)
    at Pumpify.emit (node:events:518:28)
    at obj.<computed> [as _write] (/project/node_modules/stubs/index.js:28:22)
    at doWrite (/project/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:390:139)
    at writeOrBuffer (/project/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:381:5)
    at Writable.write (/project/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:302:11)
    at PassThrough.ondata (node:internal/streams/readable:1007:22)
    at PassThrough.emit (node:events:518:28)
    at addChunk (node:internal/streams/readable:559:12) {
  code: 'ERR_INVALID_ARG_TYPE'

Reproduction: https://gist.github.com/orgads/13cbf44c91923da27d8772b5f10489c9

This happens because streamingRecognize writes streamingConfig on first chunk. Usually the stream is open in object mode, so it works, but when the client is terminated, PassThrough is used without object mode.

Change PassThrough to object mode, so it terminates gracefully.

This was reported in [1] and fixed in [2], but was then reverted in [3] which re-generated the code. Fix properly in the generator now.

[1] googleapis/google-cloud-node#5464
[2] googleapis/google-cloud-node#5465
[3] googleapis/google-cloud-node#5565

Example:

* Execute streamingRecognize
* When done, close the client
* Execute streamingRecognize again, with data already in the stream
* Unhandled exception occurs.

TypeError [ERR_INVALID_ARG_TYPE]: The "chunk" argument must be of type string or an instance of Buffer or Uint8Array. Received an instance of Object
    at _write (node:internal/streams/writable:474:13)
    at Writable.write (node:internal/streams/writable:502:10)
    at Duplexify._write (/project/node_modules/duplexify/index.js:212:22)
    at doWrite (/project/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:390:139)
    at writeOrBuffer (/project/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:381:5)
    at Writable.write (/project/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:302:11)
    at Pumpify.<anonymous> (/project/node_modules/@google-cloud/speech/build/src/helpers.js:79:27)
    at Object.onceWrapper (node:events:633:26)
    at Pumpify.emit (node:events:518:28)
    at obj.<computed> [as _write] (/project/node_modules/stubs/index.js:28:22)
    at doWrite (/project/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:390:139)
    at writeOrBuffer (/project/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:381:5)
    at Writable.write (/project/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:302:11)
    at PassThrough.ondata (node:internal/streams/readable:1007:22)
    at PassThrough.emit (node:events:518:28)
    at addChunk (node:internal/streams/readable:559:12) {
  code: 'ERR_INVALID_ARG_TYPE'

Reproduction: https://gist.github.com/orgads/13cbf44c91923da27d8772b5f10489c9

This happens because streamingRecognize writes streamingConfig on first
chunk. Usually the stream is open in object mode, so it works, but when
the client is terminated, PassThrough is used without object mode.

Change PassThrough to object mode, so it terminates gracefully.

This was reported in [1] and fixed in [2], but was then reverted in [3]
which re-generated the code. Fix properly in the generator now.

[1] googleapis/google-cloud-node#5464
[2] googleapis/google-cloud-node#5465
[3] googleapis/google-cloud-node#5565
@orgads
Copy link
Contributor Author

orgads commented Aug 25, 2024

@sofisl You approved the original fix. Please review this.

@sofisl sofisl merged commit e9da76a into googleapis:main Aug 30, 2024
24 checks passed
@orgads orgads deleted the reuse-exception branch August 30, 2024 02:06
@orgads
Copy link
Contributor Author

orgads commented Aug 30, 2024

Thanks @sofisl.

What's the next step to regenerate cloud-speech and refix googleapis/google-cloud-node#5464?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants