Skip to content

RangeError [ERR_BUFFER_OUT_OF_BOUNDS]: Attempt to access memory outside buffer bounds #215

@MartianH

Description

@MartianH

Environment

OS: macOS 15.0 24A335 arm64
Node: v20.12.2

Dependencies:

"@nestjs/common": "^10.4.4",
"@nestjs/config": "3.2.3",
"@nestjs/core": "^10.4.4",
"dd-trace": "^5.22.0",
"nestjs-ddtrace": "^5.0.0",
"rabbitmq-stream-js-client": "^0.4.2",

Description

While using this library as a single page script works fine, it seems like wrapping it into a NestJS module results in unforseen errors.

here is the code at hand

import {
  DynamicModule,
  FactoryProvider,
  Logger,
  Module,
  Provider,
} from '@nestjs/common';
import { ConfigurationOptions } from '../lib';
import { hostname } from 'os';
import { Client, connect } from 'rabbitmq-stream-js-client';

import { RabbitStreamService } from './rabbitStream.service';

@Module({})
export class RabbitStreamModule {
  private static appLogger = new Logger(RabbitStreamModule.name);

  static async tryConfigure({
    connection,
  }: ConfigurationOptions): Promise<Client> {
    try {
      let client: Client;
      const connectionClosedCallback = () => {
        this.appLogger.log(`In connection closed event...`);
        client
          .restart()
          .then(() => {
            this.appLogger.log(`Connections restarted!`);
          })
          .catch((reason) => {
            this.appLogger.warn(`Could not reconnect to Rabbit! ${reason}`);
          });
      };
      client = await connect({
        hostname: connection.server ? connection.server[0] : 'localhost',
        port: 5552,
        username: connection.user as string,
        password: connection.pass as string,
        vhost: connection.vhost || '/',
        heartbeat: connection.heartbeat,
        listeners: { connection_closed: connectionClosedCallback },
        connectionName: `${hostname()}:${connection.serviceName}:pid-${
          process.pid
        }`,
      });
      return client;
    } catch (error) {
      this.appLogger.error(`Error: ${error}`);
      throw error;
    }
  }

  static forRootAsync(
    options: Omit<FactoryProvider, 'provide'>,
  ): DynamicModule {
    const asyncProviders = this.createAsyncOptionsProvider(options);
    const rabbitProvider = {
      provide: 'RABBIT_MQ_STREAM',
      useFactory: (rabbitConfig: ConfigurationOptions): Promise<Client> =>
        this.tryConfigure(rabbitConfig),
      inject: ['RABBIT_CONFIG'],
    };
    return {
      module: RabbitStreamModule,
      providers: [asyncProviders, rabbitProvider, RabbitStreamService],
      exports: [RabbitStreamService],
    };
  }


  private static createAsyncOptionsProvider(
    options: Omit<FactoryProvider<ConfigurationOptions>, 'provide'>,
  ): Provider {
    return {
      provide: 'RABBIT_CONFIG',
      useFactory: options.useFactory,
      inject: options.inject || [],
    };
  }
}

Resulting logs (sensitive data omitted):

[Nest] 41154  - 11/10/2024, 11:25:45     LOG [NestFactory] Starting Nest application...
[Nest] 41154  - 11/10/2024, 11:25:45     LOG [InstanceLoader] ConfigHostModule dependencies initialized +0ms
[Nest] 41154  - 11/10/2024, 11:25:45     LOG [InstanceLoader] CacheModule dependencies initialized +1ms
[Nest] 41154  - 11/10/2024, 11:25:45     LOG [InstanceLoader] ConfigModule dependencies initialized +0ms
[Nest] 41154  - 11/10/2024, 11:25:45     LOG [InstanceLoader] DatadogTraceModule dependencies initialized +0ms
[Nest] 41154  - 11/10/2024, 11:25:45     LOG [InstanceLoader] CouchbaseModule dependencies initialized +2ms
node:internal/buffer:86
    throw new ERR_BUFFER_OUT_OF_BOUNDS();
    ^

RangeError [ERR_BUFFER_OUT_OF_BOUNDS]: Attempt to access memory outside buffer bounds
    at boundsError (node:internal/buffer:86:11)
    at Buffer.readInt32BE (node:internal/buffer:484:5)
    at BufferDataReader.readInt32 ({{ommitted_path}}/backend/src/node_modules/rabbitmq-stream-js-client/src/response_decoder.ts:537:27)
    at OpenResponse ({{ommitted_path}}/backend/src/node_modules/rabbitmq-stream-js-client/src/responses/open_response.ts:14:43)
    at ResponseDecoder.emitResponseReceived ({{ommitted_path}}/backend/src/node_modules/rabbitmq-stream-js-client/src/response_decoder.ts:736:19)
    at ResponseDecoder.add ({{ommitted_path}}/backend/src/node_modules/rabbitmq-stream-js-client/src/response_decoder.ts:691:14)
    at Connection.received ({{ommitted_path}}/backend/src/node_modules/rabbitmq-stream-js-client/src/connection.ts:374:18)
    at Socket.<anonymous> ({{ommitted_path}}/backend/src/node_modules/rabbitmq-stream-js-client/src/connection.ts:164:14)
    at Socket.emit (node:events:518:28)
    at Socket.emit ({{ommitted_path}}/backend/src/node_modules/dd-trace/packages/datadog-instrumentations/src/net.js:69:25)
    at Socket.emit ({{ommitted_path}}/backend/src/node_modules/dd-trace/packages/datadog-shimmer/src/shimmer.js:31:21)
    at addChunk (node:internal/streams/readable:559:12)
    at readableAddChunkPushByteMode (node:internal/streams/readable:510:3)
    at Readable.push (node:internal/streams/readable:390:5)
    at TCP.onStreamRead (node:internal/stream_base_commons:190:23)
    at TCP.callbackTrampoline (node:internal/async_hooks:130:17) {
  code: 'ERR_BUFFER_OUT_OF_BOUNDS'
}
Node.js v20.12.2

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions