Azure Core REST Pipeline provides the core HTTP pipeline infrastructure for Azure SDK JavaScript libraries, enabling them to work consistently across both Node.js and browser environments. It implements a flexible middleware-style architecture using pipeline policies that can intercept, modify, and handle HTTP requests and responses in a predictable order.
npm install @azure/core-rest-pipelineimport {
createPipelineFromOptions,
createDefaultHttpClient,
createPipelineRequest,
createHttpHeaders,
type Pipeline,
type PipelineRequest,
type PipelineResponse,
type HttpClient
} from "@azure/core-rest-pipeline";For CommonJS:
const {
createPipelineFromOptions,
createDefaultHttpClient,
createPipelineRequest,
createHttpHeaders
} = require("@azure/core-rest-pipeline");import {
createPipelineFromOptions,
createDefaultHttpClient,
createPipelineRequest,
userAgentPolicy,
logPolicy
} from "@azure/core-rest-pipeline";
// Create a pipeline with standard policies
const pipeline = createPipelineFromOptions({
userAgentOptions: { userAgentPrefix: "MySDK/1.0.0" },
retryOptions: { maxRetries: 3 }
});
// Add custom policies
pipeline.addPolicy(logPolicy({ logger: console }));
// Create HTTP client and make request
const client = createDefaultHttpClient();
const request = createPipelineRequest({
url: "https://api.example.com/data",
method: "GET"
});
// Send request through pipeline
const response = await pipeline.sendRequest(client, request);
console.log(response.status, response.bodyAsText);Azure Core REST Pipeline is built around several key components:
Core pipeline creation, configuration, and policy management for building HTTP request processing pipelines.
function createPipelineFromOptions(options: InternalPipelineOptions): Pipeline;
function createEmptyPipeline(): Pipeline;
interface Pipeline {
addPolicy(policy: PipelinePolicy, options?: AddPolicyOptions): void;
removePolicy(options: { name?: string; phase?: PipelinePhase }): PipelinePolicy[];
sendRequest(httpClient: HttpClient, request: PipelineRequest): Promise<PipelineResponse>;
getOrderedPolicies(): PipelinePolicy[];
clone(): Pipeline;
}HTTP client abstraction and request/response object creation for isomorphic HTTP operations.
function createDefaultHttpClient(): HttpClient;
function createPipelineRequest(options: PipelineRequestOptions): PipelineRequest;
function createHttpHeaders(rawHeaders?: RawHttpHeadersInput): HttpHeaders;
interface HttpClient {
sendRequest: SendRequest;
}
interface PipelineRequest {
url: string;
method: HttpMethods;
headers: HttpHeaders;
timeout: number;
body?: RequestBodyType;
// ... additional properties
}Bearer token authentication and auxiliary authentication header policies for Azure services.
function bearerTokenAuthenticationPolicy(
options: BearerTokenAuthenticationPolicyOptions
): PipelinePolicy;
function auxiliaryAuthenticationHeaderPolicy(
options: AuxiliaryAuthenticationHeaderPolicyOptions
): PipelinePolicy;
interface BearerTokenAuthenticationPolicyOptions {
credential: TokenCredential;
scopes: string[];
challengeCallbacks?: ChallengeCallbacks;
}Comprehensive retry mechanisms including exponential backoff, system error retry, and throttling retry policies.
function exponentialRetryPolicy(options?: ExponentialRetryPolicyOptions): PipelinePolicy;
function defaultRetryPolicy(options?: DefaultRetryPolicyOptions): PipelinePolicy;
function systemErrorRetryPolicy(options?: SystemErrorRetryPolicyOptions): PipelinePolicy;
function throttlingRetryPolicy(options?: ThrottlingRetryPolicyOptions): PipelinePolicy;
interface PipelineRetryOptions {
maxRetries?: number;
retryDelayInMs?: number;
maxRetryDelayInMs?: number;
}Policies for processing different request body types including multipart, form data, and newline-delimited JSON.
function multipartPolicy(): PipelinePolicy;
function formDataPolicy(): PipelinePolicy;
function ndJsonPolicy(): PipelinePolicy;
function decompressResponsePolicy(): PipelinePolicy;
interface MultipartRequestBody {
parts: BodyPart[];
boundary?: string;
}Network-level policies for proxy configuration, TLS settings, and HTTP agent management (Node.js specific).
function proxyPolicy(proxySettings?: ProxySettings): PipelinePolicy;
function agentPolicy(agent: Agent): PipelinePolicy;
function tlsPolicy(tlsSettings: TlsSettings): PipelinePolicy;
function redirectPolicy(options?: RedirectPolicyOptions): PipelinePolicy;
interface ProxySettings {
host: string;
port: number;
username?: string;
password?: string;
}Logging, tracing, and user agent policies for monitoring and debugging HTTP requests.
function logPolicy(options?: LogPolicyOptions): PipelinePolicy;
function tracingPolicy(options?: TracingPolicyOptions): PipelinePolicy;
function userAgentPolicy(options?: UserAgentPolicyOptions): PipelinePolicy;
function setClientRequestIdPolicy(): PipelinePolicy;
interface LogPolicyOptions {
logger?: AzureLogger;
allowedHeaders?: string[];
allowedQueryParameters?: string[];
}Comprehensive error handling with REST-specific error types and context information.
class RestError extends Error {
code?: string;
statusCode?: number;
request?: PipelineRequest;
response?: PipelineResponse;
static readonly REQUEST_SEND_ERROR: string;
static readonly PARSE_ERROR: string;
}
function isRestError(error: unknown): error is RestError;Helper functions for file creation and other common operations.
function createFile(
stream: ReadableStream<Uint8Array> | NodeJS.ReadableStream,
name: string,
options?: CreateFileOptions
): File;
function createFileFromStream(
stream: ReadableStream<Uint8Array> | NodeJS.ReadableStream,
name: string,
options?: CreateFileFromStreamOptions
): Promise<File>;type HttpMethods = "GET" | "PUT" | "POST" | "DELETE" | "PATCH" | "HEAD" | "OPTIONS" | "TRACE";
type SendRequest = (request: PipelineRequest) => Promise<PipelineResponse>;
type PipelinePhase = "Deserialize" | "Serialize" | "Retry" | "Sign";
interface PipelinePolicy {
name: string;
sendRequest(request: PipelineRequest, next: SendRequest): Promise<PipelineResponse>;
}
interface AddPolicyOptions {
beforePolicies?: string[];
afterPolicies?: string[];
afterPhase?: PipelinePhase;
phase?: PipelinePhase;
}
type RequestBodyType =
| NodeJS.ReadableStream
| (() => NodeJS.ReadableStream)
| ReadableStream<Uint8Array>
| (() => ReadableStream<Uint8Array>)
| Blob
| ArrayBuffer
| ArrayBufferView
| FormData
| string
| null;
interface HttpHeaders extends Iterable<[string, string]> {
get(name: string): string | undefined;
has(name: string): boolean;
set(name: string, value: string | number | boolean): void;
delete(name: string): void;
toJSON(options?: { preserveCase?: boolean }): RawHttpHeaders;
}
type RawHttpHeaders = { [headerName: string]: string };
type RawHttpHeadersInput = Record<string, string | number | boolean>;
interface TransferProgressEvent {
loadedBytes: number;
}