Skip to content

perf: avoid array allocation in _onMethod#82

Merged
cody-greene merged 1 commit into
cody-greene:masterfrom
Samuron:on_method_perf
Aug 19, 2025
Merged

perf: avoid array allocation in _onMethod#82
cody-greene merged 1 commit into
cody-greene:masterfrom
Samuron:on_method_perf

Conversation

@Samuron
Copy link
Copy Markdown
Contributor

@Samuron Samuron commented Aug 14, 2025

One more small optimization. This method may also benefit in using switch statement, I can give it a try if you want

@Samuron
Copy link
Copy Markdown
Contributor Author

Samuron commented Aug 14, 2025

It will look like this:

/** @internal */
  _onMethod(methodFrame: MethodFrame): void {
    if (this._state.incoming != null) {
      throw new AMQPConnectionError('UNEXPECTED_FRAME',
        'unexpected method frame, already awaiting header/body; this is a bug')
    }
    switch(methodFrame.methodId) {
      case Cmd.BasicDeliver:
      case Cmd.BasicReturn:
      case Cmd.BasicGetOK:
        this._state.incoming = {methodFrame, headerFrame: undefined, chunks: undefined, received: 0}
        break;
      case Cmd.BasicGetEmpty:
        this._handleRPC(Cmd.BasicGetOK, undefined)
        break;
      case Cmd.BasicAck:
        if (this._state.mode === CH_MODE.CONFIRM) {
          const params = methodFrame.params as Required<MethodParams[Cmd.BasicAck]>
          if (params.multiple) {
            for (const [tag, dfd] of this._state.unconfirmed.entries()) {
              if (tag > params.deliveryTag)
                break
              dfd.resolve()
              this._state.unconfirmed.delete(tag)
            }
          } else {
            const dfd = this._state.unconfirmed.get(params.deliveryTag)
            if (dfd) {
              dfd.resolve()
              this._state.unconfirmed.delete(params.deliveryTag)
            } else {
              //TODO channel error; PRECONDITION_FAILED, unexpected ack
            }
          }
        }
        break;
      case Cmd.BasicNack:
        if (this._state.mode === CH_MODE.CONFIRM) {
          const params = methodFrame.params as Required<MethodParams[Cmd.BasicNack]>
          if (params.multiple) {
            for (const [tag, dfd] of this._state.unconfirmed.entries()) {
              if (tag > params.deliveryTag)
                break
              dfd.reject(new AMQPError('NACK', 'message rejected by server'))
              this._state.unconfirmed.delete(tag)
            }
          } else {
            const dfd = this._state.unconfirmed.get(params.deliveryTag)
            if (dfd) {
              dfd.reject(new AMQPError('NACK', 'message rejected by server'))
              this._state.unconfirmed.delete(params.deliveryTag)
            } else {
              //TODO channel error; PRECONDITION_FAILED, unexpected nack
            }
          }
        }
        break;
      case Cmd.BasicCancel:
        const params = methodFrame.params as Required<MethodParams[Cmd.BasicCancel]>
        this._state.consumers.delete(params.consumerTag)
        setImmediate(() => {
          this.emit('basic.cancel', params.consumerTag, new AMQPError('CANCEL_FORCED', 'cancelled by server'))
        })
        break;
      default:
        this._handleRPC(methodFrame.methodId, methodFrame.params)
    }
  }

@cody-greene cody-greene merged commit 622a6c9 into cody-greene:master Aug 19, 2025
3 checks passed
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