// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the MIT License. /** * Body parsing utility functions for Service Bus messages. * * With @azure/functions-extensions-servicebus v0.4.0, `message.body` is returned * as a raw Buffer instead of being auto-parsed. These helpers provide a simple, * one-line experience for the most common use cases (JSON text messages). * * @example * ```typescript * import { messageBodyAsJson, messageBodyAsText } from '@azure/functions-extensions-servicebus'; * * // Parse JSON body with type safety * interface OrderMessage { orderId: string; amount: number; } * const data = messageBodyAsJson(message); * * // Get raw text * const text = messageBodyAsText(message); * * // With custom reviver (e.g., Date conversion) * const data = messageBodyAsJson(message, (key, value) => { * if (key === 'createdAt' && typeof value === 'string') return new Date(value); * return value; * }); * ``` */ const utf8Decoder = new TextDecoder('utf-8', { fatal: true }); /** * Returns the message body as a UTF-8 string. * Handles Buffer, string, and object body types. * * @param message - A message object with a `body` property (e.g., ServiceBusReceivedMessage) * @returns The body as a UTF-8 string * @throws TypeError if the body is a Buffer containing invalid UTF-8 bytes */ export function messageBodyAsText(message: { body: unknown }): string { const body: unknown = message.body; if (Buffer.isBuffer(body)) { return utf8Decoder.decode(body); } if (typeof body === 'string') { return body; } return JSON.stringify(body); } /** * Parses the message body as JSON and returns a typed result. * * @param message - A message object with a `body` property (e.g., ServiceBusReceivedMessage) * @param reviver - Optional JSON reviver function for custom deserialization * @returns The parsed body as type T * @throws TypeError if the body is a Buffer containing invalid UTF-8 bytes * @throws SyntaxError if the body is not valid JSON */ export function messageBodyAsJson( message: { body: unknown }, reviver?: (key: string, value: unknown) => unknown ): T { return JSON.parse(messageBodyAsText(message), reviver) as T; }