mirror of
https://github.com/Azure/cosmos-explorer.git
synced 2026-06-13 07:57:26 +01:00
add copy of cosmos node.js SDK as local dependency
This commit is contained in:
committed by
Chris Anderson
parent
ff1e733679
commit
ca396cdfbe
@@ -0,0 +1,38 @@
|
||||
/// <reference lib="esnext.asynciterable" />
|
||||
import { ChangeFeedResponse } from "./ChangeFeedResponse";
|
||||
import { Resource } from "./client";
|
||||
/**
|
||||
* Provides iterator for change feed.
|
||||
*
|
||||
* Use `Items.changeFeed()` to get an instance of the iterator.
|
||||
*/
|
||||
export declare class ChangeFeedIterator<T> {
|
||||
private clientContext;
|
||||
private resourceId;
|
||||
private resourceLink;
|
||||
private partitionKey;
|
||||
private changeFeedOptions;
|
||||
private static readonly IfNoneMatchAllHeaderValue;
|
||||
private nextIfNoneMatch;
|
||||
private ifModifiedSince;
|
||||
private lastStatusCode;
|
||||
private isPartitionSpecified;
|
||||
/**
|
||||
* Gets a value indicating whether there are potentially additional results that can be retrieved.
|
||||
*
|
||||
* Initially returns true. This value is set based on whether the last execution returned a continuation token.
|
||||
*
|
||||
* @returns Boolean value representing if whether there are potentially additional results that can be retrieved.
|
||||
*/
|
||||
get hasMoreResults(): boolean;
|
||||
/**
|
||||
* Gets an async iterator which will yield pages of results from Azure Cosmos DB.
|
||||
*/
|
||||
getAsyncIterator(): AsyncIterable<ChangeFeedResponse<Array<T & Resource>>>;
|
||||
/**
|
||||
* Read feed and retrieves the next page of results in Azure Cosmos DB.
|
||||
*/
|
||||
fetchNext(): Promise<ChangeFeedResponse<Array<T & Resource>>>;
|
||||
private getFeedResponse;
|
||||
}
|
||||
//# sourceMappingURL=ChangeFeedIterator.d.ts.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ChangeFeedIterator.d.ts","sourceRoot":"","sources":["../../src/ChangeFeedIterator.ts"],"names":[],"mappings":";AAIA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AASpC;;;;GAIG;AACH,qBAAa,kBAAkB,CAAC,CAAC;IAW7B,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,iBAAiB;IAd3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAAO;IACxD,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,oBAAoB,CAAU;IAmCtC;;;;;;OAMG;IACH,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED;;OAEG;IACW,gBAAgB,IAAI,aAAa,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IASxF;;OAEG;IACU,SAAS,IAAI,OAAO,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;YAS5D,eAAe;CAgD9B"}
|
||||
@@ -0,0 +1,107 @@
|
||||
import { __asyncGenerator, __await } from "tslib";
|
||||
import { ChangeFeedResponse } from "./ChangeFeedResponse";
|
||||
import { Constants, ResourceType, StatusCodes } from "./common";
|
||||
import { getEmptyCosmosDiagnostics, withDiagnostics } from "./utils/diagnostics";
|
||||
/**
|
||||
* Provides iterator for change feed.
|
||||
*
|
||||
* Use `Items.changeFeed()` to get an instance of the iterator.
|
||||
*/
|
||||
export class ChangeFeedIterator {
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
constructor(clientContext, resourceId, resourceLink, partitionKey, changeFeedOptions) {
|
||||
this.clientContext = clientContext;
|
||||
this.resourceId = resourceId;
|
||||
this.resourceLink = resourceLink;
|
||||
this.partitionKey = partitionKey;
|
||||
this.changeFeedOptions = changeFeedOptions;
|
||||
// partition key XOR partition key range id
|
||||
const partitionKeyValid = partitionKey !== undefined;
|
||||
this.isPartitionSpecified = partitionKeyValid;
|
||||
let canUseStartFromBeginning = true;
|
||||
if (changeFeedOptions.continuation) {
|
||||
this.nextIfNoneMatch = changeFeedOptions.continuation;
|
||||
canUseStartFromBeginning = false;
|
||||
}
|
||||
if (changeFeedOptions.startTime) {
|
||||
// .toUTCString() is platform specific, but most platforms use RFC 1123.
|
||||
// In ECMAScript 2018, this was standardized to RFC 1123.
|
||||
// See for more info: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toUTCString
|
||||
this.ifModifiedSince = changeFeedOptions.startTime.toUTCString();
|
||||
canUseStartFromBeginning = false;
|
||||
}
|
||||
if (canUseStartFromBeginning && !changeFeedOptions.startFromBeginning) {
|
||||
this.nextIfNoneMatch = ChangeFeedIterator.IfNoneMatchAllHeaderValue;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Gets a value indicating whether there are potentially additional results that can be retrieved.
|
||||
*
|
||||
* Initially returns true. This value is set based on whether the last execution returned a continuation token.
|
||||
*
|
||||
* @returns Boolean value representing if whether there are potentially additional results that can be retrieved.
|
||||
*/
|
||||
get hasMoreResults() {
|
||||
return this.lastStatusCode !== StatusCodes.NotModified;
|
||||
}
|
||||
/**
|
||||
* Gets an async iterator which will yield pages of results from Azure Cosmos DB.
|
||||
*/
|
||||
getAsyncIterator() {
|
||||
return __asyncGenerator(this, arguments, function* getAsyncIterator_1() {
|
||||
do {
|
||||
const result = yield __await(this.fetchNext());
|
||||
if (result.count > 0) {
|
||||
yield yield __await(result);
|
||||
}
|
||||
} while (this.hasMoreResults);
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Read feed and retrieves the next page of results in Azure Cosmos DB.
|
||||
*/
|
||||
async fetchNext() {
|
||||
return withDiagnostics(async (diagnosticNode) => {
|
||||
const response = await this.getFeedResponse(diagnosticNode);
|
||||
this.lastStatusCode = response.statusCode;
|
||||
this.nextIfNoneMatch = response.headers[Constants.HttpHeaders.ETag];
|
||||
return response;
|
||||
}, this.clientContext);
|
||||
}
|
||||
async getFeedResponse(diagnosticNode) {
|
||||
if (!this.isPartitionSpecified) {
|
||||
throw new Error("Container is partitioned, but no partition key or partition key range id was specified.");
|
||||
}
|
||||
const feedOptions = { initialHeaders: {}, useIncrementalFeed: true };
|
||||
if (typeof this.changeFeedOptions.maxItemCount === "number") {
|
||||
feedOptions.maxItemCount = this.changeFeedOptions.maxItemCount;
|
||||
}
|
||||
if (this.changeFeedOptions.sessionToken) {
|
||||
feedOptions.sessionToken = this.changeFeedOptions.sessionToken;
|
||||
}
|
||||
if (this.nextIfNoneMatch) {
|
||||
feedOptions.accessCondition = {
|
||||
type: Constants.HttpHeaders.IfNoneMatch,
|
||||
condition: this.nextIfNoneMatch,
|
||||
};
|
||||
}
|
||||
if (this.ifModifiedSince) {
|
||||
feedOptions.initialHeaders[Constants.HttpHeaders.IfModifiedSince] = this.ifModifiedSince;
|
||||
}
|
||||
const response = await this.clientContext.queryFeed({
|
||||
path: this.resourceLink,
|
||||
resourceType: ResourceType.item,
|
||||
resourceId: this.resourceId,
|
||||
resultFn: (result) => (result ? result.Documents : []),
|
||||
query: undefined,
|
||||
options: feedOptions,
|
||||
partitionKey: this.partitionKey,
|
||||
diagnosticNode: diagnosticNode,
|
||||
}); // TODO: some funky issues with query feed. Probably need to change it up.
|
||||
return new ChangeFeedResponse(response.result, response.result ? response.result.length : 0, response.code, response.headers, getEmptyCosmosDiagnostics());
|
||||
}
|
||||
}
|
||||
ChangeFeedIterator.IfNoneMatchAllHeaderValue = "*";
|
||||
//# sourceMappingURL=ChangeFeedIterator.js.map
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,35 @@
|
||||
/**
|
||||
* Specifies options for the change feed
|
||||
*
|
||||
* Some of these options control where and when to start reading from the change feed. The order of precedence is:
|
||||
* - continuation
|
||||
* - startTime
|
||||
* - startFromBeginning
|
||||
*
|
||||
* If none of those options are set, it will start reading changes from the first `ChangeFeedIterator.fetchNext()` call.
|
||||
*/
|
||||
export interface ChangeFeedOptions {
|
||||
/**
|
||||
* Max amount of items to return per page
|
||||
*/
|
||||
maxItemCount?: number;
|
||||
/**
|
||||
* The continuation token to start from.
|
||||
*
|
||||
* This is equivalent to the etag and continuation value from the `ChangeFeedResponse`
|
||||
*/
|
||||
continuation?: string;
|
||||
/**
|
||||
* The session token to use. If not specified, will use the most recent captured session token to start with.
|
||||
*/
|
||||
sessionToken?: string;
|
||||
/**
|
||||
* Signals whether to start from the beginning or not.
|
||||
*/
|
||||
startFromBeginning?: boolean;
|
||||
/**
|
||||
* Specified the start time to start reading changes from.
|
||||
*/
|
||||
startTime?: Date;
|
||||
}
|
||||
//# sourceMappingURL=ChangeFeedOptions.d.ts.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ChangeFeedOptions.d.ts","sourceRoot":"","sources":["../../src/ChangeFeedOptions.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;OAEG;IACH,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB"}
|
||||
@@ -0,0 +1,2 @@
|
||||
export {};
|
||||
//# sourceMappingURL=ChangeFeedOptions.js.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ChangeFeedOptions.js","sourceRoot":"","sources":["../../src/ChangeFeedOptions.ts"],"names":[],"mappings":"","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * Specifies options for the change feed\n *\n * Some of these options control where and when to start reading from the change feed. The order of precedence is:\n * - continuation\n * - startTime\n * - startFromBeginning\n *\n * If none of those options are set, it will start reading changes from the first `ChangeFeedIterator.fetchNext()` call.\n */\nexport interface ChangeFeedOptions {\n /**\n * Max amount of items to return per page\n */\n maxItemCount?: number;\n /**\n * The continuation token to start from.\n *\n * This is equivalent to the etag and continuation value from the `ChangeFeedResponse`\n */\n continuation?: string;\n /**\n * The session token to use. If not specified, will use the most recent captured session token to start with.\n */\n sessionToken?: string;\n /**\n * Signals whether to start from the beginning or not.\n */\n startFromBeginning?: boolean;\n /**\n * Specified the start time to start reading changes from.\n */\n startTime?: Date;\n}\n"]}
|
||||
@@ -0,0 +1,53 @@
|
||||
import { CosmosDiagnostics } from "./CosmosDiagnostics";
|
||||
import { CosmosHeaders } from "./queryExecutionContext";
|
||||
/**
|
||||
* A single response page from the Azure Cosmos DB Change Feed
|
||||
*/
|
||||
export declare class ChangeFeedResponse<T> {
|
||||
/**
|
||||
* Gets the items returned in the response from Azure Cosmos DB
|
||||
*/
|
||||
readonly result: T;
|
||||
/**
|
||||
* Gets the number of items returned in the response from Azure Cosmos DB
|
||||
*/
|
||||
readonly count: number;
|
||||
/**
|
||||
* Gets the status code of the response from Azure Cosmos DB
|
||||
*/
|
||||
readonly statusCode: number;
|
||||
readonly diagnostics: CosmosDiagnostics;
|
||||
/**
|
||||
* Gets the request charge for this request from the Azure Cosmos DB service.
|
||||
*/
|
||||
get requestCharge(): number;
|
||||
/**
|
||||
* Gets the activity ID for the request from the Azure Cosmos DB service.
|
||||
*/
|
||||
get activityId(): string;
|
||||
/**
|
||||
* Gets the continuation token to be used for continuing enumeration of the Azure Cosmos DB service.
|
||||
*
|
||||
* This is equivalent to the `etag` property.
|
||||
*/
|
||||
get continuation(): string;
|
||||
/**
|
||||
* Gets the session token for use in session consistency reads from the Azure Cosmos DB service.
|
||||
*/
|
||||
get sessionToken(): string;
|
||||
/**
|
||||
* Gets the entity tag associated with last transaction in the Azure Cosmos DB service,
|
||||
* which can be used as If-Non-Match Access condition for ReadFeed REST request or
|
||||
* `continuation` property of `ChangeFeedOptions` parameter for
|
||||
* `Items.changeFeed()`
|
||||
* to get feed changes since the transaction specified by this entity tag.
|
||||
*
|
||||
* This is equivalent to the `continuation` property.
|
||||
*/
|
||||
get etag(): string;
|
||||
/**
|
||||
* Response headers of the response from Azure Cosmos DB
|
||||
*/
|
||||
headers: CosmosHeaders;
|
||||
}
|
||||
//# sourceMappingURL=ChangeFeedResponse.d.ts.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ChangeFeedResponse.d.ts","sourceRoot":"","sources":["../../src/ChangeFeedResponse.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD;;GAEG;AACH,qBAAa,kBAAkB,CAAC,CAAC;IAK7B;;OAEG;aACa,MAAM,EAAE,CAAC;IACzB;;OAEG;aACa,KAAK,EAAE,MAAM;IAC7B;;OAEG;aACa,UAAU,EAAE,MAAM;aAElB,WAAW,EAAE,iBAAiB;IAKhD;;OAEG;IACH,IAAW,aAAa,IAAI,MAAM,CAGjC;IAED;;OAEG;IACH,IAAW,UAAU,IAAI,MAAM,CAE9B;IAED;;;;OAIG;IACH,IAAW,YAAY,IAAI,MAAM,CAEhC;IAED;;OAEG;IACH,IAAW,YAAY,IAAI,MAAM,CAEhC;IAED;;;;;;;;OAQG;IACH,IAAW,IAAI,IAAI,MAAM,CAExB;IAED;;OAEG;IACI,OAAO,EAAE,aAAa,CAAC;CAC/B"}
|
||||
@@ -0,0 +1,68 @@
|
||||
import { Constants } from "./common";
|
||||
/**
|
||||
* A single response page from the Azure Cosmos DB Change Feed
|
||||
*/
|
||||
export class ChangeFeedResponse {
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
constructor(
|
||||
/**
|
||||
* Gets the items returned in the response from Azure Cosmos DB
|
||||
*/
|
||||
result,
|
||||
/**
|
||||
* Gets the number of items returned in the response from Azure Cosmos DB
|
||||
*/
|
||||
count,
|
||||
/**
|
||||
* Gets the status code of the response from Azure Cosmos DB
|
||||
*/
|
||||
statusCode, headers, diagnostics) {
|
||||
this.result = result;
|
||||
this.count = count;
|
||||
this.statusCode = statusCode;
|
||||
this.diagnostics = diagnostics;
|
||||
this.headers = Object.freeze(headers);
|
||||
}
|
||||
/**
|
||||
* Gets the request charge for this request from the Azure Cosmos DB service.
|
||||
*/
|
||||
get requestCharge() {
|
||||
const rus = this.headers[Constants.HttpHeaders.RequestCharge];
|
||||
return rus ? parseInt(rus, 10) : null;
|
||||
}
|
||||
/**
|
||||
* Gets the activity ID for the request from the Azure Cosmos DB service.
|
||||
*/
|
||||
get activityId() {
|
||||
return this.headers[Constants.HttpHeaders.ActivityId];
|
||||
}
|
||||
/**
|
||||
* Gets the continuation token to be used for continuing enumeration of the Azure Cosmos DB service.
|
||||
*
|
||||
* This is equivalent to the `etag` property.
|
||||
*/
|
||||
get continuation() {
|
||||
return this.etag;
|
||||
}
|
||||
/**
|
||||
* Gets the session token for use in session consistency reads from the Azure Cosmos DB service.
|
||||
*/
|
||||
get sessionToken() {
|
||||
return this.headers[Constants.HttpHeaders.SessionToken];
|
||||
}
|
||||
/**
|
||||
* Gets the entity tag associated with last transaction in the Azure Cosmos DB service,
|
||||
* which can be used as If-Non-Match Access condition for ReadFeed REST request or
|
||||
* `continuation` property of `ChangeFeedOptions` parameter for
|
||||
* `Items.changeFeed()`
|
||||
* to get feed changes since the transaction specified by this entity tag.
|
||||
*
|
||||
* This is equivalent to the `continuation` property.
|
||||
*/
|
||||
get etag() {
|
||||
return this.headers[Constants.HttpHeaders.ETag];
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=ChangeFeedResponse.js.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ChangeFeedResponse.js","sourceRoot":"","sources":["../../src/ChangeFeedResponse.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGrC;;GAEG;AACH,MAAM,OAAO,kBAAkB;IAC7B;;OAEG;IACH;IACE;;OAEG;IACa,MAAS;IACzB;;OAEG;IACa,KAAa;IAC7B;;OAEG;IACa,UAAkB,EAClC,OAAsB,EACN,WAA8B;QAV9B,WAAM,GAAN,MAAM,CAAG;QAIT,UAAK,GAAL,KAAK,CAAQ;QAIb,eAAU,GAAV,UAAU,CAAQ;QAElB,gBAAW,GAAX,WAAW,CAAmB;QAE9C,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,IAAW,aAAa;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;QAC9D,OAAO,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC;IAED;;;;OAIG;IACH,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IAC1D,CAAC;IAED;;;;;;;;OAQG;IACH,IAAW,IAAI;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC;CAMF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nimport { CosmosDiagnostics } from \"./CosmosDiagnostics\";\nimport { Constants } from \"./common\";\nimport { CosmosHeaders } from \"./queryExecutionContext\";\n\n/**\n * A single response page from the Azure Cosmos DB Change Feed\n */\nexport class ChangeFeedResponse<T> {\n /**\n * @internal\n */\n constructor(\n /**\n * Gets the items returned in the response from Azure Cosmos DB\n */\n public readonly result: T,\n /**\n * Gets the number of items returned in the response from Azure Cosmos DB\n */\n public readonly count: number,\n /**\n * Gets the status code of the response from Azure Cosmos DB\n */\n public readonly statusCode: number,\n headers: CosmosHeaders,\n public readonly diagnostics: CosmosDiagnostics,\n ) {\n this.headers = Object.freeze(headers);\n }\n\n /**\n * Gets the request charge for this request from the Azure Cosmos DB service.\n */\n public get requestCharge(): number {\n const rus = this.headers[Constants.HttpHeaders.RequestCharge];\n return rus ? parseInt(rus, 10) : null;\n }\n\n /**\n * Gets the activity ID for the request from the Azure Cosmos DB service.\n */\n public get activityId(): string {\n return this.headers[Constants.HttpHeaders.ActivityId];\n }\n\n /**\n * Gets the continuation token to be used for continuing enumeration of the Azure Cosmos DB service.\n *\n * This is equivalent to the `etag` property.\n */\n public get continuation(): string {\n return this.etag;\n }\n\n /**\n * Gets the session token for use in session consistency reads from the Azure Cosmos DB service.\n */\n public get sessionToken(): string {\n return this.headers[Constants.HttpHeaders.SessionToken];\n }\n\n /**\n * Gets the entity tag associated with last transaction in the Azure Cosmos DB service,\n * which can be used as If-Non-Match Access condition for ReadFeed REST request or\n * `continuation` property of `ChangeFeedOptions` parameter for\n * `Items.changeFeed()`\n * to get feed changes since the transaction specified by this entity tag.\n *\n * This is equivalent to the `continuation` property.\n */\n public get etag(): string {\n return this.headers[Constants.HttpHeaders.ETag];\n }\n\n /**\n * Response headers of the response from Azure Cosmos DB\n */\n public headers: CosmosHeaders;\n}\n"]}
|
||||
@@ -0,0 +1,155 @@
|
||||
import { PartitionKeyRange } from "./client/Container/PartitionKeyRange";
|
||||
import { Resource } from "./client/Resource";
|
||||
import { HTTPMethod, ResourceType } from "./common/constants";
|
||||
import { CosmosClientOptions } from "./CosmosClientOptions";
|
||||
import { DatabaseAccount, PartitionKey } from "./documents";
|
||||
import { GlobalEndpointManager } from "./globalEndpointManager";
|
||||
import { SqlQuerySpec } from "./queryExecutionContext";
|
||||
import { QueryIterator } from "./queryIterator";
|
||||
import { FeedOptions, RequestOptions, Response } from "./request";
|
||||
import { PartitionedQueryExecutionInfo } from "./request/ErrorResponse";
|
||||
import { BulkOptions } from "./utils/batch";
|
||||
import { ClientConfigDiagnostic, CosmosDiagnostics } from "./CosmosDiagnostics";
|
||||
import { DiagnosticNodeInternal } from "./diagnostics/DiagnosticNodeInternal";
|
||||
import { CosmosDbDiagnosticLevel } from "./diagnostics/CosmosDbDiagnosticLevel";
|
||||
/**
|
||||
* @hidden
|
||||
* @hidden
|
||||
*/
|
||||
export declare class ClientContext {
|
||||
private cosmosClientOptions;
|
||||
private globalEndpointManager;
|
||||
private clientConfig;
|
||||
diagnosticLevel: CosmosDbDiagnosticLevel;
|
||||
private readonly sessionContainer;
|
||||
private connectionPolicy;
|
||||
private pipeline;
|
||||
private diagnosticWriter;
|
||||
private diagnosticFormatter;
|
||||
partitionKeyDefinitionCache: {
|
||||
[containerUrl: string]: any;
|
||||
};
|
||||
constructor(cosmosClientOptions: CosmosClientOptions, globalEndpointManager: GlobalEndpointManager, clientConfig: ClientConfigDiagnostic, diagnosticLevel: CosmosDbDiagnosticLevel);
|
||||
/** @hidden */
|
||||
read<T>({ path, resourceType, resourceId, options, partitionKey, diagnosticNode, }: {
|
||||
path: string;
|
||||
resourceType: ResourceType;
|
||||
resourceId: string;
|
||||
options?: RequestOptions;
|
||||
partitionKey?: PartitionKey;
|
||||
diagnosticNode: DiagnosticNodeInternal;
|
||||
}): Promise<Response<T & Resource>>;
|
||||
queryFeed<T>({ path, resourceType, resourceId, resultFn, query, options, diagnosticNode, partitionKeyRangeId, partitionKey, startEpk, endEpk, }: {
|
||||
path: string;
|
||||
resourceType: ResourceType;
|
||||
resourceId: string;
|
||||
resultFn: (result: {
|
||||
[key: string]: any;
|
||||
}) => any[];
|
||||
query: SqlQuerySpec | string;
|
||||
options: FeedOptions;
|
||||
diagnosticNode: DiagnosticNodeInternal;
|
||||
partitionKeyRangeId?: string;
|
||||
partitionKey?: PartitionKey;
|
||||
startEpk?: string | undefined;
|
||||
endEpk?: string | undefined;
|
||||
}): Promise<Response<T & Resource>>;
|
||||
getQueryPlan(path: string, resourceType: ResourceType, resourceId: string, query: SqlQuerySpec | string, options: FeedOptions, diagnosticNode: DiagnosticNodeInternal): Promise<Response<PartitionedQueryExecutionInfo>>;
|
||||
queryPartitionKeyRanges(collectionLink: string, query?: string | SqlQuerySpec, options?: FeedOptions): QueryIterator<PartitionKeyRange>;
|
||||
delete<T>({ path, resourceType, resourceId, options, partitionKey, method, diagnosticNode, }: {
|
||||
path: string;
|
||||
resourceType: ResourceType;
|
||||
resourceId: string;
|
||||
options?: RequestOptions;
|
||||
partitionKey?: PartitionKey;
|
||||
method?: HTTPMethod;
|
||||
diagnosticNode: DiagnosticNodeInternal;
|
||||
}): Promise<Response<T & Resource>>;
|
||||
patch<T>({ body, path, resourceType, resourceId, options, partitionKey, diagnosticNode, }: {
|
||||
body: any;
|
||||
path: string;
|
||||
resourceType: ResourceType;
|
||||
resourceId: string;
|
||||
options?: RequestOptions;
|
||||
partitionKey?: PartitionKey;
|
||||
diagnosticNode: DiagnosticNodeInternal;
|
||||
}): Promise<Response<T & Resource>>;
|
||||
create<T, U = T>({ body, path, resourceType, resourceId, diagnosticNode, options, partitionKey, }: {
|
||||
body: T;
|
||||
path: string;
|
||||
resourceType: ResourceType;
|
||||
resourceId: string;
|
||||
diagnosticNode: DiagnosticNodeInternal;
|
||||
options?: RequestOptions;
|
||||
partitionKey?: PartitionKey;
|
||||
}): Promise<Response<T & U & Resource>>;
|
||||
private processQueryFeedResponse;
|
||||
private applySessionToken;
|
||||
replace<T>({ body, path, resourceType, resourceId, options, partitionKey, diagnosticNode, }: {
|
||||
body: any;
|
||||
path: string;
|
||||
resourceType: ResourceType;
|
||||
resourceId: string;
|
||||
options?: RequestOptions;
|
||||
partitionKey?: PartitionKey;
|
||||
diagnosticNode: DiagnosticNodeInternal;
|
||||
}): Promise<Response<T & Resource>>;
|
||||
upsert<T, U = T>({ body, path, resourceType, resourceId, options, partitionKey, diagnosticNode, }: {
|
||||
body: T;
|
||||
path: string;
|
||||
resourceType: ResourceType;
|
||||
resourceId: string;
|
||||
options?: RequestOptions;
|
||||
partitionKey?: PartitionKey;
|
||||
diagnosticNode: DiagnosticNodeInternal;
|
||||
}): Promise<Response<T & U & Resource>>;
|
||||
execute<T>({ sprocLink, params, options, partitionKey, diagnosticNode, }: {
|
||||
sprocLink: string;
|
||||
params?: any[];
|
||||
options?: RequestOptions;
|
||||
partitionKey?: PartitionKey;
|
||||
diagnosticNode: DiagnosticNodeInternal;
|
||||
}): Promise<Response<T>>;
|
||||
/**
|
||||
* Gets the Database account information.
|
||||
* @param options - `urlConnection` in the options is the endpoint url whose database account needs to be retrieved.
|
||||
* If not present, current client's url will be used.
|
||||
*/
|
||||
getDatabaseAccount(diagnosticNode: DiagnosticNodeInternal, options?: RequestOptions): Promise<Response<DatabaseAccount>>;
|
||||
getWriteEndpoint(diagnosticNode: DiagnosticNodeInternal): Promise<string>;
|
||||
getReadEndpoint(diagnosticNode: DiagnosticNodeInternal): Promise<string>;
|
||||
getWriteEndpoints(): Promise<readonly string[]>;
|
||||
getReadEndpoints(): Promise<readonly string[]>;
|
||||
batch<T>({ body, path, partitionKey, resourceId, options, diagnosticNode, }: {
|
||||
body: T;
|
||||
path: string;
|
||||
partitionKey: PartitionKey;
|
||||
resourceId: string;
|
||||
options?: RequestOptions;
|
||||
diagnosticNode: DiagnosticNodeInternal;
|
||||
}): Promise<Response<any>>;
|
||||
bulk<T>({ body, path, partitionKeyRangeId, resourceId, bulkOptions, options, diagnosticNode, }: {
|
||||
body: T;
|
||||
path: string;
|
||||
partitionKeyRangeId: string;
|
||||
resourceId: string;
|
||||
bulkOptions?: BulkOptions;
|
||||
options?: RequestOptions;
|
||||
diagnosticNode: DiagnosticNodeInternal;
|
||||
}): Promise<Response<any>>;
|
||||
private captureSessionToken;
|
||||
clearSessionToken(path: string): void;
|
||||
recordDiagnostics(diagnostic: CosmosDiagnostics): void;
|
||||
initializeDiagnosticSettings(diagnosticLevel: CosmosDbDiagnosticLevel): void;
|
||||
private getSessionParams;
|
||||
private isMasterResource;
|
||||
private buildHeaders;
|
||||
/**
|
||||
* Returns collection of properties which are derived from the context for Request Creation.
|
||||
* These properties have client wide scope, as opposed to request specific scope.
|
||||
* @returns
|
||||
*/
|
||||
private getContextDerivedPropsForRequestCreation;
|
||||
getClientConfig(): ClientConfigDiagnostic;
|
||||
}
|
||||
//# sourceMappingURL=ClientContext.d.ts.map
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,524 @@
|
||||
// Copyright (c) Microsoft Corporation.
|
||||
// Licensed under the MIT license.
|
||||
import { v4 } from "uuid";
|
||||
const uuid = v4;
|
||||
import { bearerTokenAuthenticationPolicy, createEmptyPipeline, } from "@azure/core-rest-pipeline";
|
||||
import { Constants, HTTPMethod, OperationType, ResourceType } from "./common/constants";
|
||||
import { getIdFromLink, getPathFromLink, parseLink } from "./common/helper";
|
||||
import { StatusCodes, SubStatusCodes } from "./common/statusCodes";
|
||||
import { ConsistencyLevel, DatabaseAccount, convertToInternalPartitionKey, } from "./documents";
|
||||
import { PluginOn, executePlugins } from "./plugins/Plugin";
|
||||
import { QueryIterator } from "./queryIterator";
|
||||
import { getHeaders } from "./request/request";
|
||||
import { RequestHandler } from "./request/RequestHandler";
|
||||
import { SessionContainer } from "./session/sessionContainer";
|
||||
import { sanitizeEndpoint } from "./utils/checkURL";
|
||||
import { supportedQueryFeaturesBuilder } from "./utils/supportedQueryFeaturesBuilder";
|
||||
import { createClientLogger } from "@azure/logger";
|
||||
import { LogDiagnosticWriter, NoOpDiagnosticWriter, } from "./diagnostics/DiagnosticWriter";
|
||||
import { DefaultDiagnosticFormatter } from "./diagnostics/DiagnosticFormatter";
|
||||
import { CosmosDbDiagnosticLevel } from "./diagnostics/CosmosDbDiagnosticLevel";
|
||||
const logger = createClientLogger("ClientContext");
|
||||
const QueryJsonContentType = "application/query+json";
|
||||
const HttpHeaders = Constants.HttpHeaders;
|
||||
/**
|
||||
* @hidden
|
||||
* @hidden
|
||||
*/
|
||||
export class ClientContext {
|
||||
constructor(cosmosClientOptions, globalEndpointManager, clientConfig, diagnosticLevel) {
|
||||
this.cosmosClientOptions = cosmosClientOptions;
|
||||
this.globalEndpointManager = globalEndpointManager;
|
||||
this.clientConfig = clientConfig;
|
||||
this.diagnosticLevel = diagnosticLevel;
|
||||
this.connectionPolicy = cosmosClientOptions.connectionPolicy;
|
||||
this.sessionContainer = new SessionContainer();
|
||||
this.partitionKeyDefinitionCache = {};
|
||||
this.pipeline = null;
|
||||
if (cosmosClientOptions.aadCredentials) {
|
||||
this.pipeline = createEmptyPipeline();
|
||||
const hrefEndpoint = sanitizeEndpoint(cosmosClientOptions.endpoint);
|
||||
const scope = `${hrefEndpoint}/.default`;
|
||||
this.pipeline.addPolicy(bearerTokenAuthenticationPolicy({
|
||||
credential: cosmosClientOptions.aadCredentials,
|
||||
scopes: scope,
|
||||
challengeCallbacks: {
|
||||
async authorizeRequest({ request, getAccessToken }) {
|
||||
const tokenResponse = await getAccessToken([scope], {});
|
||||
const AUTH_PREFIX = `type=aad&ver=1.0&sig=`;
|
||||
const authorizationToken = `${AUTH_PREFIX}${tokenResponse.token}`;
|
||||
request.headers.set("Authorization", authorizationToken);
|
||||
},
|
||||
},
|
||||
}));
|
||||
}
|
||||
this.initializeDiagnosticSettings(diagnosticLevel);
|
||||
}
|
||||
/** @hidden */
|
||||
async read({ path, resourceType, resourceId, options = {}, partitionKey, diagnosticNode, }) {
|
||||
try {
|
||||
const request = Object.assign(Object.assign({}, this.getContextDerivedPropsForRequestCreation()), { method: HTTPMethod.get, path, operationType: OperationType.Read, resourceId,
|
||||
options,
|
||||
resourceType,
|
||||
partitionKey });
|
||||
diagnosticNode.addData({
|
||||
operationType: OperationType.Read,
|
||||
resourceType,
|
||||
});
|
||||
request.headers = await this.buildHeaders(request);
|
||||
this.applySessionToken(request);
|
||||
// read will use ReadEndpoint since it uses GET operation
|
||||
request.endpoint = await this.globalEndpointManager.resolveServiceEndpoint(diagnosticNode, request.resourceType, request.operationType);
|
||||
const response = await executePlugins(diagnosticNode, request, RequestHandler.request, PluginOn.operation);
|
||||
this.captureSessionToken(undefined, path, OperationType.Read, response.headers);
|
||||
return response;
|
||||
}
|
||||
catch (err) {
|
||||
this.captureSessionToken(err, path, OperationType.Upsert, err.headers);
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
async queryFeed({ path, resourceType, resourceId, resultFn, query, options, diagnosticNode, partitionKeyRangeId, partitionKey, startEpk, endEpk, }) {
|
||||
// Query operations will use ReadEndpoint even though it uses
|
||||
// GET(for queryFeed) and POST(for regular query operations)
|
||||
const request = Object.assign(Object.assign({}, this.getContextDerivedPropsForRequestCreation()), { method: HTTPMethod.get, path, operationType: OperationType.Query, partitionKeyRangeId,
|
||||
resourceId,
|
||||
resourceType,
|
||||
options, body: query, partitionKey });
|
||||
diagnosticNode.addData({
|
||||
operationType: OperationType.Query,
|
||||
resourceType,
|
||||
});
|
||||
const requestId = uuid();
|
||||
if (query !== undefined) {
|
||||
request.method = HTTPMethod.post;
|
||||
}
|
||||
request.endpoint = await this.globalEndpointManager.resolveServiceEndpoint(diagnosticNode, request.resourceType, request.operationType);
|
||||
request.headers = await this.buildHeaders(request);
|
||||
if (startEpk !== undefined && endEpk !== undefined) {
|
||||
request.headers[HttpHeaders.StartEpk] = startEpk;
|
||||
request.headers[HttpHeaders.EndEpk] = endEpk;
|
||||
request.headers[HttpHeaders.ReadFeedKeyType] = "EffectivePartitionKeyRange";
|
||||
}
|
||||
if (query !== undefined) {
|
||||
request.headers[HttpHeaders.IsQuery] = "true";
|
||||
request.headers[HttpHeaders.ContentType] = QueryJsonContentType;
|
||||
if (typeof query === "string") {
|
||||
request.body = { query }; // Converts query text to query object.
|
||||
}
|
||||
}
|
||||
this.applySessionToken(request);
|
||||
logger.info("query " +
|
||||
requestId +
|
||||
" started" +
|
||||
(request.partitionKeyRangeId ? " pkrid: " + request.partitionKeyRangeId : ""));
|
||||
logger.verbose(request);
|
||||
const start = Date.now();
|
||||
const response = await RequestHandler.request(request, diagnosticNode);
|
||||
logger.info("query " + requestId + " finished - " + (Date.now() - start) + "ms");
|
||||
this.captureSessionToken(undefined, path, OperationType.Query, response.headers);
|
||||
return this.processQueryFeedResponse(response, !!query, resultFn);
|
||||
}
|
||||
async getQueryPlan(path, resourceType, resourceId, query, options = {}, diagnosticNode) {
|
||||
const request = Object.assign(Object.assign({}, this.getContextDerivedPropsForRequestCreation()), { method: HTTPMethod.post, path, operationType: OperationType.Read, resourceId,
|
||||
resourceType,
|
||||
options, body: query });
|
||||
diagnosticNode.addData({
|
||||
operationType: OperationType.Read,
|
||||
resourceType,
|
||||
});
|
||||
request.endpoint = await this.globalEndpointManager.resolveServiceEndpoint(diagnosticNode, request.resourceType, request.operationType);
|
||||
request.headers = await this.buildHeaders(request);
|
||||
request.headers[HttpHeaders.IsQueryPlan] = "True";
|
||||
request.headers[HttpHeaders.QueryVersion] = "1.4";
|
||||
request.headers[HttpHeaders.ContentType] = QueryJsonContentType;
|
||||
request.headers[HttpHeaders.SupportedQueryFeatures] = supportedQueryFeaturesBuilder(options.disableNonStreamingOrderByQuery);
|
||||
if (typeof query === "string") {
|
||||
request.body = { query }; // Converts query text to query object.
|
||||
}
|
||||
this.applySessionToken(request);
|
||||
const response = await RequestHandler.request(request, diagnosticNode);
|
||||
this.captureSessionToken(undefined, path, OperationType.Query, response.headers);
|
||||
return response;
|
||||
}
|
||||
queryPartitionKeyRanges(collectionLink, query, options) {
|
||||
const path = getPathFromLink(collectionLink, ResourceType.pkranges);
|
||||
const id = getIdFromLink(collectionLink);
|
||||
const cb = async (diagNode, innerOptions) => {
|
||||
const response = await this.queryFeed({
|
||||
path,
|
||||
resourceType: ResourceType.pkranges,
|
||||
resourceId: id,
|
||||
resultFn: (result) => result.PartitionKeyRanges,
|
||||
query,
|
||||
options: innerOptions,
|
||||
diagnosticNode: diagNode,
|
||||
});
|
||||
return response;
|
||||
};
|
||||
return new QueryIterator(this, query, options, cb);
|
||||
}
|
||||
async delete({ path, resourceType, resourceId, options = {}, partitionKey, method = HTTPMethod.delete, diagnosticNode, }) {
|
||||
try {
|
||||
const request = Object.assign(Object.assign({}, this.getContextDerivedPropsForRequestCreation()), { method: method, operationType: OperationType.Delete, path,
|
||||
resourceType,
|
||||
options,
|
||||
resourceId,
|
||||
partitionKey });
|
||||
diagnosticNode.addData({
|
||||
operationType: OperationType.Delete,
|
||||
resourceType,
|
||||
});
|
||||
request.headers = await this.buildHeaders(request);
|
||||
this.applySessionToken(request);
|
||||
// deleteResource will use WriteEndpoint since it uses DELETE operation
|
||||
request.endpoint = await this.globalEndpointManager.resolveServiceEndpoint(diagnosticNode, request.resourceType, request.operationType);
|
||||
const response = await executePlugins(diagnosticNode, request, RequestHandler.request, PluginOn.operation);
|
||||
if (parseLink(path).type !== "colls") {
|
||||
this.captureSessionToken(undefined, path, OperationType.Delete, response.headers);
|
||||
}
|
||||
else {
|
||||
this.clearSessionToken(path);
|
||||
}
|
||||
return response;
|
||||
}
|
||||
catch (err) {
|
||||
this.captureSessionToken(err, path, OperationType.Upsert, err.headers);
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
async patch({ body, path, resourceType, resourceId, options = {}, partitionKey, diagnosticNode, }) {
|
||||
try {
|
||||
const request = Object.assign(Object.assign({}, this.getContextDerivedPropsForRequestCreation()), { method: HTTPMethod.patch, operationType: OperationType.Patch, path,
|
||||
resourceType,
|
||||
body,
|
||||
resourceId,
|
||||
options,
|
||||
partitionKey });
|
||||
diagnosticNode.addData({
|
||||
operationType: OperationType.Patch,
|
||||
resourceType,
|
||||
});
|
||||
request.headers = await this.buildHeaders(request);
|
||||
this.applySessionToken(request);
|
||||
// patch will use WriteEndpoint
|
||||
request.endpoint = await this.globalEndpointManager.resolveServiceEndpoint(diagnosticNode, request.resourceType, request.operationType);
|
||||
const response = await executePlugins(diagnosticNode, request, RequestHandler.request, PluginOn.operation);
|
||||
this.captureSessionToken(undefined, path, OperationType.Patch, response.headers);
|
||||
return response;
|
||||
}
|
||||
catch (err) {
|
||||
this.captureSessionToken(err, path, OperationType.Upsert, err.headers);
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
async create({ body, path, resourceType, resourceId, diagnosticNode, options = {}, partitionKey, }) {
|
||||
try {
|
||||
const request = Object.assign(Object.assign({}, this.getContextDerivedPropsForRequestCreation()), { method: HTTPMethod.post, operationType: OperationType.Create, path,
|
||||
resourceType,
|
||||
resourceId,
|
||||
body,
|
||||
options,
|
||||
partitionKey });
|
||||
diagnosticNode.addData({
|
||||
operationType: OperationType.Create,
|
||||
resourceType,
|
||||
});
|
||||
request.headers = await this.buildHeaders(request);
|
||||
// create will use WriteEndpoint since it uses POST operation
|
||||
this.applySessionToken(request);
|
||||
request.endpoint = await this.globalEndpointManager.resolveServiceEndpoint(diagnosticNode, request.resourceType, request.operationType);
|
||||
const response = await executePlugins(diagnosticNode, request, RequestHandler.request, PluginOn.operation);
|
||||
this.captureSessionToken(undefined, path, OperationType.Create, response.headers);
|
||||
return response;
|
||||
}
|
||||
catch (err) {
|
||||
this.captureSessionToken(err, path, OperationType.Upsert, err.headers);
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
processQueryFeedResponse(res, isQuery, resultFn) {
|
||||
if (isQuery) {
|
||||
return {
|
||||
result: resultFn(res.result),
|
||||
headers: res.headers,
|
||||
code: res.code,
|
||||
};
|
||||
}
|
||||
else {
|
||||
const newResult = resultFn(res.result).map((body) => body);
|
||||
return {
|
||||
result: newResult,
|
||||
headers: res.headers,
|
||||
code: res.code,
|
||||
};
|
||||
}
|
||||
}
|
||||
applySessionToken(requestContext) {
|
||||
const request = this.getSessionParams(requestContext.path);
|
||||
if (requestContext.headers && requestContext.headers[HttpHeaders.SessionToken]) {
|
||||
return;
|
||||
}
|
||||
const sessionConsistency = requestContext.headers[HttpHeaders.ConsistencyLevel];
|
||||
if (!sessionConsistency) {
|
||||
return;
|
||||
}
|
||||
if (sessionConsistency !== ConsistencyLevel.Session) {
|
||||
return;
|
||||
}
|
||||
if (request.resourceAddress) {
|
||||
const sessionToken = this.sessionContainer.get(request);
|
||||
if (sessionToken) {
|
||||
requestContext.headers[HttpHeaders.SessionToken] = sessionToken;
|
||||
}
|
||||
}
|
||||
}
|
||||
async replace({ body, path, resourceType, resourceId, options = {}, partitionKey, diagnosticNode, }) {
|
||||
try {
|
||||
const request = Object.assign(Object.assign({}, this.getContextDerivedPropsForRequestCreation()), { method: HTTPMethod.put, operationType: OperationType.Replace, path,
|
||||
resourceType,
|
||||
body,
|
||||
resourceId,
|
||||
options,
|
||||
partitionKey });
|
||||
diagnosticNode.addData({
|
||||
operationType: OperationType.Replace,
|
||||
resourceType,
|
||||
});
|
||||
request.headers = await this.buildHeaders(request);
|
||||
this.applySessionToken(request);
|
||||
// replace will use WriteEndpoint since it uses PUT operation
|
||||
request.endpoint = await this.globalEndpointManager.resolveServiceEndpoint(diagnosticNode, request.resourceType, request.operationType);
|
||||
const response = await executePlugins(diagnosticNode, request, RequestHandler.request, PluginOn.operation);
|
||||
this.captureSessionToken(undefined, path, OperationType.Replace, response.headers);
|
||||
return response;
|
||||
}
|
||||
catch (err) {
|
||||
this.captureSessionToken(err, path, OperationType.Upsert, err.headers);
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
async upsert({ body, path, resourceType, resourceId, options = {}, partitionKey, diagnosticNode, }) {
|
||||
try {
|
||||
const request = Object.assign(Object.assign({}, this.getContextDerivedPropsForRequestCreation()), { method: HTTPMethod.post, operationType: OperationType.Upsert, path,
|
||||
resourceType,
|
||||
body,
|
||||
resourceId,
|
||||
options,
|
||||
partitionKey });
|
||||
diagnosticNode.addData({
|
||||
operationType: OperationType.Upsert,
|
||||
resourceType,
|
||||
});
|
||||
request.headers = await this.buildHeaders(request);
|
||||
request.headers[HttpHeaders.IsUpsert] = true;
|
||||
this.applySessionToken(request);
|
||||
// upsert will use WriteEndpoint since it uses POST operation
|
||||
request.endpoint = await this.globalEndpointManager.resolveServiceEndpoint(diagnosticNode, request.resourceType, request.operationType);
|
||||
const response = await executePlugins(diagnosticNode, request, RequestHandler.request, PluginOn.operation);
|
||||
this.captureSessionToken(undefined, path, OperationType.Upsert, response.headers);
|
||||
return response;
|
||||
}
|
||||
catch (err) {
|
||||
this.captureSessionToken(err, path, OperationType.Upsert, err.headers);
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
async execute({ sprocLink, params, options = {}, partitionKey, diagnosticNode, }) {
|
||||
// Accept a single parameter or an array of parameters.
|
||||
// Didn't add type annotation for this because we should legacy this behavior
|
||||
if (params !== null && params !== undefined && !Array.isArray(params)) {
|
||||
params = [params];
|
||||
}
|
||||
const path = getPathFromLink(sprocLink);
|
||||
const id = getIdFromLink(sprocLink);
|
||||
const request = Object.assign(Object.assign({}, this.getContextDerivedPropsForRequestCreation()), { method: HTTPMethod.post, operationType: OperationType.Execute, path, resourceType: ResourceType.sproc, options, resourceId: id, body: params, partitionKey });
|
||||
diagnosticNode.addData({
|
||||
operationType: OperationType.Execute,
|
||||
resourceType: ResourceType.sproc,
|
||||
});
|
||||
request.headers = await this.buildHeaders(request);
|
||||
// executeStoredProcedure will use WriteEndpoint since it uses POST operation
|
||||
request.endpoint = await this.globalEndpointManager.resolveServiceEndpoint(diagnosticNode, request.resourceType, request.operationType);
|
||||
const response = await executePlugins(diagnosticNode, request, RequestHandler.request, PluginOn.operation);
|
||||
return response;
|
||||
}
|
||||
/**
|
||||
* Gets the Database account information.
|
||||
* @param options - `urlConnection` in the options is the endpoint url whose database account needs to be retrieved.
|
||||
* If not present, current client's url will be used.
|
||||
*/
|
||||
async getDatabaseAccount(diagnosticNode, options = {}) {
|
||||
const endpoint = options.urlConnection || this.cosmosClientOptions.endpoint;
|
||||
const request = Object.assign(Object.assign({}, this.getContextDerivedPropsForRequestCreation()), { endpoint, method: HTTPMethod.get, operationType: OperationType.Read, path: "", resourceType: ResourceType.none, options });
|
||||
diagnosticNode.addData({
|
||||
operationType: OperationType.Read,
|
||||
resourceType: ResourceType.none,
|
||||
});
|
||||
request.headers = await this.buildHeaders(request);
|
||||
// await options.beforeOperation({ endpoint, request, headers: requestHeaders });
|
||||
const { result, headers, code, substatus, diagnostics } = await executePlugins(diagnosticNode, request, RequestHandler.request, PluginOn.operation);
|
||||
const databaseAccount = new DatabaseAccount(result, headers);
|
||||
return {
|
||||
result: databaseAccount,
|
||||
headers,
|
||||
diagnostics,
|
||||
code: code,
|
||||
substatus: substatus,
|
||||
};
|
||||
}
|
||||
getWriteEndpoint(diagnosticNode) {
|
||||
return this.globalEndpointManager.getWriteEndpoint(diagnosticNode);
|
||||
}
|
||||
getReadEndpoint(diagnosticNode) {
|
||||
return this.globalEndpointManager.getReadEndpoint(diagnosticNode);
|
||||
}
|
||||
getWriteEndpoints() {
|
||||
return this.globalEndpointManager.getWriteEndpoints();
|
||||
}
|
||||
getReadEndpoints() {
|
||||
return this.globalEndpointManager.getReadEndpoints();
|
||||
}
|
||||
async batch({ body, path, partitionKey, resourceId, options = {}, diagnosticNode, }) {
|
||||
try {
|
||||
const request = Object.assign(Object.assign({}, this.getContextDerivedPropsForRequestCreation()), { method: HTTPMethod.post, operationType: OperationType.Batch, path,
|
||||
body, resourceType: ResourceType.item, resourceId,
|
||||
options,
|
||||
partitionKey });
|
||||
diagnosticNode.addData({
|
||||
operationType: OperationType.Batch,
|
||||
resourceType: ResourceType.item,
|
||||
});
|
||||
request.headers = await this.buildHeaders(request);
|
||||
request.headers[HttpHeaders.IsBatchRequest] = true;
|
||||
request.headers[HttpHeaders.IsBatchAtomic] = true;
|
||||
this.applySessionToken(request);
|
||||
request.endpoint = await this.globalEndpointManager.resolveServiceEndpoint(diagnosticNode, request.resourceType, request.operationType);
|
||||
const response = await executePlugins(diagnosticNode, request, RequestHandler.request, PluginOn.operation);
|
||||
this.captureSessionToken(undefined, path, OperationType.Batch, response.headers);
|
||||
response.diagnostics = diagnosticNode.toDiagnostic(this.getClientConfig());
|
||||
return response;
|
||||
}
|
||||
catch (err) {
|
||||
this.captureSessionToken(err, path, OperationType.Upsert, err.headers);
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
async bulk({ body, path, partitionKeyRangeId, resourceId, bulkOptions = {}, options = {}, diagnosticNode, }) {
|
||||
try {
|
||||
const request = Object.assign(Object.assign({}, this.getContextDerivedPropsForRequestCreation()), { method: HTTPMethod.post, operationType: OperationType.Batch, path,
|
||||
body, resourceType: ResourceType.item, resourceId,
|
||||
options });
|
||||
diagnosticNode.addData({
|
||||
operationType: OperationType.Batch,
|
||||
resourceType: ResourceType.item,
|
||||
});
|
||||
request.headers = await this.buildHeaders(request);
|
||||
request.headers[HttpHeaders.IsBatchRequest] = true;
|
||||
request.headers[HttpHeaders.PartitionKeyRangeID] = partitionKeyRangeId;
|
||||
request.headers[HttpHeaders.IsBatchAtomic] = false;
|
||||
request.headers[HttpHeaders.BatchContinueOnError] = bulkOptions.continueOnError || false;
|
||||
this.applySessionToken(request);
|
||||
request.endpoint = await this.globalEndpointManager.resolveServiceEndpoint(diagnosticNode, request.resourceType, request.operationType);
|
||||
const response = await executePlugins(diagnosticNode, request, RequestHandler.request, PluginOn.operation);
|
||||
this.captureSessionToken(undefined, path, OperationType.Batch, response.headers);
|
||||
return response;
|
||||
}
|
||||
catch (err) {
|
||||
this.captureSessionToken(err, path, OperationType.Upsert, err.headers);
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
captureSessionToken(err, path, operationType, resHeaders) {
|
||||
const request = this.getSessionParams(path);
|
||||
request.operationType = operationType;
|
||||
if (!err ||
|
||||
(!this.isMasterResource(request.resourceType) &&
|
||||
(err.code === StatusCodes.PreconditionFailed ||
|
||||
err.code === StatusCodes.Conflict ||
|
||||
(err.code === StatusCodes.NotFound &&
|
||||
err.substatus !== SubStatusCodes.ReadSessionNotAvailable)))) {
|
||||
this.sessionContainer.set(request, resHeaders);
|
||||
}
|
||||
}
|
||||
clearSessionToken(path) {
|
||||
const request = this.getSessionParams(path);
|
||||
this.sessionContainer.remove(request);
|
||||
}
|
||||
recordDiagnostics(diagnostic) {
|
||||
const formatted = this.diagnosticFormatter.format(diagnostic);
|
||||
this.diagnosticWriter.write(formatted);
|
||||
}
|
||||
initializeDiagnosticSettings(diagnosticLevel) {
|
||||
this.diagnosticFormatter = new DefaultDiagnosticFormatter();
|
||||
switch (diagnosticLevel) {
|
||||
case CosmosDbDiagnosticLevel.info:
|
||||
this.diagnosticWriter = new NoOpDiagnosticWriter();
|
||||
break;
|
||||
default:
|
||||
this.diagnosticWriter = new LogDiagnosticWriter();
|
||||
}
|
||||
}
|
||||
// TODO: move
|
||||
getSessionParams(resourceLink) {
|
||||
const resourceId = null;
|
||||
let resourceAddress = null;
|
||||
const parserOutput = parseLink(resourceLink);
|
||||
resourceAddress = parserOutput.objectBody.self;
|
||||
const resourceType = parserOutput.type;
|
||||
return {
|
||||
resourceId,
|
||||
resourceAddress,
|
||||
resourceType,
|
||||
isNameBased: true,
|
||||
};
|
||||
}
|
||||
isMasterResource(resourceType) {
|
||||
if (resourceType === Constants.Path.OffersPathSegment ||
|
||||
resourceType === Constants.Path.DatabasesPathSegment ||
|
||||
resourceType === Constants.Path.UsersPathSegment ||
|
||||
resourceType === Constants.Path.PermissionsPathSegment ||
|
||||
resourceType === Constants.Path.TopologyPathSegment ||
|
||||
resourceType === Constants.Path.DatabaseAccountPathSegment ||
|
||||
resourceType === Constants.Path.PartitionKeyRangesPathSegment ||
|
||||
resourceType === Constants.Path.CollectionsPathSegment) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
buildHeaders(requestContext) {
|
||||
return getHeaders({
|
||||
clientOptions: this.cosmosClientOptions,
|
||||
defaultHeaders: Object.assign(Object.assign({}, this.cosmosClientOptions.defaultHeaders), requestContext.options.initialHeaders),
|
||||
verb: requestContext.method,
|
||||
path: requestContext.path,
|
||||
resourceId: requestContext.resourceId,
|
||||
resourceType: requestContext.resourceType,
|
||||
options: requestContext.options,
|
||||
partitionKeyRangeId: requestContext.partitionKeyRangeId,
|
||||
useMultipleWriteLocations: this.connectionPolicy.useMultipleWriteLocations,
|
||||
partitionKey: requestContext.partitionKey !== undefined
|
||||
? convertToInternalPartitionKey(requestContext.partitionKey)
|
||||
: undefined, // TODO: Move this check from here to PartitionKey
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Returns collection of properties which are derived from the context for Request Creation.
|
||||
* These properties have client wide scope, as opposed to request specific scope.
|
||||
* @returns
|
||||
*/
|
||||
getContextDerivedPropsForRequestCreation() {
|
||||
return {
|
||||
globalEndpointManager: this.globalEndpointManager,
|
||||
requestAgent: this.cosmosClientOptions.agent,
|
||||
connectionPolicy: this.connectionPolicy,
|
||||
client: this,
|
||||
plugins: this.cosmosClientOptions.plugins,
|
||||
pipeline: this.pipeline,
|
||||
};
|
||||
}
|
||||
getClientConfig() {
|
||||
return this.clientConfig;
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=ClientContext.js.map
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,116 @@
|
||||
import { Database, Databases } from "./client/Database";
|
||||
import { Offer, Offers } from "./client/Offer";
|
||||
import { CosmosClientOptions } from "./CosmosClientOptions";
|
||||
import { DiagnosticNodeInternal } from "./diagnostics/DiagnosticNodeInternal";
|
||||
import { DatabaseAccount } from "./documents";
|
||||
import { RequestOptions, ResourceResponse } from "./request";
|
||||
/**
|
||||
* Provides a client-side logical representation of the Azure Cosmos DB database account.
|
||||
* This client is used to configure and execute requests in the Azure Cosmos DB database service.
|
||||
* @example Instantiate a client and create a new database
|
||||
* ```typescript
|
||||
* const client = new CosmosClient({endpoint: "<URL HERE>", auth: {masterKey: "<KEY HERE>"}});
|
||||
* await client.databases.create({id: "<datbase name here>"});
|
||||
* ```
|
||||
* @example Instantiate a client with custom Connection Policy
|
||||
* ```typescript
|
||||
* const connectionPolicy = new ConnectionPolicy();
|
||||
* connectionPolicy.RequestTimeout = 10000;
|
||||
* const client = new CosmosClient({
|
||||
* endpoint: "<URL HERE>",
|
||||
* auth: {masterKey: "<KEY HERE>"},
|
||||
* connectionPolicy
|
||||
* });
|
||||
* ```
|
||||
*/
|
||||
export declare class CosmosClient {
|
||||
/**
|
||||
* Used for creating new databases, or querying/reading all databases.
|
||||
*
|
||||
* Use `.database(id)` to read, replace, or delete a specific, existing database by id.
|
||||
*
|
||||
* @example Create a new database
|
||||
* ```typescript
|
||||
* const {resource: databaseDefinition, database} = await client.databases.create({id: "<name here>"});
|
||||
* ```
|
||||
*/
|
||||
readonly databases: Databases;
|
||||
/**
|
||||
* Used for querying & reading all offers.
|
||||
*
|
||||
* Use `.offer(id)` to read, or replace existing offers.
|
||||
*/
|
||||
readonly offers: Offers;
|
||||
private clientContext;
|
||||
private endpointRefresher;
|
||||
/**
|
||||
* Creates a new {@link CosmosClient} object from a connection string. Your database connection string can be found in the Azure Portal
|
||||
*/
|
||||
constructor(connectionString: string);
|
||||
/**
|
||||
* Creates a new {@link CosmosClient} object. See {@link CosmosClientOptions} for more details on what options you can use.
|
||||
* @param options - bag of options; require at least endpoint and auth to be configured
|
||||
*/
|
||||
constructor(options: CosmosClientOptions);
|
||||
private initializeClientConfigDiagnostic;
|
||||
/**
|
||||
* Get information about the current {@link DatabaseAccount} (including which regions are supported, etc.)
|
||||
*/
|
||||
getDatabaseAccount(options?: RequestOptions): Promise<ResourceResponse<DatabaseAccount>>;
|
||||
/**
|
||||
* @hidden
|
||||
*/
|
||||
getDatabaseAccountInternal(diagnosticNode: DiagnosticNodeInternal, options?: RequestOptions): Promise<ResourceResponse<DatabaseAccount>>;
|
||||
/**
|
||||
* Gets the currently used write endpoint url. Useful for troubleshooting purposes.
|
||||
*
|
||||
* The url may contain a region suffix (e.g. "-eastus") if we're using location specific endpoints.
|
||||
*/
|
||||
getWriteEndpoint(): Promise<string>;
|
||||
/**
|
||||
* Gets the currently used read endpoint. Useful for troubleshooting purposes.
|
||||
*
|
||||
* The url may contain a region suffix (e.g. "-eastus") if we're using location specific endpoints.
|
||||
*/
|
||||
getReadEndpoint(): Promise<string>;
|
||||
/**
|
||||
* Gets the known write endpoints. Useful for troubleshooting purposes.
|
||||
*
|
||||
* The urls may contain a region suffix (e.g. "-eastus") if we're using location specific endpoints.
|
||||
*/
|
||||
getWriteEndpoints(): Promise<readonly string[]>;
|
||||
/**
|
||||
* Gets the currently used read endpoint. Useful for troubleshooting purposes.
|
||||
*
|
||||
* The url may contain a region suffix (e.g. "-eastus") if we're using location specific endpoints.
|
||||
*/
|
||||
getReadEndpoints(): Promise<readonly string[]>;
|
||||
/**
|
||||
* Used for reading, updating, or deleting a existing database by id or accessing containers belonging to that database.
|
||||
*
|
||||
* This does not make a network call. Use `.read` to get info about the database after getting the {@link Database} object.
|
||||
*
|
||||
* @param id - The id of the database.
|
||||
* @example Create a new container off of an existing database
|
||||
* ```typescript
|
||||
* const container = client.database("<database id>").containers.create("<container id>");
|
||||
* ```
|
||||
*
|
||||
* @example Delete an existing database
|
||||
* ```typescript
|
||||
* await client.database("<id here>").delete();
|
||||
* ```
|
||||
*/
|
||||
database(id: string): Database;
|
||||
/**
|
||||
* Used for reading, or updating a existing offer by id.
|
||||
* @param id - The id of the offer.
|
||||
*/
|
||||
offer(id: string): Offer;
|
||||
/**
|
||||
* Clears background endpoint refresher. Use client.dispose() when destroying the CosmosClient within another process.
|
||||
*/
|
||||
dispose(): void;
|
||||
private backgroundRefreshEndpointList;
|
||||
}
|
||||
//# sourceMappingURL=CosmosClient.d.ts.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"CosmosClient.d.ts","sourceRoot":"","sources":["../../src/CosmosClient.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAK/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,EAAE,sBAAsB,EAAsB,MAAM,sCAAsC,CAAC;AAClG,OAAO,EAAE,eAAe,EAA2B,MAAM,aAAa,CAAC;AAEvE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAI7D;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,YAAY;IACvB;;;;;;;;;OASG;IACH,SAAgB,SAAS,EAAE,SAAS,CAAC;IACrC;;;;OAIG;IACH,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,iBAAiB,CAAiB;IAC1C;;OAEG;gBACS,gBAAgB,EAAE,MAAM;IACpC;;;OAGG;gBACS,OAAO,EAAE,mBAAmB;IA+DxC,OAAO,CAAC,gCAAgC;IAmBxC;;OAEG;IACU,kBAAkB,CAC7B,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAM7C;;OAEG;IACU,0BAA0B,CACrC,cAAc,EAAE,sBAAsB,EACtC,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAW7C;;;;OAIG;IACU,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAMhD;;;;OAIG;IACU,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAM/C;;;;OAIG;IACI,iBAAiB,IAAI,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC;IAItD;;;;OAIG;IACI,gBAAgB,IAAI,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC;IAIrD;;;;;;;;;;;;;;;OAeG;IACI,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ;IAIrC;;;OAGG;IACI,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,KAAK;IAI/B;;OAEG;IACI,OAAO,IAAI,IAAI;YAIR,6BAA6B;CAqB5C"}
|
||||
@@ -0,0 +1,181 @@
|
||||
// Copyright (c) Microsoft Corporation.
|
||||
// Licensed under the MIT license.
|
||||
import { Database, Databases } from "./client/Database";
|
||||
import { Offer, Offers } from "./client/Offer";
|
||||
import { ClientContext } from "./ClientContext";
|
||||
import { parseConnectionString } from "./common";
|
||||
import { Constants } from "./common/constants";
|
||||
import { getUserAgent } from "./common/platform";
|
||||
import { determineDiagnosticLevel, getDiagnosticLevelFromEnvironment } from "./diagnostics";
|
||||
import { DiagnosticNodeType } from "./diagnostics/DiagnosticNodeInternal";
|
||||
import { defaultConnectionPolicy } from "./documents";
|
||||
import { GlobalEndpointManager } from "./globalEndpointManager";
|
||||
import { ResourceResponse } from "./request";
|
||||
import { checkURL } from "./utils/checkURL";
|
||||
import { getEmptyCosmosDiagnostics, withDiagnostics } from "./utils/diagnostics";
|
||||
/**
|
||||
* Provides a client-side logical representation of the Azure Cosmos DB database account.
|
||||
* This client is used to configure and execute requests in the Azure Cosmos DB database service.
|
||||
* @example Instantiate a client and create a new database
|
||||
* ```typescript
|
||||
* const client = new CosmosClient({endpoint: "<URL HERE>", auth: {masterKey: "<KEY HERE>"}});
|
||||
* await client.databases.create({id: "<datbase name here>"});
|
||||
* ```
|
||||
* @example Instantiate a client with custom Connection Policy
|
||||
* ```typescript
|
||||
* const connectionPolicy = new ConnectionPolicy();
|
||||
* connectionPolicy.RequestTimeout = 10000;
|
||||
* const client = new CosmosClient({
|
||||
* endpoint: "<URL HERE>",
|
||||
* auth: {masterKey: "<KEY HERE>"},
|
||||
* connectionPolicy
|
||||
* });
|
||||
* ```
|
||||
*/
|
||||
export class CosmosClient {
|
||||
constructor(optionsOrConnectionString) {
|
||||
var _a, _b;
|
||||
if (typeof optionsOrConnectionString === "string") {
|
||||
optionsOrConnectionString = parseConnectionString(optionsOrConnectionString);
|
||||
}
|
||||
const endpoint = checkURL(optionsOrConnectionString.endpoint);
|
||||
if (!endpoint) {
|
||||
throw new Error("Invalid endpoint specified");
|
||||
}
|
||||
const clientConfig = this.initializeClientConfigDiagnostic(optionsOrConnectionString);
|
||||
optionsOrConnectionString.connectionPolicy = Object.assign({}, defaultConnectionPolicy, optionsOrConnectionString.connectionPolicy);
|
||||
optionsOrConnectionString.defaultHeaders = optionsOrConnectionString.defaultHeaders || {};
|
||||
optionsOrConnectionString.defaultHeaders[Constants.HttpHeaders.CacheControl] = "no-cache";
|
||||
optionsOrConnectionString.defaultHeaders[Constants.HttpHeaders.Version] =
|
||||
Constants.CurrentVersion;
|
||||
if (optionsOrConnectionString.consistencyLevel !== undefined) {
|
||||
optionsOrConnectionString.defaultHeaders[Constants.HttpHeaders.ConsistencyLevel] =
|
||||
optionsOrConnectionString.consistencyLevel;
|
||||
}
|
||||
optionsOrConnectionString.defaultHeaders[Constants.HttpHeaders.UserAgent] = getUserAgent(optionsOrConnectionString.userAgentSuffix);
|
||||
const globalEndpointManager = new GlobalEndpointManager(optionsOrConnectionString, async (diagnosticNode, opts) => this.getDatabaseAccountInternal(diagnosticNode, opts));
|
||||
this.clientContext = new ClientContext(optionsOrConnectionString, globalEndpointManager, clientConfig, determineDiagnosticLevel(optionsOrConnectionString.diagnosticLevel, getDiagnosticLevelFromEnvironment()));
|
||||
if (((_a = optionsOrConnectionString.connectionPolicy) === null || _a === void 0 ? void 0 : _a.enableEndpointDiscovery) &&
|
||||
((_b = optionsOrConnectionString.connectionPolicy) === null || _b === void 0 ? void 0 : _b.enableBackgroundEndpointRefreshing)) {
|
||||
this.backgroundRefreshEndpointList(globalEndpointManager, optionsOrConnectionString.connectionPolicy.endpointRefreshRateInMs ||
|
||||
defaultConnectionPolicy.endpointRefreshRateInMs);
|
||||
}
|
||||
this.databases = new Databases(this, this.clientContext);
|
||||
this.offers = new Offers(this, this.clientContext);
|
||||
}
|
||||
initializeClientConfigDiagnostic(optionsOrConnectionString) {
|
||||
return {
|
||||
endpoint: optionsOrConnectionString.endpoint,
|
||||
resourceTokensConfigured: optionsOrConnectionString.resourceTokens !== undefined,
|
||||
tokenProviderConfigured: optionsOrConnectionString.tokenProvider !== undefined,
|
||||
aadCredentialsConfigured: optionsOrConnectionString.aadCredentials !== undefined,
|
||||
connectionPolicyConfigured: optionsOrConnectionString.connectionPolicy !== undefined,
|
||||
consistencyLevel: optionsOrConnectionString.consistencyLevel,
|
||||
defaultHeaders: optionsOrConnectionString.defaultHeaders,
|
||||
agentConfigured: optionsOrConnectionString.agent !== undefined,
|
||||
userAgentSuffix: optionsOrConnectionString.userAgentSuffix,
|
||||
diagnosticLevel: optionsOrConnectionString.diagnosticLevel,
|
||||
pluginsConfigured: optionsOrConnectionString.plugins !== undefined,
|
||||
sDKVersion: Constants.SDKVersion,
|
||||
};
|
||||
}
|
||||
/**
|
||||
* Get information about the current {@link DatabaseAccount} (including which regions are supported, etc.)
|
||||
*/
|
||||
async getDatabaseAccount(options) {
|
||||
return withDiagnostics(async (diagnosticNode) => {
|
||||
return this.getDatabaseAccountInternal(diagnosticNode, options);
|
||||
}, this.clientContext);
|
||||
}
|
||||
/**
|
||||
* @hidden
|
||||
*/
|
||||
async getDatabaseAccountInternal(diagnosticNode, options) {
|
||||
const response = await this.clientContext.getDatabaseAccount(diagnosticNode, options);
|
||||
return new ResourceResponse(response.result, response.headers, response.code, getEmptyCosmosDiagnostics(), response.substatus);
|
||||
}
|
||||
/**
|
||||
* Gets the currently used write endpoint url. Useful for troubleshooting purposes.
|
||||
*
|
||||
* The url may contain a region suffix (e.g. "-eastus") if we're using location specific endpoints.
|
||||
*/
|
||||
async getWriteEndpoint() {
|
||||
return withDiagnostics(async (diagnosticNode) => {
|
||||
return this.clientContext.getWriteEndpoint(diagnosticNode);
|
||||
}, this.clientContext);
|
||||
}
|
||||
/**
|
||||
* Gets the currently used read endpoint. Useful for troubleshooting purposes.
|
||||
*
|
||||
* The url may contain a region suffix (e.g. "-eastus") if we're using location specific endpoints.
|
||||
*/
|
||||
async getReadEndpoint() {
|
||||
return withDiagnostics(async (diagnosticNode) => {
|
||||
return this.clientContext.getReadEndpoint(diagnosticNode);
|
||||
}, this.clientContext);
|
||||
}
|
||||
/**
|
||||
* Gets the known write endpoints. Useful for troubleshooting purposes.
|
||||
*
|
||||
* The urls may contain a region suffix (e.g. "-eastus") if we're using location specific endpoints.
|
||||
*/
|
||||
getWriteEndpoints() {
|
||||
return this.clientContext.getWriteEndpoints();
|
||||
}
|
||||
/**
|
||||
* Gets the currently used read endpoint. Useful for troubleshooting purposes.
|
||||
*
|
||||
* The url may contain a region suffix (e.g. "-eastus") if we're using location specific endpoints.
|
||||
*/
|
||||
getReadEndpoints() {
|
||||
return this.clientContext.getReadEndpoints();
|
||||
}
|
||||
/**
|
||||
* Used for reading, updating, or deleting a existing database by id or accessing containers belonging to that database.
|
||||
*
|
||||
* This does not make a network call. Use `.read` to get info about the database after getting the {@link Database} object.
|
||||
*
|
||||
* @param id - The id of the database.
|
||||
* @example Create a new container off of an existing database
|
||||
* ```typescript
|
||||
* const container = client.database("<database id>").containers.create("<container id>");
|
||||
* ```
|
||||
*
|
||||
* @example Delete an existing database
|
||||
* ```typescript
|
||||
* await client.database("<id here>").delete();
|
||||
* ```
|
||||
*/
|
||||
database(id) {
|
||||
return new Database(this, id, this.clientContext);
|
||||
}
|
||||
/**
|
||||
* Used for reading, or updating a existing offer by id.
|
||||
* @param id - The id of the offer.
|
||||
*/
|
||||
offer(id) {
|
||||
return new Offer(this, id, this.clientContext);
|
||||
}
|
||||
/**
|
||||
* Clears background endpoint refresher. Use client.dispose() when destroying the CosmosClient within another process.
|
||||
*/
|
||||
dispose() {
|
||||
clearTimeout(this.endpointRefresher);
|
||||
}
|
||||
async backgroundRefreshEndpointList(globalEndpointManager, refreshRate) {
|
||||
this.endpointRefresher = setInterval(() => {
|
||||
try {
|
||||
return withDiagnostics(async (diagnosticNode) => {
|
||||
return globalEndpointManager.refreshEndpointList(diagnosticNode);
|
||||
}, this.clientContext, DiagnosticNodeType.BACKGROUND_REFRESH_THREAD);
|
||||
}
|
||||
catch (e) {
|
||||
console.warn("Failed to refresh endpoints", e);
|
||||
}
|
||||
}, refreshRate);
|
||||
if (this.endpointRefresher.unref && typeof this.endpointRefresher.unref === "function") {
|
||||
this.endpointRefresher.unref();
|
||||
}
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=CosmosClient.js.map
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,54 @@
|
||||
import { TokenCredential } from "@azure/core-auth";
|
||||
import { TokenProvider } from "./auth";
|
||||
import { PermissionDefinition } from "./client";
|
||||
import { ConnectionPolicy, ConsistencyLevel } from "./documents";
|
||||
import { CosmosHeaders } from "./queryExecutionContext/CosmosHeaders";
|
||||
import { CosmosDbDiagnosticLevel } from "./diagnostics/CosmosDbDiagnosticLevel";
|
||||
export interface Agent {
|
||||
maxFreeSockets: number;
|
||||
maxSockets: number;
|
||||
sockets: any;
|
||||
requests: any;
|
||||
destroy(): void;
|
||||
}
|
||||
export interface CosmosClientOptions {
|
||||
/** The service endpoint to use to create the client. */
|
||||
endpoint: string;
|
||||
/** The account master or readonly key */
|
||||
key?: string;
|
||||
/** An object that contains resources tokens.
|
||||
* Keys for the object are resource Ids and values are the resource tokens.
|
||||
*/
|
||||
resourceTokens?: {
|
||||
[resourcePath: string]: string;
|
||||
};
|
||||
/** A user supplied function for resolving header authorization tokens.
|
||||
* Allows users to generating their own auth tokens, potentially using a separate service
|
||||
*/
|
||||
tokenProvider?: TokenProvider;
|
||||
/** AAD token from `@azure/identity`
|
||||
* Obtain a credential object by creating an `@azure/identity` credential object
|
||||
* We will then use your credential object and a scope URL (your cosmos db endpoint)
|
||||
* to authenticate requests to Cosmos
|
||||
*/
|
||||
aadCredentials?: TokenCredential;
|
||||
/** An array of {@link Permission} objects. */
|
||||
permissionFeed?: PermissionDefinition[];
|
||||
/** An instance of {@link ConnectionPolicy} class.
|
||||
* This parameter is optional and the default connectionPolicy will be used if omitted.
|
||||
*/
|
||||
connectionPolicy?: ConnectionPolicy;
|
||||
/** An optional parameter that represents the consistency level.
|
||||
* It can take any value from {@link ConsistencyLevel}.
|
||||
*/
|
||||
consistencyLevel?: keyof typeof ConsistencyLevel;
|
||||
defaultHeaders?: CosmosHeaders;
|
||||
/** An optional custom http(s) Agent to be used in NodeJS enironments
|
||||
* Use an agent such as https://github.com/TooTallNate/node-proxy-agent if you need to connect to Cosmos via a proxy
|
||||
*/
|
||||
agent?: Agent;
|
||||
/** A custom string to append to the default SDK user agent. */
|
||||
userAgentSuffix?: string;
|
||||
diagnosticLevel?: CosmosDbDiagnosticLevel;
|
||||
}
|
||||
//# sourceMappingURL=CosmosClientOptions.d.ts.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"CosmosClientOptions.d.ts","sourceRoot":"","sources":["../../src/CosmosClientOptions.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAGhF,MAAM,WAAW,KAAK;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,GAAG,CAAC;IACb,QAAQ,EAAE,GAAG,CAAC;IACd,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,cAAc,CAAC,EAAE;QAAE,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IACpD;;OAEG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B;;;;OAIG;IACH,cAAc,CAAC,EAAE,eAAe,CAAC;IACjC,8CAA8C;IAC9C,cAAc,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACxC;;OAEG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,OAAO,gBAAgB,CAAC;IACjD,cAAc,CAAC,EAAE,aAAa,CAAC;IAC/B;;OAEG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,+DAA+D;IAC/D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,uBAAuB,CAAC;CAG3C"}
|
||||
@@ -0,0 +1,2 @@
|
||||
export {};
|
||||
//# sourceMappingURL=CosmosClientOptions.js.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"CosmosClientOptions.js","sourceRoot":"","sources":["../../src/CosmosClientOptions.ts"],"names":[],"mappings":"","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nimport { TokenCredential } from \"@azure/core-auth\";\nimport { TokenProvider } from \"./auth\";\nimport { PermissionDefinition } from \"./client\";\nimport { ConnectionPolicy, ConsistencyLevel } from \"./documents\";\nimport { PluginConfig } from \"./plugins/Plugin\";\nimport { CosmosHeaders } from \"./queryExecutionContext/CosmosHeaders\";\nimport { CosmosDbDiagnosticLevel } from \"./diagnostics/CosmosDbDiagnosticLevel\";\n\n// We expose our own Agent interface to avoid taking a dependency on and leaking node types. This interface should mirror the node Agent interface\nexport interface Agent {\n maxFreeSockets: number;\n maxSockets: number;\n sockets: any;\n requests: any;\n destroy(): void;\n}\n\nexport interface CosmosClientOptions {\n /** The service endpoint to use to create the client. */\n endpoint: string;\n /** The account master or readonly key */\n key?: string;\n /** An object that contains resources tokens.\n * Keys for the object are resource Ids and values are the resource tokens.\n */\n resourceTokens?: { [resourcePath: string]: string };\n /** A user supplied function for resolving header authorization tokens.\n * Allows users to generating their own auth tokens, potentially using a separate service\n */\n tokenProvider?: TokenProvider;\n /** AAD token from `@azure/identity`\n * Obtain a credential object by creating an `@azure/identity` credential object\n * We will then use your credential object and a scope URL (your cosmos db endpoint)\n * to authenticate requests to Cosmos\n */\n aadCredentials?: TokenCredential;\n /** An array of {@link Permission} objects. */\n permissionFeed?: PermissionDefinition[];\n /** An instance of {@link ConnectionPolicy} class.\n * This parameter is optional and the default connectionPolicy will be used if omitted.\n */\n connectionPolicy?: ConnectionPolicy;\n /** An optional parameter that represents the consistency level.\n * It can take any value from {@link ConsistencyLevel}.\n */\n consistencyLevel?: keyof typeof ConsistencyLevel;\n defaultHeaders?: CosmosHeaders;\n /** An optional custom http(s) Agent to be used in NodeJS enironments\n * Use an agent such as https://github.com/TooTallNate/node-proxy-agent if you need to connect to Cosmos via a proxy\n */\n agent?: Agent;\n /** A custom string to append to the default SDK user agent. */\n userAgentSuffix?: string;\n diagnosticLevel?: CosmosDbDiagnosticLevel;\n /** @internal */\n plugins?: PluginConfig[];\n}\n"]}
|
||||
@@ -0,0 +1,202 @@
|
||||
import { OperationType, ResourceType } from "./common";
|
||||
import { CosmosDbDiagnosticLevel } from "./diagnostics/CosmosDbDiagnosticLevel";
|
||||
import { DiagnosticNodeInternal } from "./diagnostics/DiagnosticNodeInternal";
|
||||
import { ConsistencyLevel } from "./documents";
|
||||
/**
|
||||
* * This is a Cosmos Diagnostic type that holds collected diagnostic information during a client operations. ie. Item.read(), Container.create().
|
||||
* It has three members -
|
||||
* 1. `clientSideRequestStatistics` member contains aggregate diagnostic information, including -
|
||||
* - metadata lookups. Here all the server requests, apart from the final intended resource are considered as metadata calls.
|
||||
* i.e. for item.read(id), if the client makes server call to discover endpoints it would be considered as metadata call.
|
||||
* - retries
|
||||
* - endpoints contacted.
|
||||
* - request, response payload stats.
|
||||
* - gatewayStatistics - Information corresponding to main operation. For example during Item.read(), the client might perform many operations
|
||||
* i.e. metadata lookup etc, but gatewayStatistics represents the diagnostics information for actual read operation.
|
||||
*
|
||||
* 2. diagnosticNode - Is a tree like structure which captures detailed diagnostic information. By default it is disabled, and is intended to be
|
||||
* used only for debugging on non production environments. The kind of details captured in diagnosticNode is controlled by `CosmosDbDiagnosticLevel`.
|
||||
* - CosmosDbDiagnosticLevel.info - Is default value. In this level only clientSideRequestStatistics are captured. Is is meant for production environments.
|
||||
* - CosmosDbDiagnosticLevel.debug - Captures diagnosticNode and clientConfig. No request and response payloads are captured. Is not meant to be used
|
||||
* in production environment.
|
||||
* - CosmosDbDiagnosticLevel.debug-unsafe - In addition to data captured in CosmosDbDiagnosticLevel.debug, also captures request and response payloads.
|
||||
* Is not meant to be used in production environment.
|
||||
* 3. clientConfig - Captures information related to how client was configured during initialization.
|
||||
*/
|
||||
export declare class CosmosDiagnostics {
|
||||
readonly clientSideRequestStatistics: ClientSideRequestStatistics;
|
||||
readonly diagnosticNode: DiagnosticNode;
|
||||
readonly clientConfig?: ClientConfigDiagnostic;
|
||||
}
|
||||
/**
|
||||
* This type holds information related to initialization of `CosmosClient`
|
||||
*/
|
||||
export type ClientConfigDiagnostic = {
|
||||
/**
|
||||
* End point configured during client initialization.
|
||||
*/
|
||||
endpoint: string;
|
||||
/**
|
||||
* True if `resourceTokens` was supplied during client initialization.
|
||||
*/
|
||||
resourceTokensConfigured: boolean;
|
||||
/**
|
||||
* True if `tokenProvider` was supplied during client initialization.
|
||||
*/
|
||||
tokenProviderConfigured: boolean;
|
||||
/**
|
||||
* True if `aadCredentials` was supplied during client initialization.
|
||||
*/
|
||||
aadCredentialsConfigured: boolean;
|
||||
/**
|
||||
* True if `connectionPolicy` was supplied during client initialization.
|
||||
*/
|
||||
connectionPolicyConfigured: boolean;
|
||||
/**
|
||||
* `consistencyLevel` supplied during client initialization.
|
||||
*/
|
||||
consistencyLevel?: keyof typeof ConsistencyLevel;
|
||||
/**
|
||||
* `defaultHeaders` supplied during client initialization.
|
||||
*/
|
||||
defaultHeaders?: {
|
||||
[key: string]: any;
|
||||
};
|
||||
/**
|
||||
* True if `connectionPolicy` were supplied during client initialization.
|
||||
*/
|
||||
agentConfigured: boolean;
|
||||
/**
|
||||
* `userAgentSuffix` supplied during client initialization.
|
||||
*/
|
||||
userAgentSuffix: string;
|
||||
/**
|
||||
* `diagnosticLevel` supplied during client initialization.
|
||||
*/
|
||||
diagnosticLevel?: CosmosDbDiagnosticLevel;
|
||||
/**
|
||||
* True if `plugins` were supplied during client initialization.
|
||||
*/
|
||||
pluginsConfigured: boolean;
|
||||
/**
|
||||
* SDK version
|
||||
*/
|
||||
sDKVersion: string;
|
||||
};
|
||||
/**
|
||||
* This type contains diagnostic information regarding all metadata request to server during an CosmosDB client operation.
|
||||
*/
|
||||
export type MetadataLookUpDiagnostics = {
|
||||
metadataLookups: MetadataLookUpDiagnostic[];
|
||||
};
|
||||
/**
|
||||
* This type captures diagnostic information regarding retries attempt during an CosmosDB client operation.
|
||||
*/
|
||||
export type RetryDiagnostics = {
|
||||
failedAttempts: FailedRequestAttemptDiagnostic[];
|
||||
};
|
||||
export type GatewayStatistics = {
|
||||
/**
|
||||
* This is the activityId for request, made to server for fetching the requested resource. (As opposed to other potential meta data requests)
|
||||
*/
|
||||
activityId?: string;
|
||||
startTimeUTCInMs: number;
|
||||
durationInMs: number;
|
||||
operationType?: OperationType;
|
||||
resourceType?: ResourceType;
|
||||
statusCode?: number;
|
||||
subStatusCode?: number;
|
||||
requestCharge?: number;
|
||||
requestPayloadLengthInBytes: number;
|
||||
responsePayloadLengthInBytes: number;
|
||||
};
|
||||
/**
|
||||
* This type contains diagnostic information regarding a single metadata request to server.
|
||||
*/
|
||||
export interface MetadataLookUpDiagnostic {
|
||||
activityId: string;
|
||||
startTimeUTCInMs: number;
|
||||
durationInMs: number;
|
||||
operationType?: OperationType;
|
||||
resourceType?: ResourceType;
|
||||
metaDataType: MetadataLookUpType;
|
||||
requestPayloadLengthInBytes: number;
|
||||
responsePayloadLengthInBytes: number;
|
||||
}
|
||||
/**
|
||||
* This type captures diagnostic information regarding a failed request to server api.
|
||||
*/
|
||||
export interface FailedRequestAttemptDiagnostic {
|
||||
attemptNumber: number;
|
||||
activityId: string;
|
||||
startTimeUTCInMs: number;
|
||||
durationInMs: number;
|
||||
operationType?: OperationType;
|
||||
resourceType?: ResourceType;
|
||||
statusCode: number;
|
||||
substatusCode?: number;
|
||||
requestPayloadLengthInBytes: number;
|
||||
responsePayloadLengthInBytes: number;
|
||||
}
|
||||
/**
|
||||
* This is enum for Type of Metadata lookups possible.
|
||||
*/
|
||||
export declare enum MetadataLookUpType {
|
||||
PartitionKeyRangeLookUp = "PARTITION_KEY_RANGE_LOOK_UP",
|
||||
DatabaseAccountLookUp = "DATABASE_ACCOUNT_LOOK_UP",
|
||||
QueryPlanLookUp = "QUERY_PLAN_LOOK_UP",
|
||||
DatabaseLookUp = "DATABASE_LOOK_UP",
|
||||
ContainerLookUp = "CONTAINER_LOOK_UP"
|
||||
}
|
||||
/**
|
||||
* This is a collection type for all client side diagnostic information.
|
||||
*/
|
||||
export type ClientSideRequestStatistics = {
|
||||
/**
|
||||
* This is the UTC timestamp for start of client operation.
|
||||
*/
|
||||
requestStartTimeUTCInMs: number;
|
||||
/**
|
||||
* This is the duration in milli seconds taken by client operation.
|
||||
*/
|
||||
requestDurationInMs: number;
|
||||
/**
|
||||
* This is the list of Location Endpoints contacted during the client operation.
|
||||
*/
|
||||
locationEndpointsContacted: string[];
|
||||
/**
|
||||
* This field captures diagnostic information for retries happened during client operation.
|
||||
*/
|
||||
retryDiagnostics: RetryDiagnostics;
|
||||
/**
|
||||
* This field captures diagnostic information for meta data lookups happened during client operation.
|
||||
*/
|
||||
metadataDiagnostics: MetadataLookUpDiagnostics;
|
||||
/**
|
||||
* These are the statistics for main point look operation.
|
||||
*/
|
||||
gatewayStatistics: GatewayStatistics[];
|
||||
/**
|
||||
* This is the cumulated Request Payload Length n bytes, this includes metadata calls along with the main operation.
|
||||
*/
|
||||
totalRequestPayloadLengthInBytes: number;
|
||||
/**
|
||||
* This is the cumulated Response Payload Length n bytes, this includes metadata calls along with the main operation.
|
||||
*/
|
||||
totalResponsePayloadLengthInBytes: number;
|
||||
};
|
||||
export declare function getRootNode(node: DiagnosticNodeInternal): DiagnosticNodeInternal;
|
||||
/**
|
||||
* Represents a tree like structure, for capturing diagnostic information.
|
||||
*/
|
||||
export interface DiagnosticNode {
|
||||
id: string;
|
||||
nodeType: string;
|
||||
children: DiagnosticNode[];
|
||||
data: {
|
||||
[key: string]: any;
|
||||
};
|
||||
startTimeUTCInMs: number;
|
||||
durationInMs: number;
|
||||
}
|
||||
//# sourceMappingURL=CosmosDiagnostics.d.ts.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"CosmosDiagnostics.d.ts","sourceRoot":"","sources":["../../src/CosmosDiagnostics.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,iBAAiB;IAC5B,SAAgB,2BAA2B,EAAE,2BAA2B,CAAC;IACzE,SAAgB,cAAc,EAAE,cAAc,CAAC;IAC/C,SAAgB,YAAY,CAAC,EAAE,sBAAsB,CAAC;CAavD;AAED;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,wBAAwB,EAAE,OAAO,CAAC;IAClC;;OAEG;IACH,uBAAuB,EAAE,OAAO,CAAC;IACjC;;OAEG;IACH,wBAAwB,EAAE,OAAO,CAAC;IAClC;;OAEG;IACH,0BAA0B,EAAE,OAAO,CAAC;IACpC;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,OAAO,gBAAgB,CAAC;IACjD;;OAEG;IACH,cAAc,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;IACxC;;OAEG;IACH,eAAe,EAAE,OAAO,CAAC;IACzB;;OAEG;IACH,eAAe,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,eAAe,CAAC,EAAE,uBAAuB,CAAC;IAC1C;;OAEG;IACH,iBAAiB,EAAE,OAAO,CAAC;IAC3B;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC,eAAe,EAAE,wBAAwB,EAAE,CAAC;CAC7C,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,cAAc,EAAE,8BAA8B,EAAE,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2BAA2B,EAAE,MAAM,CAAC;IACpC,4BAA4B,EAAE,MAAM,CAAC;CACtC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,YAAY,EAAE,kBAAkB,CAAC;IACjC,2BAA2B,EAAE,MAAM,CAAC;IACpC,4BAA4B,EAAE,MAAM,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,8BAA8B;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2BAA2B,EAAE,MAAM,CAAC;IACpC,4BAA4B,EAAE,MAAM,CAAC;CACtC;AAED;;GAEG;AACH,oBAAY,kBAAkB;IAC5B,uBAAuB,gCAAgC;IACvD,qBAAqB,6BAA6B;IAClD,eAAe,uBAAuB;IACtC,cAAc,qBAAqB;IACnC,eAAe,sBAAsB;CACtC;AAED;;GAEG;AACH,MAAM,MAAM,2BAA2B,GAAG;IACxC;;OAEG;IACH,uBAAuB,EAAE,MAAM,CAAC;IAChC;;OAEG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAC5B;;OAEG;IACH,0BAA0B,EAAE,MAAM,EAAE,CAAC;IACrC;;OAEG;IACH,gBAAgB,EAAE,gBAAgB,CAAC;IACnC;;OAEG;IACH,mBAAmB,EAAE,yBAAyB,CAAC;IAC/C;;OAEG;IACH,iBAAiB,EAAE,iBAAiB,EAAE,CAAC;IACvC;;OAEG;IACH,gCAAgC,EAAE,MAAM,CAAC;IACzC;;OAEG;IACH,iCAAiC,EAAE,MAAM,CAAC;CAC3C,CAAC;AAEF,wBAAgB,WAAW,CAAC,IAAI,EAAE,sBAAsB,GAAG,sBAAsB,CAGhF;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,IAAI,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;CACtB"}
|
||||
@@ -0,0 +1,51 @@
|
||||
// Copyright (c) Microsoft Corporation.
|
||||
// Licensed under the MIT license.
|
||||
/**
|
||||
* * This is a Cosmos Diagnostic type that holds collected diagnostic information during a client operations. ie. Item.read(), Container.create().
|
||||
* It has three members -
|
||||
* 1. `clientSideRequestStatistics` member contains aggregate diagnostic information, including -
|
||||
* - metadata lookups. Here all the server requests, apart from the final intended resource are considered as metadata calls.
|
||||
* i.e. for item.read(id), if the client makes server call to discover endpoints it would be considered as metadata call.
|
||||
* - retries
|
||||
* - endpoints contacted.
|
||||
* - request, response payload stats.
|
||||
* - gatewayStatistics - Information corresponding to main operation. For example during Item.read(), the client might perform many operations
|
||||
* i.e. metadata lookup etc, but gatewayStatistics represents the diagnostics information for actual read operation.
|
||||
*
|
||||
* 2. diagnosticNode - Is a tree like structure which captures detailed diagnostic information. By default it is disabled, and is intended to be
|
||||
* used only for debugging on non production environments. The kind of details captured in diagnosticNode is controlled by `CosmosDbDiagnosticLevel`.
|
||||
* - CosmosDbDiagnosticLevel.info - Is default value. In this level only clientSideRequestStatistics are captured. Is is meant for production environments.
|
||||
* - CosmosDbDiagnosticLevel.debug - Captures diagnosticNode and clientConfig. No request and response payloads are captured. Is not meant to be used
|
||||
* in production environment.
|
||||
* - CosmosDbDiagnosticLevel.debug-unsafe - In addition to data captured in CosmosDbDiagnosticLevel.debug, also captures request and response payloads.
|
||||
* Is not meant to be used in production environment.
|
||||
* 3. clientConfig - Captures information related to how client was configured during initialization.
|
||||
*/
|
||||
export class CosmosDiagnostics {
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
constructor(clientSideRequestStatistics, diagnosticNode, clientConfig) {
|
||||
this.clientSideRequestStatistics = clientSideRequestStatistics;
|
||||
this.diagnosticNode = diagnosticNode;
|
||||
this.clientConfig = clientConfig;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* This is enum for Type of Metadata lookups possible.
|
||||
*/
|
||||
export var MetadataLookUpType;
|
||||
(function (MetadataLookUpType) {
|
||||
MetadataLookUpType["PartitionKeyRangeLookUp"] = "PARTITION_KEY_RANGE_LOOK_UP";
|
||||
MetadataLookUpType["DatabaseAccountLookUp"] = "DATABASE_ACCOUNT_LOOK_UP";
|
||||
MetadataLookUpType["QueryPlanLookUp"] = "QUERY_PLAN_LOOK_UP";
|
||||
MetadataLookUpType["DatabaseLookUp"] = "DATABASE_LOOK_UP";
|
||||
MetadataLookUpType["ContainerLookUp"] = "CONTAINER_LOOK_UP";
|
||||
})(MetadataLookUpType || (MetadataLookUpType = {}));
|
||||
export function getRootNode(node) {
|
||||
if (node.parent)
|
||||
return getRootNode(node.parent);
|
||||
else
|
||||
return node;
|
||||
}
|
||||
//# sourceMappingURL=CosmosDiagnostics.js.map
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,28 @@
|
||||
import { HTTPMethod, ResourceType } from "./common";
|
||||
import { CosmosClientOptions } from "./CosmosClientOptions";
|
||||
import { CosmosHeaders } from "./queryExecutionContext";
|
||||
/** @hidden */
|
||||
export interface RequestInfo {
|
||||
verb: HTTPMethod;
|
||||
path: string;
|
||||
resourceId: string;
|
||||
resourceType: ResourceType;
|
||||
headers: CosmosHeaders;
|
||||
}
|
||||
export type TokenProvider = (requestInfo: RequestInfo) => Promise<string>;
|
||||
/**
|
||||
* @hidden
|
||||
*/
|
||||
export declare function setAuthorizationHeader(clientOptions: CosmosClientOptions, verb: HTTPMethod, path: string, resourceId: string, resourceType: ResourceType, headers: CosmosHeaders): Promise<void>;
|
||||
/**
|
||||
* The default function for setting header token using the masterKey
|
||||
* @hidden
|
||||
*/
|
||||
export declare function setAuthorizationTokenHeaderUsingMasterKey(verb: HTTPMethod, resourceId: string, resourceType: ResourceType, headers: CosmosHeaders, masterKey: string): Promise<void>;
|
||||
/**
|
||||
* @hidden
|
||||
*/
|
||||
export declare function getAuthorizationTokenUsingResourceTokens(resourceTokens: {
|
||||
[resourceId: string]: string;
|
||||
}, path: string, resourceId: string): string;
|
||||
//# sourceMappingURL=auth.d.ts.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/auth.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,UAAU,EACV,YAAY,EAEb,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,cAAc;AACd,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;IAC3B,OAAO,EAAE,aAAa,CAAC;CACxB;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,WAAW,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAE1E;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,aAAa,EAAE,mBAAmB,EAClC,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAED;;;GAGG;AACH,wBAAsB,yCAAyC,CAC7D,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CASf;AAED;;GAEG;AAEH,wBAAgB,wCAAwC,CACtD,cAAc,EAAE;IAAE,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,EAChD,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,GACjB,MAAM,CA+CR"}
|
||||
@@ -0,0 +1,87 @@
|
||||
// Copyright (c) Microsoft Corporation.
|
||||
// Licensed under the MIT license.
|
||||
import { generateHeaders } from "./utils/headers";
|
||||
import { Constants, getResourceIdFromPath, ResourceType, trimSlashFromLeftAndRight, } from "./common";
|
||||
/**
|
||||
* @hidden
|
||||
*/
|
||||
export async function setAuthorizationHeader(clientOptions, verb, path, resourceId, resourceType, headers) {
|
||||
if (clientOptions.permissionFeed) {
|
||||
clientOptions.resourceTokens = {};
|
||||
for (const permission of clientOptions.permissionFeed) {
|
||||
const id = getResourceIdFromPath(permission.resource);
|
||||
if (!id) {
|
||||
throw new Error(`authorization error: ${id} \
|
||||
is an invalid resourceId in permissionFeed`);
|
||||
}
|
||||
clientOptions.resourceTokens[id] = permission._token; // TODO: any
|
||||
}
|
||||
}
|
||||
if (clientOptions.key) {
|
||||
await setAuthorizationTokenHeaderUsingMasterKey(verb, resourceId, resourceType, headers, clientOptions.key);
|
||||
}
|
||||
else if (clientOptions.resourceTokens) {
|
||||
headers[Constants.HttpHeaders.Authorization] = encodeURIComponent(getAuthorizationTokenUsingResourceTokens(clientOptions.resourceTokens, path, resourceId));
|
||||
}
|
||||
else if (clientOptions.tokenProvider) {
|
||||
headers[Constants.HttpHeaders.Authorization] = encodeURIComponent(await clientOptions.tokenProvider({ verb, path, resourceId, resourceType, headers }));
|
||||
}
|
||||
}
|
||||
/**
|
||||
* The default function for setting header token using the masterKey
|
||||
* @hidden
|
||||
*/
|
||||
export async function setAuthorizationTokenHeaderUsingMasterKey(verb, resourceId, resourceType, headers, masterKey) {
|
||||
// TODO This should live in cosmos-sign
|
||||
if (resourceType === ResourceType.offer) {
|
||||
resourceId = resourceId && resourceId.toLowerCase();
|
||||
}
|
||||
headers = Object.assign(headers, await generateHeaders(masterKey, verb, resourceType, resourceId));
|
||||
}
|
||||
/**
|
||||
* @hidden
|
||||
*/
|
||||
// TODO: Resource tokens
|
||||
export function getAuthorizationTokenUsingResourceTokens(resourceTokens, path, resourceId) {
|
||||
if (resourceTokens && Object.keys(resourceTokens).length > 0) {
|
||||
// For database account access(through getDatabaseAccount API), path and resourceId are "",
|
||||
// so in this case we return the first token to be used for creating the auth header as the
|
||||
// service will accept any token in this case
|
||||
if (!path && !resourceId) {
|
||||
return resourceTokens[Object.keys(resourceTokens)[0]];
|
||||
}
|
||||
// If we have exact resource token for the path use it
|
||||
if (resourceId && resourceTokens[resourceId]) {
|
||||
return resourceTokens[resourceId];
|
||||
}
|
||||
// minimum valid path /dbs
|
||||
if (!path || path.length < 4) {
|
||||
// TODO: This should throw an error
|
||||
return null;
|
||||
}
|
||||
path = trimSlashFromLeftAndRight(path);
|
||||
const pathSegments = (path && path.split("/")) || [];
|
||||
// Item path
|
||||
if (pathSegments.length === 6) {
|
||||
// Look for a container token matching the item path
|
||||
const containerPath = pathSegments.slice(0, 4).map(decodeURIComponent).join("/");
|
||||
if (resourceTokens[containerPath]) {
|
||||
return resourceTokens[containerPath];
|
||||
}
|
||||
}
|
||||
// TODO remove in v4: This is legacy behavior that lets someone use a resource token pointing ONLY at an ID
|
||||
// It was used when _rid was exposed by the SDK, but now that we are using user provided ids it is not needed
|
||||
// However removing it now would be a breaking change
|
||||
// if it's an incomplete path like /dbs/db1/colls/, start from the parent resource
|
||||
let index = pathSegments.length % 2 === 0 ? pathSegments.length - 1 : pathSegments.length - 2;
|
||||
for (; index > 0; index -= 2) {
|
||||
const id = decodeURI(pathSegments[index]);
|
||||
if (resourceTokens[id]) {
|
||||
return resourceTokens[id];
|
||||
}
|
||||
}
|
||||
}
|
||||
// TODO: This should throw an error
|
||||
return null;
|
||||
}
|
||||
//# sourceMappingURL=auth.js.map
|
||||
File diff suppressed because one or more lines are too long
+8
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* Enum to specify the resource for which change feed is being fetched.
|
||||
*/
|
||||
export declare enum ChangeFeedResourceType {
|
||||
FeedRange = 0,
|
||||
PartitionKey = 1
|
||||
}
|
||||
//# sourceMappingURL=ChangeFeedEnums.d.ts.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ChangeFeedEnums.d.ts","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ChangeFeedEnums.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,oBAAY,sBAAsB;IAChC,SAAS,IAAA;IACT,YAAY,IAAA;CACb"}
|
||||
@@ -0,0 +1,11 @@
|
||||
// Copyright (c) Microsoft Corporation.
|
||||
// Licensed under the MIT license.
|
||||
/**
|
||||
* Enum to specify the resource for which change feed is being fetched.
|
||||
*/
|
||||
export var ChangeFeedResourceType;
|
||||
(function (ChangeFeedResourceType) {
|
||||
ChangeFeedResourceType[ChangeFeedResourceType["FeedRange"] = 0] = "FeedRange";
|
||||
ChangeFeedResourceType[ChangeFeedResourceType["PartitionKey"] = 1] = "PartitionKey";
|
||||
})(ChangeFeedResourceType || (ChangeFeedResourceType = {}));
|
||||
//# sourceMappingURL=ChangeFeedEnums.js.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ChangeFeedEnums.js","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ChangeFeedEnums.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC;;GAEG;AACH,MAAM,CAAN,IAAY,sBAGX;AAHD,WAAY,sBAAsB;IAChC,6EAAS,CAAA;IACT,mFAAY,CAAA;AACd,CAAC,EAHW,sBAAsB,KAAtB,sBAAsB,QAGjC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * Enum to specify the resource for which change feed is being fetched.\n */\nexport enum ChangeFeedResourceType {\n FeedRange,\n PartitionKey,\n}\n"]}
|
||||
+72
@@ -0,0 +1,72 @@
|
||||
import { ChangeFeedIteratorResponse } from "./ChangeFeedIteratorResponse";
|
||||
import { Resource } from "../../client";
|
||||
import { ChangeFeedPullModelIterator } from "./ChangeFeedPullModelIterator";
|
||||
/**
|
||||
* @hidden
|
||||
* Provides iterator for change feed for entire container or an epk range.
|
||||
*
|
||||
* Use `Items.getChangeFeedIterator()` to get an instance of the iterator.
|
||||
*/
|
||||
export declare class ChangeFeedForEpkRange<T> implements ChangeFeedPullModelIterator<T> {
|
||||
private clientContext;
|
||||
private container;
|
||||
private partitionKeyRangeCache;
|
||||
private resourceId;
|
||||
private resourceLink;
|
||||
private url;
|
||||
private changeFeedOptions;
|
||||
private epkRange;
|
||||
private continuationToken?;
|
||||
private queue;
|
||||
private startTime;
|
||||
private isInstantiated;
|
||||
private rId;
|
||||
private setIteratorRid;
|
||||
private continuationTokenRidMatchContainerRid;
|
||||
private fillChangeFeedQueue;
|
||||
/**
|
||||
* Fill the queue with the feed ranges overlapping with the given epk range.
|
||||
*/
|
||||
private fetchOverLappingFeedRanges;
|
||||
/**
|
||||
* Fill the queue with feed ranges from continuation token
|
||||
*/
|
||||
private fetchContinuationTokenFeedRanges;
|
||||
/**
|
||||
* Change feed is an infinite feed. hasMoreResults is always true.
|
||||
*/
|
||||
get hasMoreResults(): boolean;
|
||||
/**
|
||||
* Gets an async iterator which will yield change feed results.
|
||||
*/
|
||||
getAsyncIterator(): AsyncIterable<ChangeFeedIteratorResponse<Array<T & Resource>>>;
|
||||
/**
|
||||
* Gets an async iterator which will yield pages of results from Azure Cosmos DB.
|
||||
*
|
||||
* Keeps iterating over the feedranges and checks if any feed range has new result. Keeps note of the last feed range which returned non 304 result.
|
||||
*
|
||||
* When same feed range is reached and no new changes are found, a 304 (not Modified) is returned to the end user. Then starts process all over again.
|
||||
*/
|
||||
readNext(): Promise<ChangeFeedIteratorResponse<Array<T & Resource>>>;
|
||||
private generateContinuationToken;
|
||||
/**
|
||||
* Read feed and retrieves the next page of results in Azure Cosmos DB.
|
||||
*/
|
||||
private fetchNext;
|
||||
private checkedAllFeedRanges;
|
||||
/**
|
||||
* Checks whether the current EpkRange is split into multiple ranges or not.
|
||||
*
|
||||
* If yes, it force refreshes the partitionKeyRange cache and enqueue children epk ranges.
|
||||
*/
|
||||
private shouldRetryOnFailure;
|
||||
private handleSplit;
|
||||
/**
|
||||
* Fetch the partitionKeyRangeId for the given feed range.
|
||||
*
|
||||
* This partitionKeyRangeId is passed to queryFeed to fetch the results.
|
||||
*/
|
||||
private getPartitionRangeId;
|
||||
private getFeedResponse;
|
||||
}
|
||||
//# sourceMappingURL=ChangeFeedForEpkRange.d.ts.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ChangeFeedForEpkRange.d.ts","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ChangeFeedForEpkRange.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAI1E,OAAO,EAAa,QAAQ,EAAE,MAAM,cAAc,CAAC;AAInD,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAK5E;;;;;GAKG;AACH,qBAAa,qBAAqB,CAAC,CAAC,CAAE,YAAW,2BAA2B,CAAC,CAAC,CAAC;IAU3E,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,QAAQ;IAhBlB,OAAO,CAAC,iBAAiB,CAAC,CAA6B;IACvD,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,GAAG,CAAS;YAwBN,cAAc;IAK5B,OAAO,CAAC,qCAAqC;YAO/B,mBAAmB;IAWjC;;OAEG;YACW,0BAA0B;IAyBxC;;OAEG;YACW,gCAAgC;IAwC9C;;OAEG;IACH,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED;;OAEG;IACW,gBAAgB,IAAI,aAAa,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAOhG;;;;;;OAMG;IACU,QAAQ,IAAI,OAAO,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAqCjF,OAAO,CAAC,yBAAyB,CAE/B;IAEF;;OAEG;YACW,SAAS;IAgCvB,OAAO,CAAC,oBAAoB;IAW5B;;;;OAIG;YACW,oBAAoB;YA2CpB,WAAW;IA4CzB;;;;OAIG;YACW,mBAAmB;YAuBnB,eAAe;CA4D9B"}
|
||||
+313
@@ -0,0 +1,313 @@
|
||||
import { __asyncGenerator, __await } from "tslib";
|
||||
// Copyright (c) Microsoft Corporation.
|
||||
// Licensed under the MIT license.
|
||||
import { ChangeFeedRange } from "./ChangeFeedRange";
|
||||
import { ChangeFeedIteratorResponse } from "./ChangeFeedIteratorResponse";
|
||||
import { QueryRange } from "../../routing";
|
||||
import { FeedRangeQueue } from "./FeedRangeQueue";
|
||||
import { Constants, SubStatusCodes, StatusCodes, ResourceType } from "../../common";
|
||||
import { ErrorResponse } from "../../request";
|
||||
import { CompositeContinuationToken } from "./CompositeContinuationToken";
|
||||
import { extractOverlappingRanges } from "./changeFeedUtils";
|
||||
import { getEmptyCosmosDiagnostics, withDiagnostics } from "../../utils/diagnostics";
|
||||
/**
|
||||
* @hidden
|
||||
* Provides iterator for change feed for entire container or an epk range.
|
||||
*
|
||||
* Use `Items.getChangeFeedIterator()` to get an instance of the iterator.
|
||||
*/
|
||||
export class ChangeFeedForEpkRange {
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
constructor(clientContext, container, partitionKeyRangeCache, resourceId, resourceLink, url, changeFeedOptions, epkRange) {
|
||||
this.clientContext = clientContext;
|
||||
this.container = container;
|
||||
this.partitionKeyRangeCache = partitionKeyRangeCache;
|
||||
this.resourceId = resourceId;
|
||||
this.resourceLink = resourceLink;
|
||||
this.url = url;
|
||||
this.changeFeedOptions = changeFeedOptions;
|
||||
this.epkRange = epkRange;
|
||||
this.generateContinuationToken = () => {
|
||||
return JSON.stringify(new CompositeContinuationToken(this.rId, this.queue.returnSnapshot()));
|
||||
};
|
||||
this.queue = new FeedRangeQueue();
|
||||
this.continuationToken = changeFeedOptions.continuationToken
|
||||
? JSON.parse(changeFeedOptions.continuationToken)
|
||||
: undefined;
|
||||
this.startTime = changeFeedOptions.startTime
|
||||
? changeFeedOptions.startTime.toUTCString()
|
||||
: undefined;
|
||||
this.isInstantiated = false;
|
||||
}
|
||||
async setIteratorRid(diagnosticNode) {
|
||||
const { resource } = await this.container.readInternal(diagnosticNode);
|
||||
this.rId = resource._rid;
|
||||
}
|
||||
continuationTokenRidMatchContainerRid() {
|
||||
if (this.continuationToken.rid !== this.rId) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
async fillChangeFeedQueue(diagnosticNode) {
|
||||
if (this.continuationToken) {
|
||||
// fill the queue with feed ranges in continuation token.
|
||||
await this.fetchContinuationTokenFeedRanges(diagnosticNode);
|
||||
}
|
||||
else {
|
||||
// fill the queue with feed ranges overlapping the given epk range.
|
||||
await this.fetchOverLappingFeedRanges(diagnosticNode);
|
||||
}
|
||||
this.isInstantiated = true;
|
||||
}
|
||||
/**
|
||||
* Fill the queue with the feed ranges overlapping with the given epk range.
|
||||
*/
|
||||
async fetchOverLappingFeedRanges(diagnosticNode) {
|
||||
try {
|
||||
const overLappingRanges = await this.partitionKeyRangeCache.getOverlappingRanges(this.url, this.epkRange, diagnosticNode);
|
||||
for (const overLappingRange of overLappingRanges) {
|
||||
const [epkMinHeader, epkMaxHeader] = await extractOverlappingRanges(this.epkRange, overLappingRange);
|
||||
const feedRange = new ChangeFeedRange(overLappingRange.minInclusive, overLappingRange.maxExclusive, "", epkMinHeader, epkMaxHeader);
|
||||
this.queue.enqueue(feedRange);
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
throw new ErrorResponse(err.message);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Fill the queue with feed ranges from continuation token
|
||||
*/
|
||||
async fetchContinuationTokenFeedRanges(diagnosticNode) {
|
||||
const contToken = this.continuationToken;
|
||||
if (!this.continuationTokenRidMatchContainerRid()) {
|
||||
throw new ErrorResponse("The continuation token is not for the current container definition");
|
||||
}
|
||||
else {
|
||||
for (const cToken of contToken.Continuation) {
|
||||
const queryRange = new QueryRange(cToken.minInclusive, cToken.maxExclusive, true, false);
|
||||
try {
|
||||
const overLappingRanges = await this.partitionKeyRangeCache.getOverlappingRanges(this.url, queryRange, diagnosticNode);
|
||||
for (const overLappingRange of overLappingRanges) {
|
||||
// check if the epk range present in continuation token entirely covers the overlapping range.
|
||||
// If yes, minInclusive and maxExclusive of the overlapping range will be set.
|
||||
// If no, i.e. there is only partial overlap, epkMinHeader and epkMaxHeader are set as min and max of overlap.
|
||||
// This will be used when we make a call to fetch change feed.
|
||||
const [epkMinHeader, epkMaxHeader] = await extractOverlappingRanges(queryRange, overLappingRange);
|
||||
const feedRange = new ChangeFeedRange(overLappingRange.minInclusive, overLappingRange.maxExclusive, cToken.continuationToken, epkMinHeader, epkMaxHeader);
|
||||
this.queue.enqueue(feedRange);
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
throw new ErrorResponse(err.message);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Change feed is an infinite feed. hasMoreResults is always true.
|
||||
*/
|
||||
get hasMoreResults() {
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
* Gets an async iterator which will yield change feed results.
|
||||
*/
|
||||
getAsyncIterator() {
|
||||
return __asyncGenerator(this, arguments, function* getAsyncIterator_1() {
|
||||
do {
|
||||
const result = yield __await(this.readNext());
|
||||
yield yield __await(result);
|
||||
} while (this.hasMoreResults);
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Gets an async iterator which will yield pages of results from Azure Cosmos DB.
|
||||
*
|
||||
* Keeps iterating over the feedranges and checks if any feed range has new result. Keeps note of the last feed range which returned non 304 result.
|
||||
*
|
||||
* When same feed range is reached and no new changes are found, a 304 (not Modified) is returned to the end user. Then starts process all over again.
|
||||
*/
|
||||
async readNext() {
|
||||
return withDiagnostics(async (diagnosticNode) => {
|
||||
// validate if the internal queue is filled up with feed ranges.
|
||||
if (!this.isInstantiated) {
|
||||
await this.setIteratorRid(diagnosticNode);
|
||||
await this.fillChangeFeedQueue(diagnosticNode);
|
||||
}
|
||||
// stores the last feedRange for which statusCode is not 304 i.e. there were new changes in that feed range.
|
||||
let firstNotModifiedFeedRange = undefined;
|
||||
let result;
|
||||
do {
|
||||
const [processedFeedRange, response] = await this.fetchNext(diagnosticNode);
|
||||
result = response;
|
||||
if (result !== undefined) {
|
||||
{
|
||||
if (firstNotModifiedFeedRange === undefined) {
|
||||
firstNotModifiedFeedRange = processedFeedRange;
|
||||
}
|
||||
// move current feed range to end of queue to fetch result of next feed range.
|
||||
// This is done to fetch changes in breadth first manner and avoid starvation.
|
||||
this.queue.moveFirstElementToTheEnd();
|
||||
// check if there are new results for the given feed range.
|
||||
if (result.statusCode === StatusCodes.Ok) {
|
||||
result.headers[Constants.HttpHeaders.ContinuationToken] =
|
||||
this.generateContinuationToken();
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
} while (!this.checkedAllFeedRanges(firstNotModifiedFeedRange));
|
||||
// set the continuation token after processing.
|
||||
result.headers[Constants.HttpHeaders.ContinuationToken] = this.generateContinuationToken();
|
||||
return result;
|
||||
}, this.clientContext);
|
||||
}
|
||||
/**
|
||||
* Read feed and retrieves the next page of results in Azure Cosmos DB.
|
||||
*/
|
||||
async fetchNext(diagnosticNode) {
|
||||
const feedRange = this.queue.peek();
|
||||
if (feedRange) {
|
||||
// fetch results for feed range at the beginning of the queue.
|
||||
const result = await this.getFeedResponse(feedRange, diagnosticNode);
|
||||
// check if results need to be fetched again depending on status code returned.
|
||||
// Eg. in case of paritionSplit, results need to be fetched for the child partitions.
|
||||
const shouldRetry = await this.shouldRetryOnFailure(feedRange, result, diagnosticNode);
|
||||
if (shouldRetry) {
|
||||
this.queue.dequeue();
|
||||
return this.fetchNext(diagnosticNode);
|
||||
}
|
||||
else {
|
||||
// update the continuation value for the current feed range.
|
||||
const continuationValueForFeedRange = result.headers[Constants.HttpHeaders.ETag];
|
||||
const newFeedRange = this.queue.peek();
|
||||
newFeedRange.continuationToken = continuationValueForFeedRange;
|
||||
return [[newFeedRange.minInclusive, newFeedRange.maxExclusive], result];
|
||||
}
|
||||
}
|
||||
else {
|
||||
return [[undefined, undefined], undefined];
|
||||
}
|
||||
}
|
||||
checkedAllFeedRanges(firstNotModifiedFeedRange) {
|
||||
if (firstNotModifiedFeedRange === undefined) {
|
||||
return false;
|
||||
}
|
||||
const feedRangeQueueFirstElement = this.queue.peek();
|
||||
return (firstNotModifiedFeedRange[0] === (feedRangeQueueFirstElement === null || feedRangeQueueFirstElement === void 0 ? void 0 : feedRangeQueueFirstElement.minInclusive) &&
|
||||
firstNotModifiedFeedRange[1] === (feedRangeQueueFirstElement === null || feedRangeQueueFirstElement === void 0 ? void 0 : feedRangeQueueFirstElement.maxExclusive));
|
||||
}
|
||||
/**
|
||||
* Checks whether the current EpkRange is split into multiple ranges or not.
|
||||
*
|
||||
* If yes, it force refreshes the partitionKeyRange cache and enqueue children epk ranges.
|
||||
*/
|
||||
async shouldRetryOnFailure(feedRange, response, diagnosticNode) {
|
||||
if (response.statusCode === StatusCodes.Ok || response.statusCode === StatusCodes.NotModified) {
|
||||
return false;
|
||||
}
|
||||
const partitionSplit = response.statusCode === StatusCodes.Gone &&
|
||||
(response.subStatusCode === SubStatusCodes.PartitionKeyRangeGone ||
|
||||
response.subStatusCode === SubStatusCodes.CompletingSplit);
|
||||
if (partitionSplit) {
|
||||
const queryRange = new QueryRange(feedRange.minInclusive, feedRange.maxExclusive, true, false);
|
||||
const resolvedRanges = await this.partitionKeyRangeCache.getOverlappingRanges(this.url, queryRange, diagnosticNode, true);
|
||||
if (resolvedRanges.length < 1) {
|
||||
throw new ErrorResponse("Partition split/merge detected but no overlapping ranges found.");
|
||||
}
|
||||
// This covers both cases of merge and split.
|
||||
// resolvedRanges.length > 1 in case of split.
|
||||
// resolvedRanges.length === 1 in case of merge. EpkRange headers will be added in this case.
|
||||
if (resolvedRanges.length >= 1) {
|
||||
await this.handleSplit(false, resolvedRanges, queryRange, feedRange.continuationToken);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
/*
|
||||
* Enqueues all the children feed ranges for the given feed range.
|
||||
*/
|
||||
async handleSplit(shiftLeft, resolvedRanges, oldFeedRange, continuationToken) {
|
||||
let flag = 0;
|
||||
if (shiftLeft) {
|
||||
// This section is only applicable when handleSplit is called by getPartitionRangeId().
|
||||
// used only when existing partition key range cache is used to check for any overlapping ranges.
|
||||
// Modifies the first element with the first overlapping range.
|
||||
const [epkMinHeader, epkMaxHeader] = await extractOverlappingRanges(oldFeedRange, resolvedRanges[0]);
|
||||
const newFeedRange = new ChangeFeedRange(resolvedRanges[0].minInclusive, resolvedRanges[0].maxExclusive, continuationToken, epkMinHeader, epkMaxHeader);
|
||||
this.queue.modifyFirstElement(newFeedRange);
|
||||
flag = 1;
|
||||
}
|
||||
// Enqueue the overlapping ranges.
|
||||
for (let i = flag; i < resolvedRanges.length; i++) {
|
||||
const [epkMinHeader, epkMaxHeader] = await extractOverlappingRanges(oldFeedRange, resolvedRanges[i]);
|
||||
const newFeedRange = new ChangeFeedRange(resolvedRanges[i].minInclusive, resolvedRanges[i].maxExclusive, continuationToken, epkMinHeader, epkMaxHeader);
|
||||
this.queue.enqueue(newFeedRange);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Fetch the partitionKeyRangeId for the given feed range.
|
||||
*
|
||||
* This partitionKeyRangeId is passed to queryFeed to fetch the results.
|
||||
*/
|
||||
async getPartitionRangeId(feedRange, diagnosticNode) {
|
||||
const min = feedRange.epkMinHeader ? feedRange.epkMinHeader : feedRange.minInclusive;
|
||||
const max = feedRange.epkMaxHeader ? feedRange.epkMaxHeader : feedRange.maxExclusive;
|
||||
const queryRange = new QueryRange(min, max, true, false);
|
||||
const resolvedRanges = await this.partitionKeyRangeCache.getOverlappingRanges(this.url, queryRange, diagnosticNode, false);
|
||||
if (resolvedRanges.length < 1) {
|
||||
throw new ErrorResponse("No overlapping ranges found.");
|
||||
}
|
||||
const firstResolvedRange = resolvedRanges[0];
|
||||
if (resolvedRanges.length > 1) {
|
||||
await this.handleSplit(true, resolvedRanges, queryRange, feedRange.continuationToken);
|
||||
}
|
||||
return firstResolvedRange.id;
|
||||
}
|
||||
async getFeedResponse(feedRange, diagnosticNode) {
|
||||
const feedOptions = { initialHeaders: {}, useIncrementalFeed: true };
|
||||
if (typeof this.changeFeedOptions.maxItemCount === "number") {
|
||||
feedOptions.maxItemCount = this.changeFeedOptions.maxItemCount;
|
||||
}
|
||||
if (this.changeFeedOptions.sessionToken) {
|
||||
feedOptions.sessionToken = this.changeFeedOptions.sessionToken;
|
||||
}
|
||||
if (feedRange.continuationToken) {
|
||||
feedOptions.accessCondition = {
|
||||
type: Constants.HttpHeaders.IfNoneMatch,
|
||||
condition: feedRange.continuationToken,
|
||||
};
|
||||
}
|
||||
if (this.startTime) {
|
||||
feedOptions.initialHeaders[Constants.HttpHeaders.IfModifiedSince] = this.startTime;
|
||||
}
|
||||
const rangeId = await this.getPartitionRangeId(feedRange, diagnosticNode);
|
||||
try {
|
||||
// startEpk and endEpk are only valid in case we want to fetch result for a part of partition and not the entire partition.
|
||||
const response = await this.clientContext.queryFeed({
|
||||
path: this.resourceLink,
|
||||
resourceType: ResourceType.item,
|
||||
resourceId: this.resourceId,
|
||||
resultFn: (result) => (result ? result.Documents : []),
|
||||
query: undefined,
|
||||
options: feedOptions,
|
||||
diagnosticNode,
|
||||
partitionKey: undefined,
|
||||
partitionKeyRangeId: rangeId,
|
||||
startEpk: feedRange.epkMinHeader,
|
||||
endEpk: feedRange.epkMaxHeader,
|
||||
});
|
||||
return new ChangeFeedIteratorResponse(response.result, response.result ? response.result.length : 0, response.code, response.headers, getEmptyCosmosDiagnostics());
|
||||
}
|
||||
catch (err) {
|
||||
// If any errors are encountered, eg. partition split or gone, handle it based on error code and not break the flow.
|
||||
return new ChangeFeedIteratorResponse([], 0, err.code, err.headers, getEmptyCosmosDiagnostics(), err.substatus);
|
||||
}
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=ChangeFeedForEpkRange.js.map
|
||||
+1
File diff suppressed because one or more lines are too long
Vendored
+42
@@ -0,0 +1,42 @@
|
||||
import { ChangeFeedIteratorResponse } from "./ChangeFeedIteratorResponse";
|
||||
import { Resource } from "../../client";
|
||||
import { ChangeFeedPullModelIterator } from "./ChangeFeedPullModelIterator";
|
||||
/**
|
||||
* @hidden
|
||||
* Provides iterator for change feed for one partition key.
|
||||
*
|
||||
* Use `Items.getChangeFeedIterator()` to get an instance of the iterator.
|
||||
*/
|
||||
export declare class ChangeFeedForPartitionKey<T> implements ChangeFeedPullModelIterator<T> {
|
||||
private clientContext;
|
||||
private container;
|
||||
private resourceId;
|
||||
private resourceLink;
|
||||
private partitionKey;
|
||||
private changeFeedOptions;
|
||||
private continuationToken;
|
||||
private startTime;
|
||||
private rId;
|
||||
private isInstantiated;
|
||||
private instantiateIterator;
|
||||
private continuationTokenRidMatchContainerRid;
|
||||
private setIteratorRid;
|
||||
/**
|
||||
* Change feed is an infinite feed. hasMoreResults is always true.
|
||||
*/
|
||||
get hasMoreResults(): boolean;
|
||||
/**
|
||||
* Gets an async iterator which will yield change feed results.
|
||||
*/
|
||||
getAsyncIterator(): AsyncIterable<ChangeFeedIteratorResponse<Array<T & Resource>>>;
|
||||
/**
|
||||
* Returns the result of change feed from Azure Cosmos DB.
|
||||
*/
|
||||
readNext(): Promise<ChangeFeedIteratorResponse<Array<T & Resource>>>;
|
||||
/**
|
||||
* Read feed and retrieves the next set of results in Azure Cosmos DB.
|
||||
*/
|
||||
private fetchNext;
|
||||
private getFeedResponse;
|
||||
}
|
||||
//# sourceMappingURL=ChangeFeedForPartitionKey.d.ts.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ChangeFeedForPartitionKey.d.ts","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ChangeFeedForPartitionKey.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAa,QAAQ,EAAE,MAAM,cAAc,CAAC;AAKnD,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAI5E;;;;;GAKG;AACH,qBAAa,yBAAyB,CAAC,CAAC,CAAE,YAAW,2BAA2B,CAAC,CAAC,CAAC;IAS/E,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,iBAAiB;IAb3B,OAAO,CAAC,iBAAiB,CAAmC;IAC5D,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,cAAc,CAAU;YAsBlB,mBAAmB;IAiBjC,OAAO,CAAC,qCAAqC;YAO/B,cAAc;IAK5B;;OAEG;IACH,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED;;OAEG;IACW,gBAAgB,IAAI,aAAa,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAOhG;;OAEG;IACU,QAAQ,IAAI,OAAO,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAUjF;;OAEG;YACW,SAAS;YAWT,eAAe;CA4C9B"}
|
||||
+123
@@ -0,0 +1,123 @@
|
||||
import { __asyncGenerator, __await } from "tslib";
|
||||
import { ChangeFeedIteratorResponse } from "./ChangeFeedIteratorResponse";
|
||||
import { Constants, ResourceType } from "../../common";
|
||||
import { ErrorResponse } from "../../request";
|
||||
import { ContinuationTokenForPartitionKey } from "./ContinuationTokenForPartitionKey";
|
||||
import { getEmptyCosmosDiagnostics, withDiagnostics } from "../../utils/diagnostics";
|
||||
/**
|
||||
* @hidden
|
||||
* Provides iterator for change feed for one partition key.
|
||||
*
|
||||
* Use `Items.getChangeFeedIterator()` to get an instance of the iterator.
|
||||
*/
|
||||
export class ChangeFeedForPartitionKey {
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
constructor(clientContext, container, resourceId, resourceLink, partitionKey, changeFeedOptions) {
|
||||
this.clientContext = clientContext;
|
||||
this.container = container;
|
||||
this.resourceId = resourceId;
|
||||
this.resourceLink = resourceLink;
|
||||
this.partitionKey = partitionKey;
|
||||
this.changeFeedOptions = changeFeedOptions;
|
||||
this.continuationToken = changeFeedOptions.continuationToken
|
||||
? JSON.parse(changeFeedOptions.continuationToken)
|
||||
: undefined;
|
||||
this.isInstantiated = false;
|
||||
if (changeFeedOptions.startTime) {
|
||||
this.startTime = changeFeedOptions.startTime.toUTCString();
|
||||
}
|
||||
}
|
||||
async instantiateIterator(diagnosticNode) {
|
||||
await this.setIteratorRid(diagnosticNode);
|
||||
if (this.continuationToken) {
|
||||
if (!this.continuationTokenRidMatchContainerRid()) {
|
||||
throw new ErrorResponse("The continuation is not for the current container definition.");
|
||||
}
|
||||
}
|
||||
else {
|
||||
this.continuationToken = new ContinuationTokenForPartitionKey(this.rId, this.partitionKey, "");
|
||||
}
|
||||
this.isInstantiated = true;
|
||||
}
|
||||
continuationTokenRidMatchContainerRid() {
|
||||
if (this.continuationToken.rid !== this.rId) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
async setIteratorRid(diagnosticNode) {
|
||||
const { resource } = await this.container.readInternal(diagnosticNode);
|
||||
this.rId = resource._rid;
|
||||
}
|
||||
/**
|
||||
* Change feed is an infinite feed. hasMoreResults is always true.
|
||||
*/
|
||||
get hasMoreResults() {
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
* Gets an async iterator which will yield change feed results.
|
||||
*/
|
||||
getAsyncIterator() {
|
||||
return __asyncGenerator(this, arguments, function* getAsyncIterator_1() {
|
||||
do {
|
||||
const result = yield __await(this.readNext());
|
||||
yield yield __await(result);
|
||||
} while (this.hasMoreResults);
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Returns the result of change feed from Azure Cosmos DB.
|
||||
*/
|
||||
async readNext() {
|
||||
return withDiagnostics(async (diagnosticNode) => {
|
||||
if (!this.isInstantiated) {
|
||||
await this.instantiateIterator(diagnosticNode);
|
||||
}
|
||||
const result = await this.fetchNext(diagnosticNode);
|
||||
return result;
|
||||
}, this.clientContext);
|
||||
}
|
||||
/**
|
||||
* Read feed and retrieves the next set of results in Azure Cosmos DB.
|
||||
*/
|
||||
async fetchNext(diagnosticNode) {
|
||||
const response = await this.getFeedResponse(diagnosticNode);
|
||||
this.continuationToken.Continuation = response.headers[Constants.HttpHeaders.ETag];
|
||||
response.headers[Constants.HttpHeaders.ContinuationToken] = JSON.stringify(this.continuationToken);
|
||||
return response;
|
||||
}
|
||||
async getFeedResponse(diagnosticNode) {
|
||||
const feedOptions = { initialHeaders: {}, useIncrementalFeed: true };
|
||||
if (typeof this.changeFeedOptions.maxItemCount === "number") {
|
||||
feedOptions.maxItemCount = this.changeFeedOptions.maxItemCount;
|
||||
}
|
||||
if (this.changeFeedOptions.sessionToken) {
|
||||
feedOptions.sessionToken = this.changeFeedOptions.sessionToken;
|
||||
}
|
||||
const continuation = this.continuationToken.Continuation;
|
||||
if (continuation) {
|
||||
feedOptions.accessCondition = {
|
||||
type: Constants.HttpHeaders.IfNoneMatch,
|
||||
condition: continuation,
|
||||
};
|
||||
}
|
||||
if (this.startTime) {
|
||||
feedOptions.initialHeaders[Constants.HttpHeaders.IfModifiedSince] = this.startTime;
|
||||
}
|
||||
const response = await this.clientContext.queryFeed({
|
||||
path: this.resourceLink,
|
||||
resourceType: ResourceType.item,
|
||||
resourceId: this.resourceId,
|
||||
resultFn: (result) => (result ? result.Documents : []),
|
||||
diagnosticNode,
|
||||
query: undefined,
|
||||
options: feedOptions,
|
||||
partitionKey: this.partitionKey,
|
||||
});
|
||||
return new ChangeFeedIteratorResponse(response.result, response.result ? response.result.length : 0, response.code, response.headers, getEmptyCosmosDiagnostics());
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=ChangeFeedForPartitionKey.js.map
|
||||
+1
File diff suppressed because one or more lines are too long
Vendored
+21
@@ -0,0 +1,21 @@
|
||||
import { ChangeFeedStartFrom } from "./ChangeFeedStartFrom";
|
||||
/**
|
||||
* Specifies options for the change feed
|
||||
*
|
||||
* If none of those options are set, it will start reading changes from now for the entire container.
|
||||
*/
|
||||
export interface ChangeFeedIteratorOptions {
|
||||
/**
|
||||
* Max amount of items to return per page
|
||||
*/
|
||||
maxItemCount?: number;
|
||||
/**
|
||||
* The session token to use. If not specified, will use the most recent captured session token to start with.
|
||||
*/
|
||||
sessionToken?: string;
|
||||
/**
|
||||
* Signals where to start from in the change feed.
|
||||
*/
|
||||
changeFeedStartFrom?: ChangeFeedStartFrom;
|
||||
}
|
||||
//# sourceMappingURL=ChangeFeedIteratorOptions.d.ts.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ChangeFeedIteratorOptions.d.ts","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ChangeFeedIteratorOptions.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D;;;;GAIG;AACH,MAAM,WAAW,yBAAyB;IACxC;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;CAC3C"}
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
// Copyright (c) Microsoft Corporation.
|
||||
// Licensed under the MIT license.
|
||||
export {};
|
||||
//# sourceMappingURL=ChangeFeedIteratorOptions.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ChangeFeedIteratorOptions.js","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ChangeFeedIteratorOptions.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { ChangeFeedStartFrom } from \"./ChangeFeedStartFrom\";\n\n/**\n * Specifies options for the change feed\n *\n * If none of those options are set, it will start reading changes from now for the entire container.\n */\nexport interface ChangeFeedIteratorOptions {\n /**\n * Max amount of items to return per page\n */\n maxItemCount?: number;\n /**\n * The session token to use. If not specified, will use the most recent captured session token to start with.\n */\n sessionToken?: string;\n /**\n * Signals where to start from in the change feed.\n */\n changeFeedStartFrom?: ChangeFeedStartFrom;\n}\n"]}
|
||||
Vendored
+48
@@ -0,0 +1,48 @@
|
||||
import { CosmosDiagnostics } from "../../CosmosDiagnostics";
|
||||
import { CosmosHeaders } from "../../queryExecutionContext";
|
||||
/**
|
||||
* A single response page from the Azure Cosmos DB Change Feed
|
||||
*/
|
||||
export declare class ChangeFeedIteratorResponse<T> {
|
||||
/**
|
||||
* Gets the items returned in the response from Azure Cosmos DB
|
||||
*/
|
||||
readonly result: T;
|
||||
/**
|
||||
* Gets the number of items returned in the response from Azure Cosmos DB
|
||||
*/
|
||||
readonly count: number;
|
||||
/**
|
||||
* Gets the status code of the response from Azure Cosmos DB
|
||||
*/
|
||||
readonly statusCode: number;
|
||||
/**
|
||||
* Cosmos Diagnostic Object.
|
||||
*/
|
||||
readonly diagnostics: CosmosDiagnostics;
|
||||
/**
|
||||
* Gets the subStatusCodes of the response from Azure Cosmos DB. Useful in partition split or partition gone.
|
||||
*/
|
||||
readonly subStatusCode?: number;
|
||||
/**
|
||||
* Gets the request charge for this request from the Azure Cosmos DB service.
|
||||
*/
|
||||
get requestCharge(): number;
|
||||
/**
|
||||
* Gets the activity ID for the request from the Azure Cosmos DB service.
|
||||
*/
|
||||
get activityId(): string;
|
||||
/**
|
||||
* Gets the continuation token to be used for continuing enumeration of the Azure Cosmos DB service.
|
||||
*/
|
||||
get continuationToken(): string;
|
||||
/**
|
||||
* Gets the session token for use in session consistency reads from the Azure Cosmos DB service.
|
||||
*/
|
||||
get sessionToken(): string;
|
||||
/**
|
||||
* Response headers of the response from Azure Cosmos DB
|
||||
*/
|
||||
headers: CosmosHeaders;
|
||||
}
|
||||
//# sourceMappingURL=ChangeFeedIteratorResponse.d.ts.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ChangeFeedIteratorResponse.d.ts","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ChangeFeedIteratorResponse.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D;;GAEG;AACH,qBAAa,0BAA0B,CAAC,CAAC;IAKrC;;OAEG;aACa,MAAM,EAAE,CAAC;IACzB;;OAEG;aACa,KAAK,EAAE,MAAM;IAC7B;;OAEG;aACa,UAAU,EAAE,MAAM;IAKlC;;OAEG;aACa,WAAW,EAAE,iBAAiB;IAC9C;;OAEG;aACa,aAAa,CAAC,EAAE,MAAM;IAKxC;;OAEG;IACH,IAAW,aAAa,IAAI,MAAM,CAGjC;IAED;;OAEG;IACH,IAAW,UAAU,IAAI,MAAM,CAE9B;IAED;;OAEG;IACH,IAAW,iBAAiB,IAAI,MAAM,CAErC;IACD;;OAEG;IACH,IAAW,YAAY,IAAI,MAAM,CAEhC;IACD;;OAEG;IACI,OAAO,EAAE,aAAa,CAAC;CAC/B"}
|
||||
+67
@@ -0,0 +1,67 @@
|
||||
import { Constants } from "../../common";
|
||||
/**
|
||||
* A single response page from the Azure Cosmos DB Change Feed
|
||||
*/
|
||||
export class ChangeFeedIteratorResponse {
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
constructor(
|
||||
/**
|
||||
* Gets the items returned in the response from Azure Cosmos DB
|
||||
*/
|
||||
result,
|
||||
/**
|
||||
* Gets the number of items returned in the response from Azure Cosmos DB
|
||||
*/
|
||||
count,
|
||||
/**
|
||||
* Gets the status code of the response from Azure Cosmos DB
|
||||
*/
|
||||
statusCode,
|
||||
/**
|
||||
* Headers related to cosmos DB and change feed.
|
||||
*/
|
||||
headers,
|
||||
/**
|
||||
* Cosmos Diagnostic Object.
|
||||
*/
|
||||
diagnostics,
|
||||
/**
|
||||
* Gets the subStatusCodes of the response from Azure Cosmos DB. Useful in partition split or partition gone.
|
||||
*/
|
||||
subStatusCode) {
|
||||
this.result = result;
|
||||
this.count = count;
|
||||
this.statusCode = statusCode;
|
||||
this.diagnostics = diagnostics;
|
||||
this.subStatusCode = subStatusCode;
|
||||
this.headers = headers;
|
||||
}
|
||||
/**
|
||||
* Gets the request charge for this request from the Azure Cosmos DB service.
|
||||
*/
|
||||
get requestCharge() {
|
||||
const rus = this.headers[Constants.HttpHeaders.RequestCharge];
|
||||
return rus ? parseInt(rus, 10) : null;
|
||||
}
|
||||
/**
|
||||
* Gets the activity ID for the request from the Azure Cosmos DB service.
|
||||
*/
|
||||
get activityId() {
|
||||
return this.headers[Constants.HttpHeaders.ActivityId];
|
||||
}
|
||||
/**
|
||||
* Gets the continuation token to be used for continuing enumeration of the Azure Cosmos DB service.
|
||||
*/
|
||||
get continuationToken() {
|
||||
return this.headers[Constants.HttpHeaders.ContinuationToken];
|
||||
}
|
||||
/**
|
||||
* Gets the session token for use in session consistency reads from the Azure Cosmos DB service.
|
||||
*/
|
||||
get sessionToken() {
|
||||
return this.headers[Constants.HttpHeaders.SessionToken];
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=ChangeFeedIteratorResponse.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ChangeFeedIteratorResponse.js","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ChangeFeedIteratorResponse.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC;;GAEG;AACH,MAAM,OAAO,0BAA0B;IACrC;;OAEG;IACH;IACE;;OAEG;IACa,MAAS;IACzB;;OAEG;IACa,KAAa;IAC7B;;OAEG;IACa,UAAkB;IAClC;;OAEG;IACH,OAAsB;IACtB;;OAEG;IACa,WAA8B;IAC9C;;OAEG;IACa,aAAsB;QApBtB,WAAM,GAAN,MAAM,CAAG;QAIT,UAAK,GAAL,KAAK,CAAQ;QAIb,eAAU,GAAV,UAAU,CAAQ;QAQlB,gBAAW,GAAX,WAAW,CAAmB;QAI9B,kBAAa,GAAb,aAAa,CAAS;QAEtC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,IAAW,aAAa;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;QAC9D,OAAO,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC;IAED;;OAEG;IACH,IAAW,iBAAiB;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;IAC/D,CAAC;IACD;;OAEG;IACH,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IAC1D,CAAC;CAKF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nimport { CosmosDiagnostics } from \"../../CosmosDiagnostics\";\nimport { Constants } from \"../../common\";\nimport { CosmosHeaders } from \"../../queryExecutionContext\";\n\n/**\n * A single response page from the Azure Cosmos DB Change Feed\n */\nexport class ChangeFeedIteratorResponse<T> {\n /**\n * @internal\n */\n constructor(\n /**\n * Gets the items returned in the response from Azure Cosmos DB\n */\n public readonly result: T,\n /**\n * Gets the number of items returned in the response from Azure Cosmos DB\n */\n public readonly count: number,\n /**\n * Gets the status code of the response from Azure Cosmos DB\n */\n public readonly statusCode: number,\n /**\n * Headers related to cosmos DB and change feed.\n */\n headers: CosmosHeaders,\n /**\n * Cosmos Diagnostic Object.\n */\n public readonly diagnostics: CosmosDiagnostics,\n /**\n * Gets the subStatusCodes of the response from Azure Cosmos DB. Useful in partition split or partition gone.\n */\n public readonly subStatusCode?: number,\n ) {\n this.headers = headers;\n }\n\n /**\n * Gets the request charge for this request from the Azure Cosmos DB service.\n */\n public get requestCharge(): number {\n const rus = this.headers[Constants.HttpHeaders.RequestCharge];\n return rus ? parseInt(rus, 10) : null;\n }\n\n /**\n * Gets the activity ID for the request from the Azure Cosmos DB service.\n */\n public get activityId(): string {\n return this.headers[Constants.HttpHeaders.ActivityId];\n }\n\n /**\n * Gets the continuation token to be used for continuing enumeration of the Azure Cosmos DB service.\n */\n public get continuationToken(): string {\n return this.headers[Constants.HttpHeaders.ContinuationToken];\n }\n /**\n * Gets the session token for use in session consistency reads from the Azure Cosmos DB service.\n */\n public get sessionToken(): string {\n return this.headers[Constants.HttpHeaders.SessionToken];\n }\n /**\n * Response headers of the response from Azure Cosmos DB\n */\n public headers: CosmosHeaders;\n}\n"]}
|
||||
Vendored
+27
@@ -0,0 +1,27 @@
|
||||
import { Resource } from "../Resource";
|
||||
import { ChangeFeedIteratorResponse } from "./ChangeFeedIteratorResponse";
|
||||
/**
|
||||
* Use `Items.getChangeFeedIterator()` to return an iterator that can iterate over all the changes for a partition key, feed range or an entire container.
|
||||
*/
|
||||
export interface ChangeFeedPullModelIterator<T> {
|
||||
/**
|
||||
* Always returns true, changefeed is an infinite stream.
|
||||
*/
|
||||
readonly hasMoreResults: boolean;
|
||||
/**
|
||||
* Returns next set of results for the change feed.
|
||||
*/
|
||||
readNext(): Promise<ChangeFeedIteratorResponse<Array<T & Resource>>>;
|
||||
/**
|
||||
* Gets an async iterator which will yield change feed results.
|
||||
* @example Get changefeed for an entire container from now
|
||||
* ```typescript
|
||||
* const options = { changeFeedStartFrom: ChangeFeedStartFrom.Now() };
|
||||
* for await(const res of container.items.getChangeFeedIterator(options).getAsyncIterator()) {
|
||||
* //process res
|
||||
* }
|
||||
* ```
|
||||
*/
|
||||
getAsyncIterator(): AsyncIterable<ChangeFeedIteratorResponse<Array<T & Resource>>>;
|
||||
}
|
||||
//# sourceMappingURL=ChangeFeedPullModelIterator.d.ts.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ChangeFeedPullModelIterator.d.ts","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ChangeFeedPullModelIterator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E;;GAEG;AACH,MAAM,WAAW,2BAA2B,CAAC,CAAC;IAC5C;;OAEG;IACH,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC;;OAEG;IACH,QAAQ,IAAI,OAAO,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACrE;;;;;;;;;OASG;IACH,gBAAgB,IAAI,aAAa,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;CACpF"}
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
export {};
|
||||
//# sourceMappingURL=ChangeFeedPullModelIterator.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ChangeFeedPullModelIterator.js","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ChangeFeedPullModelIterator.ts"],"names":[],"mappings":"","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nimport { Resource } from \"../Resource\";\nimport { ChangeFeedIteratorResponse } from \"./ChangeFeedIteratorResponse\";\n/**\n * Use `Items.getChangeFeedIterator()` to return an iterator that can iterate over all the changes for a partition key, feed range or an entire container.\n */\nexport interface ChangeFeedPullModelIterator<T> {\n /**\n * Always returns true, changefeed is an infinite stream.\n */\n readonly hasMoreResults: boolean;\n /**\n * Returns next set of results for the change feed.\n */\n readNext(): Promise<ChangeFeedIteratorResponse<Array<T & Resource>>>;\n /**\n * Gets an async iterator which will yield change feed results.\n * @example Get changefeed for an entire container from now\n * ```typescript\n * const options = { changeFeedStartFrom: ChangeFeedStartFrom.Now() };\n * for await(const res of container.items.getChangeFeedIterator(options).getAsyncIterator()) {\n * //process res\n * }\n * ```\n */\n getAsyncIterator(): AsyncIterable<ChangeFeedIteratorResponse<Array<T & Resource>>>;\n}\n"]}
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
export {};
|
||||
//# sourceMappingURL=ChangeFeedRange.d.ts.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ChangeFeedRange.d.ts","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ChangeFeedRange.ts"],"names":[],"mappings":""}
|
||||
@@ -0,0 +1,16 @@
|
||||
// Copyright (c) Microsoft Corporation.
|
||||
// Licensed under the MIT license.
|
||||
/**
|
||||
* @internal
|
||||
* FeedRange for which change feed is being requested.
|
||||
*/
|
||||
export class ChangeFeedRange {
|
||||
constructor(minInclusive, maxExclusive, continuationToken, epkMinHeader, epkMaxHeader) {
|
||||
this.minInclusive = minInclusive;
|
||||
this.maxExclusive = maxExclusive;
|
||||
this.continuationToken = continuationToken;
|
||||
this.epkMinHeader = epkMinHeader;
|
||||
this.epkMaxHeader = epkMaxHeader;
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=ChangeFeedRange.js.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ChangeFeedRange.js","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ChangeFeedRange.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAClC;;;GAGG;AACH,MAAM,OAAO,eAAe;IAsB1B,YACE,YAAoB,EACpB,YAAoB,EACpB,iBAA0B,EAC1B,YAAqB,EACrB,YAAqB;QAErB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAC3C,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/**\n * @internal\n * FeedRange for which change feed is being requested.\n */\nexport class ChangeFeedRange {\n /**\n * Min value for the range.\n */\n public minInclusive: string;\n /**\n * Max value for the range.\n */\n public maxExclusive: string;\n /**\n * Continuation token from where to start reading changes.\n */\n public continuationToken?: string;\n /**\n * Min epk value to begin reading changes from in case changefeed of entire partition is not requested.\n */\n public epkMinHeader?: string;\n /**\n * Max epk value to begin reading changes from in case changefeed of entire partition is not requested.\n */\n public epkMaxHeader?: string;\n\n constructor(\n minInclusive: string,\n maxExclusive: string,\n continuationToken?: string,\n epkMinHeader?: string,\n epkMaxHeader?: string,\n ) {\n this.minInclusive = minInclusive;\n this.maxExclusive = maxExclusive;\n this.continuationToken = continuationToken;\n this.epkMinHeader = epkMinHeader;\n this.epkMaxHeader = epkMaxHeader;\n }\n}\n"]}
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
import { PartitionKey } from "../../documents";
|
||||
import { FeedRange } from "./FeedRange";
|
||||
import { ChangeFeedStartFromNow } from "./ChangeFeedStartFromNow";
|
||||
import { ChangeFeedStartFromBeginning } from "./ChangeFeedStartFromBeginning";
|
||||
import { ChangeFeedStartFromTime } from "./ChangeFeedStartFromTime";
|
||||
import { ChangeFeedStartFromContinuation } from "./ChangeFeedStartFromContinuation";
|
||||
/**
|
||||
* Base class for where to start a ChangeFeedIterator.
|
||||
*/
|
||||
export declare abstract class ChangeFeedStartFrom {
|
||||
/**
|
||||
* Returns an object that tells the ChangeFeedIterator to start from the beginning of time.
|
||||
* @param cfResource - PartitionKey or FeedRange for which changes are to be fetched. Leave blank for fetching changes for entire container.
|
||||
*/
|
||||
static Beginning(cfResource?: PartitionKey | FeedRange): ChangeFeedStartFromBeginning;
|
||||
/**
|
||||
* Returns an object that tells the ChangeFeedIterator to start reading changes from this moment onward.
|
||||
* @param cfResource - PartitionKey or FeedRange for which changes are to be fetched. Leave blank for fetching changes for entire container.
|
||||
**/
|
||||
static Now(cfResource?: PartitionKey | FeedRange): ChangeFeedStartFromNow;
|
||||
/**
|
||||
* Returns an object that tells the ChangeFeedIterator to start reading changes from some point in time onward.
|
||||
* @param startTime - Date object specfiying the time to start reading changes from.
|
||||
* @param cfResource - PartitionKey or FeedRange for which changes are to be fetched. Leave blank for fetching changes for entire container.
|
||||
*/
|
||||
static Time(startTime: Date, cfResource?: PartitionKey | FeedRange): ChangeFeedStartFromTime;
|
||||
/**
|
||||
* Returns an object that tells the ChangeFeedIterator to start reading changes from a save point.
|
||||
* @param continuation - The continuation to resume from.
|
||||
*/
|
||||
static Continuation(continuationToken: string): ChangeFeedStartFromContinuation;
|
||||
}
|
||||
//# sourceMappingURL=ChangeFeedStartFrom.d.ts.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ChangeFeedStartFrom.d.ts","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ChangeFeedStartFrom.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AAIpF;;GAEG;AAEH,8BAAsB,mBAAmB;IACvC;;;OAGG;WACW,SAAS,CAAC,UAAU,CAAC,EAAE,YAAY,GAAG,SAAS,GAAG,4BAA4B;IAG5F;;;QAGI;WACU,GAAG,CAAC,UAAU,CAAC,EAAE,YAAY,GAAG,SAAS,GAAG,sBAAsB;IAGhF;;;;OAIG;WACW,IAAI,CAChB,SAAS,EAAE,IAAI,EACf,UAAU,CAAC,EAAE,YAAY,GAAG,SAAS,GACpC,uBAAuB;IAU1B;;;OAGG;WACW,YAAY,CAAC,iBAAiB,EAAE,MAAM,GAAG,+BAA+B;CASvF"}
|
||||
+56
@@ -0,0 +1,56 @@
|
||||
import { ChangeFeedStartFromNow } from "./ChangeFeedStartFromNow";
|
||||
import { ChangeFeedStartFromBeginning } from "./ChangeFeedStartFromBeginning";
|
||||
import { ChangeFeedStartFromTime } from "./ChangeFeedStartFromTime";
|
||||
import { ChangeFeedStartFromContinuation } from "./ChangeFeedStartFromContinuation";
|
||||
import { ErrorResponse } from "../../request/ErrorResponse";
|
||||
import { isNullOrEmpty } from "./changeFeedUtils";
|
||||
/**
|
||||
* Base class for where to start a ChangeFeedIterator.
|
||||
*/
|
||||
/* eslint-disable @typescript-eslint/no-extraneous-class */
|
||||
export class ChangeFeedStartFrom {
|
||||
/**
|
||||
* Returns an object that tells the ChangeFeedIterator to start from the beginning of time.
|
||||
* @param cfResource - PartitionKey or FeedRange for which changes are to be fetched. Leave blank for fetching changes for entire container.
|
||||
*/
|
||||
static Beginning(cfResource) {
|
||||
return new ChangeFeedStartFromBeginning(cfResource);
|
||||
}
|
||||
/**
|
||||
* Returns an object that tells the ChangeFeedIterator to start reading changes from this moment onward.
|
||||
* @param cfResource - PartitionKey or FeedRange for which changes are to be fetched. Leave blank for fetching changes for entire container.
|
||||
**/
|
||||
static Now(cfResource) {
|
||||
return new ChangeFeedStartFromNow(cfResource);
|
||||
}
|
||||
/**
|
||||
* Returns an object that tells the ChangeFeedIterator to start reading changes from some point in time onward.
|
||||
* @param startTime - Date object specfiying the time to start reading changes from.
|
||||
* @param cfResource - PartitionKey or FeedRange for which changes are to be fetched. Leave blank for fetching changes for entire container.
|
||||
*/
|
||||
static Time(startTime, cfResource) {
|
||||
if (!startTime) {
|
||||
throw new ErrorResponse("startTime must be present");
|
||||
}
|
||||
if (startTime instanceof Date === true) {
|
||||
return new ChangeFeedStartFromTime(startTime, cfResource);
|
||||
}
|
||||
else {
|
||||
throw new ErrorResponse("startTime must be a Date object.");
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Returns an object that tells the ChangeFeedIterator to start reading changes from a save point.
|
||||
* @param continuation - The continuation to resume from.
|
||||
*/
|
||||
static Continuation(continuationToken) {
|
||||
if (!continuationToken) {
|
||||
throw new ErrorResponse("Argument continuation must be passed.");
|
||||
}
|
||||
if (isNullOrEmpty(continuationToken)) {
|
||||
throw new ErrorResponse("Argument continuationToken must be a non-empty string.");
|
||||
}
|
||||
return new ChangeFeedStartFromContinuation(continuationToken);
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=ChangeFeedStartFrom.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ChangeFeedStartFrom.js","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ChangeFeedStartFrom.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD;;GAEG;AACH,2DAA2D;AAC3D,MAAM,OAAgB,mBAAmB;IACvC;;;OAGG;IACI,MAAM,CAAC,SAAS,CAAC,UAAqC;QAC3D,OAAO,IAAI,4BAA4B,CAAC,UAAU,CAAC,CAAC;IACtD,CAAC;IACD;;;QAGI;IACG,MAAM,CAAC,GAAG,CAAC,UAAqC;QACrD,OAAO,IAAI,sBAAsB,CAAC,UAAU,CAAC,CAAC;IAChD,CAAC;IACD;;;;OAIG;IACI,MAAM,CAAC,IAAI,CAChB,SAAe,EACf,UAAqC;QAErC,IAAI,CAAC,SAAS,EAAE;YACd,MAAM,IAAI,aAAa,CAAC,2BAA2B,CAAC,CAAC;SACtD;QACD,IAAI,SAAS,YAAY,IAAI,KAAK,IAAI,EAAE;YACtC,OAAO,IAAI,uBAAuB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;SAC3D;aAAM;YACL,MAAM,IAAI,aAAa,CAAC,kCAAkC,CAAC,CAAC;SAC7D;IACH,CAAC;IACD;;;OAGG;IACI,MAAM,CAAC,YAAY,CAAC,iBAAyB;QAClD,IAAI,CAAC,iBAAiB,EAAE;YACtB,MAAM,IAAI,aAAa,CAAC,uCAAuC,CAAC,CAAC;SAClE;QACD,IAAI,aAAa,CAAC,iBAAiB,CAAC,EAAE;YACpC,MAAM,IAAI,aAAa,CAAC,wDAAwD,CAAC,CAAC;SACnF;QACD,OAAO,IAAI,+BAA+B,CAAC,iBAAiB,CAAC,CAAC;IAChE,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nimport { PartitionKey } from \"../../documents\";\nimport { FeedRange } from \"./FeedRange\";\nimport { ChangeFeedStartFromNow } from \"./ChangeFeedStartFromNow\";\nimport { ChangeFeedStartFromBeginning } from \"./ChangeFeedStartFromBeginning\";\nimport { ChangeFeedStartFromTime } from \"./ChangeFeedStartFromTime\";\nimport { ChangeFeedStartFromContinuation } from \"./ChangeFeedStartFromContinuation\";\nimport { ErrorResponse } from \"../../request/ErrorResponse\";\nimport { isNullOrEmpty } from \"./changeFeedUtils\";\n\n/**\n * Base class for where to start a ChangeFeedIterator.\n */\n/* eslint-disable @typescript-eslint/no-extraneous-class */\nexport abstract class ChangeFeedStartFrom {\n /**\n * Returns an object that tells the ChangeFeedIterator to start from the beginning of time.\n * @param cfResource - PartitionKey or FeedRange for which changes are to be fetched. Leave blank for fetching changes for entire container.\n */\n public static Beginning(cfResource?: PartitionKey | FeedRange): ChangeFeedStartFromBeginning {\n return new ChangeFeedStartFromBeginning(cfResource);\n }\n /**\n * Returns an object that tells the ChangeFeedIterator to start reading changes from this moment onward.\n * @param cfResource - PartitionKey or FeedRange for which changes are to be fetched. Leave blank for fetching changes for entire container.\n **/\n public static Now(cfResource?: PartitionKey | FeedRange): ChangeFeedStartFromNow {\n return new ChangeFeedStartFromNow(cfResource);\n }\n /**\n * Returns an object that tells the ChangeFeedIterator to start reading changes from some point in time onward.\n * @param startTime - Date object specfiying the time to start reading changes from.\n * @param cfResource - PartitionKey or FeedRange for which changes are to be fetched. Leave blank for fetching changes for entire container.\n */\n public static Time(\n startTime: Date,\n cfResource?: PartitionKey | FeedRange,\n ): ChangeFeedStartFromTime {\n if (!startTime) {\n throw new ErrorResponse(\"startTime must be present\");\n }\n if (startTime instanceof Date === true) {\n return new ChangeFeedStartFromTime(startTime, cfResource);\n } else {\n throw new ErrorResponse(\"startTime must be a Date object.\");\n }\n }\n /**\n * Returns an object that tells the ChangeFeedIterator to start reading changes from a save point.\n * @param continuation - The continuation to resume from.\n */\n public static Continuation(continuationToken: string): ChangeFeedStartFromContinuation {\n if (!continuationToken) {\n throw new ErrorResponse(\"Argument continuation must be passed.\");\n }\n if (isNullOrEmpty(continuationToken)) {\n throw new ErrorResponse(\"Argument continuationToken must be a non-empty string.\");\n }\n return new ChangeFeedStartFromContinuation(continuationToken);\n }\n}\n"]}
|
||||
Vendored
+12
@@ -0,0 +1,12 @@
|
||||
import { PartitionKey } from "../../documents";
|
||||
import { FeedRange } from "./FeedRange";
|
||||
/**
|
||||
* @hidden
|
||||
* Class which specifies the ChangeFeedIterator to start reading changes from beginning of time.
|
||||
*/
|
||||
export declare class ChangeFeedStartFromBeginning {
|
||||
private cfResource?;
|
||||
constructor(cfResource?: PartitionKey | FeedRange);
|
||||
getCfResource(): PartitionKey | FeedRange | undefined;
|
||||
}
|
||||
//# sourceMappingURL=ChangeFeedStartFromBeginning.d.ts.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ChangeFeedStartFromBeginning.d.ts","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ChangeFeedStartFromBeginning.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC;;;GAGG;AACH,qBAAa,4BAA4B;IACvC,OAAO,CAAC,UAAU,CAAC,CAA2B;gBAElC,UAAU,CAAC,EAAE,YAAY,GAAG,SAAS;IAI1C,aAAa,IAAI,YAAY,GAAG,SAAS,GAAG,SAAS;CAG7D"}
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
/**
|
||||
* @hidden
|
||||
* Class which specifies the ChangeFeedIterator to start reading changes from beginning of time.
|
||||
*/
|
||||
export class ChangeFeedStartFromBeginning {
|
||||
constructor(cfResource) {
|
||||
this.cfResource = cfResource;
|
||||
}
|
||||
getCfResource() {
|
||||
return this.cfResource;
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=ChangeFeedStartFromBeginning.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ChangeFeedStartFromBeginning.js","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ChangeFeedStartFromBeginning.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,MAAM,OAAO,4BAA4B;IAGvC,YAAY,UAAqC;QAC/C,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAEM,aAAa;QAClB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nimport { PartitionKey } from \"../../documents\";\nimport { FeedRange } from \"./FeedRange\";\n\n/**\n * @hidden\n * Class which specifies the ChangeFeedIterator to start reading changes from beginning of time.\n */\nexport class ChangeFeedStartFromBeginning {\n private cfResource?: PartitionKey | FeedRange;\n\n constructor(cfResource?: PartitionKey | FeedRange) {\n this.cfResource = cfResource;\n }\n\n public getCfResource(): PartitionKey | FeedRange | undefined {\n return this.cfResource;\n }\n}\n"]}
|
||||
local_dependencies/@azure/cosmos/dist-esm/src/client/ChangeFeed/ChangeFeedStartFromContinuation.d.ts
Vendored
+12
@@ -0,0 +1,12 @@
|
||||
/**
|
||||
* @hidden
|
||||
* Class which specifies the ChangeFeedIterator to start reading changes from a saved point.
|
||||
*/
|
||||
export declare class ChangeFeedStartFromContinuation {
|
||||
private continuationToken;
|
||||
constructor(continuation: string);
|
||||
getCfResource(): string;
|
||||
getCfResourceJson(): any;
|
||||
getResourceType(): any;
|
||||
}
|
||||
//# sourceMappingURL=ChangeFeedStartFromContinuation.d.ts.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ChangeFeedStartFromContinuation.d.ts","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ChangeFeedStartFromContinuation.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,qBAAa,+BAA+B;IAC1C,OAAO,CAAC,iBAAiB,CAAS;gBAEtB,YAAY,EAAE,MAAM;IAIzB,aAAa,IAAI,MAAM;IAGvB,iBAAiB,IAAI,GAAG;IAIxB,eAAe,IAAI,GAAG;CAkB9B"}
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
// Copyright (c) Microsoft Corporation.
|
||||
// Licensed under the MIT license.
|
||||
import { ErrorResponse } from "../../request";
|
||||
import { ChangeFeedResourceType } from "./ChangeFeedEnums";
|
||||
/**
|
||||
* @hidden
|
||||
* Class which specifies the ChangeFeedIterator to start reading changes from a saved point.
|
||||
*/
|
||||
export class ChangeFeedStartFromContinuation {
|
||||
constructor(continuation) {
|
||||
this.continuationToken = continuation;
|
||||
}
|
||||
getCfResource() {
|
||||
return this.continuationToken;
|
||||
}
|
||||
getCfResourceJson() {
|
||||
return JSON.parse(this.continuationToken);
|
||||
}
|
||||
getResourceType() {
|
||||
const cToken = this.getCfResourceJson();
|
||||
if (Object.prototype.hasOwnProperty.call(cToken, "partitionKey") &&
|
||||
Object.prototype.hasOwnProperty.call(cToken, "Continuation") &&
|
||||
typeof cToken.Continuation === "string") {
|
||||
return ChangeFeedResourceType.PartitionKey;
|
||||
}
|
||||
else if (Object.prototype.hasOwnProperty.call(cToken, "Continuation") &&
|
||||
Array.isArray(cToken.Continuation) &&
|
||||
cToken.Continuation.length > 0) {
|
||||
return ChangeFeedResourceType.FeedRange;
|
||||
}
|
||||
else {
|
||||
throw new ErrorResponse("Invalid continuation token.");
|
||||
}
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=ChangeFeedStartFromContinuation.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ChangeFeedStartFromContinuation.js","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ChangeFeedStartFromContinuation.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D;;;GAGG;AACH,MAAM,OAAO,+BAA+B;IAG1C,YAAY,YAAoB;QAC9B,IAAI,CAAC,iBAAiB,GAAG,YAAY,CAAC;IACxC,CAAC;IAEM,aAAa;QAClB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IACM,iBAAiB;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC5C,CAAC;IAEM,eAAe;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACxC,IACE,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC;YAC5D,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC;YAC5D,OAAO,MAAM,CAAC,YAAY,KAAK,QAAQ,EACvC;YACA,OAAO,sBAAsB,CAAC,YAAY,CAAC;SAC5C;aAAM,IACL,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC;YAC5D,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC;YAClC,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAC9B;YACA,OAAO,sBAAsB,CAAC,SAAS,CAAC;SACzC;aAAM;YACL,MAAM,IAAI,aAAa,CAAC,6BAA6B,CAAC,CAAC;SACxD;IACH,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nimport { ErrorResponse } from \"../../request\";\nimport { ChangeFeedResourceType } from \"./ChangeFeedEnums\";\n/**\n * @hidden\n * Class which specifies the ChangeFeedIterator to start reading changes from a saved point.\n */\nexport class ChangeFeedStartFromContinuation {\n private continuationToken: string;\n\n constructor(continuation: string) {\n this.continuationToken = continuation;\n }\n\n public getCfResource(): string {\n return this.continuationToken;\n }\n public getCfResourceJson(): any {\n return JSON.parse(this.continuationToken);\n }\n\n public getResourceType(): any {\n const cToken = this.getCfResourceJson();\n if (\n Object.prototype.hasOwnProperty.call(cToken, \"partitionKey\") &&\n Object.prototype.hasOwnProperty.call(cToken, \"Continuation\") &&\n typeof cToken.Continuation === \"string\"\n ) {\n return ChangeFeedResourceType.PartitionKey;\n } else if (\n Object.prototype.hasOwnProperty.call(cToken, \"Continuation\") &&\n Array.isArray(cToken.Continuation) &&\n cToken.Continuation.length > 0\n ) {\n return ChangeFeedResourceType.FeedRange;\n } else {\n throw new ErrorResponse(\"Invalid continuation token.\");\n }\n }\n}\n"]}
|
||||
Vendored
+12
@@ -0,0 +1,12 @@
|
||||
import { PartitionKey } from "../../documents";
|
||||
import { FeedRange } from "./FeedRange";
|
||||
/**
|
||||
* @hidden
|
||||
* Class which specifies the ChangeFeedIterator to start reading changes from this moment in time.
|
||||
*/
|
||||
export declare class ChangeFeedStartFromNow {
|
||||
cfResource?: PartitionKey | FeedRange;
|
||||
constructor(cfResource?: PartitionKey | FeedRange);
|
||||
getCfResource(): PartitionKey | FeedRange | undefined;
|
||||
}
|
||||
//# sourceMappingURL=ChangeFeedStartFromNow.d.ts.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ChangeFeedStartFromNow.d.ts","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ChangeFeedStartFromNow.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC;;;GAGG;AACH,qBAAa,sBAAsB;IAC1B,UAAU,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;gBAEjC,UAAU,CAAC,EAAE,YAAY,GAAG,SAAS;IAI1C,aAAa,IAAI,YAAY,GAAG,SAAS,GAAG,SAAS;CAG7D"}
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
// Copyright (c) Microsoft Corporation.
|
||||
// Licensed under the MIT license.
|
||||
/**
|
||||
* @hidden
|
||||
* Class which specifies the ChangeFeedIterator to start reading changes from this moment in time.
|
||||
*/
|
||||
export class ChangeFeedStartFromNow {
|
||||
constructor(cfResource) {
|
||||
this.cfResource = cfResource;
|
||||
}
|
||||
getCfResource() {
|
||||
return this.cfResource;
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=ChangeFeedStartFromNow.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ChangeFeedStartFromNow.js","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ChangeFeedStartFromNow.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAIlC;;;GAGG;AACH,MAAM,OAAO,sBAAsB;IAGjC,YAAY,UAAqC;QAC/C,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAEM,aAAa;QAClB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { PartitionKey } from \"../../documents\";\nimport { FeedRange } from \"./FeedRange\";\n/**\n * @hidden\n * Class which specifies the ChangeFeedIterator to start reading changes from this moment in time.\n */\nexport class ChangeFeedStartFromNow {\n public cfResource?: PartitionKey | FeedRange;\n\n constructor(cfResource?: PartitionKey | FeedRange) {\n this.cfResource = cfResource;\n }\n\n public getCfResource(): PartitionKey | FeedRange | undefined {\n return this.cfResource;\n }\n}\n"]}
|
||||
Vendored
+14
@@ -0,0 +1,14 @@
|
||||
import { PartitionKey } from "../../documents";
|
||||
import { FeedRange } from "./FeedRange";
|
||||
/**
|
||||
* @hidden
|
||||
* Class which specifies the ChangeFeedIterator to start reading changes from a particular point of time.
|
||||
*/
|
||||
export declare class ChangeFeedStartFromTime {
|
||||
private cfResource?;
|
||||
private startTime;
|
||||
constructor(startTime: Date, cfResource?: PartitionKey | FeedRange);
|
||||
getCfResource(): PartitionKey | FeedRange | undefined;
|
||||
getStartTime(): Date;
|
||||
}
|
||||
//# sourceMappingURL=ChangeFeedStartFromTime.d.ts.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ChangeFeedStartFromTime.d.ts","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ChangeFeedStartFromTime.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC;;;GAGG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,UAAU,CAAC,CAA2B;IAE9C,OAAO,CAAC,SAAS,CAAO;gBAEZ,SAAS,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,YAAY,GAAG,SAAS;IAK3D,aAAa,IAAI,YAAY,GAAG,SAAS,GAAG,SAAS;IAIrD,YAAY,IAAI,IAAI;CAG5B"}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
/**
|
||||
* @hidden
|
||||
* Class which specifies the ChangeFeedIterator to start reading changes from a particular point of time.
|
||||
*/
|
||||
export class ChangeFeedStartFromTime {
|
||||
constructor(startTime, cfResource) {
|
||||
this.startTime = startTime;
|
||||
this.cfResource = cfResource;
|
||||
}
|
||||
getCfResource() {
|
||||
return this.cfResource;
|
||||
}
|
||||
getStartTime() {
|
||||
return this.startTime;
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=ChangeFeedStartFromTime.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ChangeFeedStartFromTime.js","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ChangeFeedStartFromTime.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,MAAM,OAAO,uBAAuB;IAKlC,YAAY,SAAe,EAAE,UAAqC;QAChE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAEM,aAAa;QAClB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAEM,YAAY;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nimport { PartitionKey } from \"../../documents\";\nimport { FeedRange } from \"./FeedRange\";\n/**\n * @hidden\n * Class which specifies the ChangeFeedIterator to start reading changes from a particular point of time.\n */\nexport class ChangeFeedStartFromTime {\n private cfResource?: PartitionKey | FeedRange;\n\n private startTime: Date;\n\n constructor(startTime: Date, cfResource?: PartitionKey | FeedRange) {\n this.startTime = startTime;\n this.cfResource = cfResource;\n }\n\n public getCfResource(): PartitionKey | FeedRange | undefined {\n return this.cfResource;\n }\n\n public getStartTime(): Date {\n return this.startTime;\n }\n}\n"]}
|
||||
Vendored
+2
@@ -0,0 +1,2 @@
|
||||
export {};
|
||||
//# sourceMappingURL=CompositeContinuationToken.d.ts.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"CompositeContinuationToken.d.ts","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/CompositeContinuationToken.ts"],"names":[],"mappings":""}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
/**
|
||||
* Continuation token for change feed of entire container, or a specific Epk Range.
|
||||
* @internal
|
||||
*/
|
||||
export class CompositeContinuationToken {
|
||||
constructor(rid, Continuation) {
|
||||
this.rid = rid;
|
||||
this.Continuation = Continuation;
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=CompositeContinuationToken.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"CompositeContinuationToken.js","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/CompositeContinuationToken.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,OAAO,0BAA0B;IAUrC,YAAY,GAAW,EAAE,YAA+B;QACtD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nimport { ChangeFeedRange } from \"./ChangeFeedRange\";\n/**\n * Continuation token for change feed of entire container, or a specific Epk Range.\n * @internal\n */\nexport class CompositeContinuationToken {\n /**\n * rid of the container for which the continuation token is issued.\n */\n public readonly rid: string;\n /**\n * List of Epk Ranges part of the continuation token\n */\n public readonly Continuation: ChangeFeedRange[];\n\n constructor(rid: string, Continuation: ChangeFeedRange[]) {\n this.rid = rid;\n this.Continuation = Continuation;\n }\n}\n"]}
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
export {};
|
||||
//# sourceMappingURL=ContinuationTokenForPartitionKey.d.ts.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ContinuationTokenForPartitionKey.d.ts","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ContinuationTokenForPartitionKey.ts"],"names":[],"mappings":""}
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
/**
|
||||
* Continuation token for change feed of entire container, or a specific Epk Range.
|
||||
* @internal
|
||||
*/
|
||||
export class ContinuationTokenForPartitionKey {
|
||||
constructor(rid, partitionKey, continuation) {
|
||||
this.rid = rid;
|
||||
this.partitionKey = partitionKey;
|
||||
this.Continuation = continuation;
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=ContinuationTokenForPartitionKey.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ContinuationTokenForPartitionKey.js","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ContinuationTokenForPartitionKey.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,OAAO,gCAAgC;IAc3C,YAAY,GAAW,EAAE,YAA0B,EAAE,YAAoB;QACvE,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nimport { PartitionKey } from \"../../documents\";\n/**\n * Continuation token for change feed of entire container, or a specific Epk Range.\n * @internal\n */\nexport class ContinuationTokenForPartitionKey {\n /**\n * rid of the container for which the continuation token is issued.\n */\n public readonly rid: string;\n /**\n * A specific Partition key in the container for which the continuation token is issued.\n */\n public readonly partitionKey: PartitionKey;\n /**\n * Continuation value for the specific Partition key in the container.\n */\n public Continuation: string;\n\n constructor(rid: string, partitionKey: PartitionKey, continuation: string) {\n this.rid = rid;\n this.partitionKey = partitionKey;\n this.Continuation = continuation;\n }\n}\n"]}
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
/**
|
||||
* Specifies a feed range for the changefeed.
|
||||
*/
|
||||
export declare abstract class FeedRange {
|
||||
/**
|
||||
* Min value for the feed range.
|
||||
*/
|
||||
readonly minInclusive: string;
|
||||
/**
|
||||
* Max value for the feed range.
|
||||
*/
|
||||
readonly maxExclusive: string;
|
||||
}
|
||||
/**
|
||||
* @hidden
|
||||
* Specifies a feed range for the changefeed.
|
||||
*/
|
||||
export declare class FeedRangeInternal extends FeedRange {
|
||||
constructor(minInclusive: string, maxExclusive: string);
|
||||
}
|
||||
//# sourceMappingURL=FeedRange.d.ts.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"FeedRange.d.ts","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/FeedRange.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,8BAAsB,SAAS;IAC7B;;OAEG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B;;OAEG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAa/B;AAED;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,SAAS;gBAElC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM;CAGvD"}
|
||||
@@ -0,0 +1,30 @@
|
||||
// Copyright (c) Microsoft Corporation.
|
||||
// Licensed under the MIT license.
|
||||
import { ErrorResponse } from "../../request";
|
||||
/**
|
||||
* Specifies a feed range for the changefeed.
|
||||
*/
|
||||
export class FeedRange {
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
constructor(minInclusive, maxExclusive) {
|
||||
// only way to explictly block users from creating FeedRange directly in JS
|
||||
if (new.target === FeedRange) {
|
||||
throw new ErrorResponse("Cannot instantiate abstract class FeedRange");
|
||||
}
|
||||
this.minInclusive = minInclusive;
|
||||
this.maxExclusive = maxExclusive;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @hidden
|
||||
* Specifies a feed range for the changefeed.
|
||||
*/
|
||||
export class FeedRangeInternal extends FeedRange {
|
||||
/* eslint-disable @typescript-eslint/no-useless-constructor */
|
||||
constructor(minInclusive, maxExclusive) {
|
||||
super(minInclusive, maxExclusive);
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=FeedRange.js.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"FeedRange.js","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/FeedRange.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C;;GAEG;AACH,MAAM,OAAgB,SAAS;IAS7B;;OAEG;IACH,YAAsB,YAAoB,EAAE,YAAoB;QAC9D,2EAA2E;QAC3E,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE;YAC5B,MAAM,IAAI,aAAa,CAAC,6CAA6C,CAAC,CAAC;SACxE;QAED,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,iBAAkB,SAAQ,SAAS;IAC9C,8DAA8D;IAC9D,YAAY,YAAoB,EAAE,YAAoB;QACpD,KAAK,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IACpC,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { ErrorResponse } from \"../../request\";\n\n/**\n * Specifies a feed range for the changefeed.\n */\nexport abstract class FeedRange {\n /**\n * Min value for the feed range.\n */\n readonly minInclusive: string;\n /**\n * Max value for the feed range.\n */\n readonly maxExclusive: string;\n /**\n * @internal\n */\n protected constructor(minInclusive: string, maxExclusive: string) {\n // only way to explictly block users from creating FeedRange directly in JS\n if (new.target === FeedRange) {\n throw new ErrorResponse(\"Cannot instantiate abstract class FeedRange\");\n }\n\n this.minInclusive = minInclusive;\n this.maxExclusive = maxExclusive;\n }\n}\n\n/**\n * @hidden\n * Specifies a feed range for the changefeed.\n */\nexport class FeedRangeInternal extends FeedRange {\n /* eslint-disable @typescript-eslint/no-useless-constructor */\n constructor(minInclusive: string, maxExclusive: string) {\n super(minInclusive, maxExclusive);\n }\n}\n"]}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
import { ChangeFeedRange } from "./ChangeFeedRange";
|
||||
/**
|
||||
* @hidden
|
||||
* A queue for iterating over specified Epk ranges and fetch change feed for the given epk ranges.
|
||||
*/
|
||||
export declare class FeedRangeQueue<T> {
|
||||
private elements;
|
||||
constructor();
|
||||
modifyFirstElement(newItem: ChangeFeedRange): void;
|
||||
enqueue(item: ChangeFeedRange): void;
|
||||
dequeue(): ChangeFeedRange;
|
||||
peek(): T | ChangeFeedRange;
|
||||
isEmpty(): boolean;
|
||||
moveFirstElementToTheEnd(): void;
|
||||
/**
|
||||
* Returns a snapshot of the queue as an array to be used as Continuation token.
|
||||
*/
|
||||
returnSnapshot(): ChangeFeedRange[];
|
||||
}
|
||||
//# sourceMappingURL=FeedRangeQueue.d.ts.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"FeedRangeQueue.d.ts","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/FeedRangeQueue.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD;;;GAGG;AACH,qBAAa,cAAc,CAAC,CAAC;IAC3B,OAAO,CAAC,QAAQ,CAAoB;;IAM7B,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAMlD,OAAO,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI;IAIpC,OAAO,IAAI,eAAe;IAI1B,IAAI,IAAI,CAAC,GAAG,eAAe;IAI3B,OAAO,IAAI,OAAO;IAIlB,wBAAwB,IAAI,IAAI;IAKvC;;OAEG;IACI,cAAc,IAAI,eAAe,EAAE;CAc3C"}
|
||||
@@ -0,0 +1,48 @@
|
||||
// Copyright (c) Microsoft Corporation.
|
||||
// Licensed under the MIT license.
|
||||
import { ChangeFeedRange } from "./ChangeFeedRange";
|
||||
/**
|
||||
* @hidden
|
||||
* A queue for iterating over specified Epk ranges and fetch change feed for the given epk ranges.
|
||||
*/
|
||||
export class FeedRangeQueue {
|
||||
constructor() {
|
||||
this.elements = [];
|
||||
}
|
||||
modifyFirstElement(newItem) {
|
||||
if (!this.isEmpty()) {
|
||||
this.elements[0] = newItem;
|
||||
}
|
||||
}
|
||||
enqueue(item) {
|
||||
this.elements.push(item);
|
||||
}
|
||||
dequeue() {
|
||||
return this.elements.shift();
|
||||
}
|
||||
peek() {
|
||||
return !this.isEmpty() ? this.elements[0] : undefined;
|
||||
}
|
||||
isEmpty() {
|
||||
return this.elements.length === 0;
|
||||
}
|
||||
moveFirstElementToTheEnd() {
|
||||
if (!this.isEmpty()) {
|
||||
this.elements.push(this.dequeue());
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Returns a snapshot of the queue as an array to be used as Continuation token.
|
||||
*/
|
||||
returnSnapshot() {
|
||||
const allFeedRanges = [];
|
||||
this.elements.map((element) => {
|
||||
const minInclusive = element.epkMinHeader ? element.epkMinHeader : element.minInclusive;
|
||||
const maxExclusive = element.epkMaxHeader ? element.epkMaxHeader : element.maxExclusive;
|
||||
const feedRangeElement = new ChangeFeedRange(minInclusive, maxExclusive, element.continuationToken);
|
||||
allFeedRanges.push(feedRangeElement);
|
||||
});
|
||||
return allFeedRanges;
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=FeedRangeQueue.js.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"FeedRangeQueue.js","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/FeedRangeQueue.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD;;;GAGG;AACH,MAAM,OAAO,cAAc;IAGzB;QACE,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACrB,CAAC;IAEM,kBAAkB,CAAC,OAAwB;QAChD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE;YACnB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;SAC5B;IACH,CAAC;IAEM,OAAO,CAAC,IAAqB;QAClC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAEM,OAAO;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;IAEM,IAAI;QACT,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACxD,CAAC;IAEM,OAAO;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;IACpC,CAAC;IAEM,wBAAwB;QAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE;YACnB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;SACpC;IACH,CAAC;IACD;;OAEG;IACI,cAAc;QACnB,MAAM,aAAa,GAAsB,EAAE,CAAC;QAC5C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YAC5B,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;YACxF,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;YACxF,MAAM,gBAAgB,GAAG,IAAI,eAAe,CAC1C,YAAY,EACZ,YAAY,EACZ,OAAO,CAAC,iBAAiB,CAC1B,CAAC;YACF,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QACH,OAAO,aAAa,CAAC;IACvB,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\nimport { ChangeFeedRange } from \"./ChangeFeedRange\";\n/**\n * @hidden\n * A queue for iterating over specified Epk ranges and fetch change feed for the given epk ranges.\n */\nexport class FeedRangeQueue<T> {\n private elements: ChangeFeedRange[];\n\n constructor() {\n this.elements = [];\n }\n\n public modifyFirstElement(newItem: ChangeFeedRange): void {\n if (!this.isEmpty()) {\n this.elements[0] = newItem;\n }\n }\n\n public enqueue(item: ChangeFeedRange): void {\n this.elements.push(item);\n }\n\n public dequeue(): ChangeFeedRange {\n return this.elements.shift();\n }\n\n public peek(): T | ChangeFeedRange {\n return !this.isEmpty() ? this.elements[0] : undefined;\n }\n\n public isEmpty(): boolean {\n return this.elements.length === 0;\n }\n\n public moveFirstElementToTheEnd(): void {\n if (!this.isEmpty()) {\n this.elements.push(this.dequeue());\n }\n }\n /**\n * Returns a snapshot of the queue as an array to be used as Continuation token.\n */\n public returnSnapshot(): ChangeFeedRange[] {\n const allFeedRanges: ChangeFeedRange[] = [];\n this.elements.map((element) => {\n const minInclusive = element.epkMinHeader ? element.epkMinHeader : element.minInclusive;\n const maxExclusive = element.epkMaxHeader ? element.epkMaxHeader : element.maxExclusive;\n const feedRangeElement = new ChangeFeedRange(\n minInclusive,\n maxExclusive,\n element.continuationToken,\n );\n allFeedRanges.push(feedRangeElement);\n });\n return allFeedRanges;\n }\n}\n"]}
|
||||
Vendored
+11
@@ -0,0 +1,11 @@
|
||||
/**
|
||||
* @hidden
|
||||
* Internal Change Feed Iterator Options used only by ChangeFeedForEpkRange and ChangeFeedForPartitionKey.
|
||||
*/
|
||||
export interface InternalChangeFeedIteratorOptions {
|
||||
maxItemCount?: number;
|
||||
sessionToken?: string;
|
||||
continuationToken?: string;
|
||||
startTime?: Date;
|
||||
}
|
||||
//# sourceMappingURL=InternalChangeFeedOptions.d.ts.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"InternalChangeFeedOptions.d.ts","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/InternalChangeFeedOptions.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,WAAW,iCAAiC;IAChD,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB"}
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
// Copyright (c) Microsoft Corporation.
|
||||
// Licensed under the MIT license.
|
||||
export {};
|
||||
//# sourceMappingURL=InternalChangeFeedOptions.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"InternalChangeFeedOptions.js","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/InternalChangeFeedOptions.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * @hidden\n * Internal Change Feed Iterator Options used only by ChangeFeedForEpkRange and ChangeFeedForPartitionKey.\n */\nexport interface InternalChangeFeedIteratorOptions {\n maxItemCount?: number;\n\n sessionToken?: string;\n\n continuationToken?: string;\n\n startTime?: Date;\n}\n"]}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user