New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@azure/storage-file-share

Package Overview
Dependencies
Maintainers
3
Versions
384
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@azure/storage-file-share - npm Package Compare versions

Comparing version 12.0.0-dev.20191203.1 to 12.0.0-dev.20191204.1

2

BreakingChanges.md

@@ -5,2 +5,4 @@ # Breaking Changes

- [Breaking] `forceCloseAllHandles` will return `CloseHandlesInfo` type instead of number.
- [Breaking] `forceCloseHandle` will return `closedHandlesCount` property instead of `numberOfHandlesClosed` to be compatible with `CloseHandlesInfo`.
- [Breaking] The default browser bundle has been removed from the npm package. Bundling your application with a bundler such as Webpack is the recommended approach to building a browser bundle. For details on how to do this, please refer to our [bundling documentation](https://aka.ms/AzureSDKBundling).

@@ -7,0 +9,0 @@ - [Breaking] The `expiryTime` and `startTime` members of the `AccountSASSignatureValues` and `FileSASSignatureValues` types, as well as the `expiry` and `start` members of the `accessPolicy` field of the `SignedIdentifier` type, have all been renamed to `expiresOn` and `startsOn` respectively for consistency with `@azure/storage-blob` and `@azure/storage-queue`.

@@ -7,2 +7,4 @@ # Changelog

- [Breaking] The `expiryTime` and `startTime` members of the `AccountSASSignatureValues` and `FileSASSignatureValues` types, as well as the `expiry` and `start` members of the `accessPolicy` field of the `SignedIdentifier` type, have all been renamed to `expiresOn` and `startsOn` respectively for consistency with `@azure/storage-blob` and `@azure/storage-queue`.
- [Breaking] `forceCloseAllHandles` will return `CloseHandlesInfo` type instead of number.
- [Breaking] `forceCloseHandle` will return `closedHandlesCount` property instead of `numberOfHandlesClosed` to be compatible with `CloseHandlesInfo`.
- Updated to use OpenTelemetry 0.2 via `@azure/core-tracing`

@@ -9,0 +11,0 @@ - Bug Fix - Convert empty prefixes (`""`) to `undefined` when passed as options to the `listFiles` or `listShares` methods to avoid sending an invalid request to the service. Fixes bug [5817](https://github.com/Azure/azure-sdk-for-js/issues/5817).

22

dist-esm/src/ShareDirectoryClient.js

@@ -1078,3 +1078,3 @@ // Copyright (c) Microsoft Corporation. All rights reserved.

return __awaiter(this, void 0, void 0, function () {
var _a, span, spanOptions, e_14;
var _a, span, spanOptions, rawResponse, response, e_14;
return __generator(this, function (_b) {

@@ -1089,3 +1089,7 @@ switch (_b.label) {

return [4 /*yield*/, this.context.forceCloseHandles("*", __assign(__assign({ marker: marker }, options), { spanOptions: spanOptions }))];
case 2: return [2 /*return*/, _b.sent()];
case 2:
rawResponse = _b.sent();
response = rawResponse;
response.closedHandlesCount = rawResponse.numberOfHandlesClosed || 0;
return [2 /*return*/, response];
case 3:

@@ -1111,3 +1115,3 @@ e_14 = _b.sent();

* @param {DirectoryForceCloseHandlesSegmentOptions} [options={}]
* @returns {Promise<number>}
* @returns {Promise<CloseHandlesInfo>}
* @memberof ShareDirectoryClient

@@ -1133,3 +1137,3 @@ */

marker = response.marker;
response.numberOfHandlesClosed && (handlesClosed += response.numberOfHandlesClosed);
response.closedHandlesCount && (handlesClosed += response.closedHandlesCount);
_b.label = 4;

@@ -1139,3 +1143,3 @@ case 4:

_b.label = 5;
case 5: return [2 /*return*/, handlesClosed];
case 5: return [2 /*return*/, { closedHandlesCount: handlesClosed }];
case 6:

@@ -1171,3 +1175,3 @@ e_15 = _b.sent();

return __awaiter(this, void 0, void 0, function () {
var _a, span, spanOptions, e_16;
var _a, span, spanOptions, rawResponse, response, e_16;
return __generator(this, function (_b) {

@@ -1187,3 +1191,7 @@ switch (_b.label) {

})];
case 2: return [2 /*return*/, _b.sent()];
case 2:
rawResponse = _b.sent();
response = rawResponse;
response.closedHandlesCount = rawResponse.numberOfHandlesClosed || 0;
return [2 /*return*/, response];
case 3:

@@ -1190,0 +1198,0 @@ e_16 = _b.sent();

{
"name": "@azure/storage-file-share",
"sdk-type": "client",
"version": "12.0.0-dev.20191203.1",
"version": "12.0.0-dev.20191204.1",
"description": "Microsoft Azure Storage SDK for JavaScript - File",

@@ -6,0 +6,0 @@ "main": "./dist/index.js",

@@ -387,18 +387,37 @@ # Azure Storage File Share client library for JavaScript

Please refer to the [JavaScript Bundle](#javascript-bundle) section for more information on using this library in the browser.
```javascript
// Get file content from position 0 to the end
// In browsers, get downloaded data by accessing downloadFileResponse.blobBody
const { ShareServiceClient } = require("@azure/storage-file-share");
const account = "<account name>";
const sas = "<service Shared Access Signature Token>";
const shareName = "<share name>";
const fileName = "<file name>"
const serviceClient = new ShareServiceClient(
`https://${account}.file.core.windows.net${sas}`
);
async function main() {
const fileClient = serviceClient.getShareClient(shareName)
.rootDirectoryClient
.getFileClient(fileName);
// Get file content from position 0 to the end
// In browsers, get downloaded data by accessing downloadFileResponse.blobBody
const downloadFileResponse = await fileClient.download(0);
console.log(
`Downloaded file content: ${await streamToString(
downloadFileResponse.blobBody
`Downloaded file content: ${await blobToString(
await downloadFileResponse.blobBody
)}`
);
}
// [Browser only] A helper method used to convert a browser Blob into string.
export async function blobToString(blob: Blob): Promise<string> {
async function blobToString(blob) {
const fileReader = new FileReader();
return new Promise<string>((resolve, reject) => {
fileReader.onloadend = (ev: any) => {
resolve(ev.target!.result);
return new Promise((resolve, reject) => {
fileReader.onloadend = (ev) => {
resolve(ev.target.result);
};

@@ -409,2 +428,4 @@ fileReader.onerror = reject;

}
main()
```

@@ -411,0 +432,0 @@

@@ -11,3 +11,2 @@ // Copyright (c) Microsoft Corporation. All rights reserved.

DirectoryDeleteResponse,
DirectoryForceCloseHandlesResponse,
DirectoryGetPropertiesResponse,

@@ -25,3 +24,2 @@ DirectoryItem,

FileDownloadResponse as FileDownloadResponseModel,
FileForceCloseHandlesResponse,
FileGetPropertiesResponse,

@@ -57,3 +55,5 @@ FileGetRangeListHeaders,

SignedIdentifier as SignedIdentifierModel,
SourceModifiedAccessConditions
SourceModifiedAccessConditions,
FileForceCloseHandlesHeaders,
DirectoryForceCloseHandlesHeaders
} from "./generated/src/models";

@@ -18,3 +18,4 @@ // Copyright (c) Microsoft Corporation. All rights reserved.

TimePreserveType,
FileAttributesPreserveType
FileAttributesPreserveType,
CloseHandlesInfo
} from "./models";

@@ -21,0 +22,0 @@ export * from "./FileSystemAttributes";

@@ -26,3 +26,4 @@ // Copyright (c) Microsoft Corporation. All rights reserved.

TimePreserveType,
FileAttributesPreserveType
FileAttributesPreserveType,
CloseHandlesInfo
} from "./models";

@@ -29,0 +30,0 @@ export * from "./FileSystemAttributes";

@@ -151,2 +151,12 @@ // Copyright (c) Microsoft Corporation. All rights reserved.

/**
* Close handles result information.
*
* @export
* @interface CloseHandlesInfo
*/
export interface CloseHandlesInfo {
closedHandlesCount: number;
}
export function validateFilePermissionOptions(filePermission?: string, filePermissionKey?: string) {

@@ -153,0 +163,0 @@ if (filePermission && filePermissionKey) {

@@ -8,3 +8,2 @@ // Copyright (c) Microsoft Corporation. All rights reserved.

DirectoryDeleteResponse,
DirectoryForceCloseHandlesResponse,
DirectoryGetPropertiesResponse,

@@ -19,3 +18,4 @@ DirectoryItem,

FileItem,
HandleItem
HandleItem,
DirectoryForceCloseHandlesHeaders
} from "./generatedModels";

@@ -31,3 +31,4 @@ import { Directory } from "./generated/src/operations";

fileLastWriteTimeToString,
validateAndSetDefaultsForFileAndDirectorySetPropertiesCommonOptions
validateAndSetDefaultsForFileAndDirectorySetPropertiesCommonOptions,
CloseHandlesInfo
} from "./models";

@@ -45,2 +46,3 @@ import { newPipeline, StoragePipelineOptions, Pipeline } from "./Pipeline";

import { CanonicalCode } from "@opentelemetry/types";
import { HttpResponse } from "@azure/core-http";

@@ -293,2 +295,43 @@ /**

/**
* Additional response header values for close handles request.
*/
export interface DirectoryCloseHandlesHeaders {
/**
* This header uniquely identifies the request that was made and can be used for troubleshooting
* the request.
*/
requestId?: string;
/**
* Indicates the version of the File service used to execute the request.
*/
version?: string;
/**
* A UTC date/time value generated by the service that indicates the time at which the response
* was initiated.
*/
date?: Date;
/**
* A string describing next handle to be closed. It is returned when more handles need to be
* closed to complete the request.
*/
marker?: string;
}
/**
* Response type for {@link ShareDirectoryClient.forceCloseHandle}.
*/
export type DirectoryForceCloseHandlesResponse = CloseHandlesInfo &
DirectoryCloseHandlesHeaders & {
/**
* The underlying HTTP response.
*/
_response: HttpResponse & {
/**
* The parsed HTTP response headers.
*/
parsedHeaders: DirectoryForceCloseHandlesHeaders;
};
};
/**
* Options to configure {@link ShareDirectoryClient.forceCloseHandle}.

@@ -1259,3 +1302,3 @@ *

marker = marker === "" ? undefined : marker;
return await this.context.forceCloseHandles("*", {
const rawResponse = await this.context.forceCloseHandles("*", {
marker,

@@ -1265,2 +1308,5 @@ ...options,

});
const response = rawResponse as DirectoryForceCloseHandlesResponse;
response.closedHandlesCount = rawResponse.numberOfHandlesClosed || 0;
return response;
} catch (e) {

@@ -1282,3 +1328,3 @@ span.setStatus({

* @param {DirectoryForceCloseHandlesSegmentOptions} [options={}]
* @returns {Promise<number>}
* @returns {Promise<CloseHandlesInfo>}
* @memberof ShareDirectoryClient

@@ -1288,3 +1334,3 @@ */

options: DirectoryForceCloseHandlesSegmentOptions = {}
): Promise<number> {
): Promise<CloseHandlesInfo> {
const { span, spanOptions } = createSpan(

@@ -1304,6 +1350,6 @@ "ShareDirectoryClient-forceCloseAllHandles",

marker = response.marker;
response.numberOfHandlesClosed && (handlesClosed += response.numberOfHandlesClosed);
response.closedHandlesCount && (handlesClosed += response.closedHandlesCount);
} while (marker);
return handlesClosed;
return { closedHandlesCount: handlesClosed };
} catch (e) {

@@ -1347,6 +1393,9 @@ span.setStatus({

return await this.context.forceCloseHandles(handleId, {
const rawResponse = await this.context.forceCloseHandles(handleId, {
abortSignal: options.abortSignal,
spanOptions
});
const response = rawResponse as DirectoryForceCloseHandlesResponse;
response.closedHandlesCount = rawResponse.numberOfHandlesClosed || 0;
return response;
} catch (e) {

@@ -1353,0 +1402,0 @@ span.setStatus({

@@ -1,2 +0,2 @@

export { CopyStatusType, DeleteSnapshotsOptionType, DirectoryCreateResponse, DirectoryDeleteResponse, DirectoryForceCloseHandlesResponse, DirectoryGetPropertiesResponse, DirectoryItem, DirectoryListFilesAndDirectoriesSegmentResponse, DirectoryListHandlesResponse, DirectorySetMetadataResponse, DirectorySetPropertiesResponse, FileAbortCopyResponse, FileCreateResponse, FileDeleteResponse, FileDownloadHeaders, FileDownloadOptionalParams, FileDownloadResponse as FileDownloadResponseModel, FileForceCloseHandlesResponse, FileGetPropertiesResponse, FileGetRangeListHeaders, FileItem, FileListHandlesResponse, FileServiceProperties, FileSetHTTPHeadersResponse, FileSetMetadataResponse, FileStartCopyResponse, FileUploadRangeFromURLOptionalParams, FileUploadRangeFromURLResponse, FileUploadRangeResponse, HandleItem, ListSharesIncludeType, Range as RangeModel, ServiceGetPropertiesResponse, ServiceListSharesSegmentResponse, ServiceSetPropertiesResponse, ShareCreatePermissionResponse, ShareCreateResponse, ShareCreateSnapshotResponse, ShareDeleteResponse, ShareGetAccessPolicyHeaders, ShareGetPermissionResponse, ShareGetPropertiesResponse, ShareGetStatisticsResponse as ShareGetStatisticsResponseModel, ShareItem, ShareSetAccessPolicyResponse, ShareSetMetadataResponse, ShareSetQuotaResponse, SignedIdentifier as SignedIdentifierModel, SourceModifiedAccessConditions } from "./generated/src/models";
export { CopyStatusType, DeleteSnapshotsOptionType, DirectoryCreateResponse, DirectoryDeleteResponse, DirectoryGetPropertiesResponse, DirectoryItem, DirectoryListFilesAndDirectoriesSegmentResponse, DirectoryListHandlesResponse, DirectorySetMetadataResponse, DirectorySetPropertiesResponse, FileAbortCopyResponse, FileCreateResponse, FileDeleteResponse, FileDownloadHeaders, FileDownloadOptionalParams, FileDownloadResponse as FileDownloadResponseModel, FileGetPropertiesResponse, FileGetRangeListHeaders, FileItem, FileListHandlesResponse, FileServiceProperties, FileSetHTTPHeadersResponse, FileSetMetadataResponse, FileStartCopyResponse, FileUploadRangeFromURLOptionalParams, FileUploadRangeFromURLResponse, FileUploadRangeResponse, HandleItem, ListSharesIncludeType, Range as RangeModel, ServiceGetPropertiesResponse, ServiceListSharesSegmentResponse, ServiceSetPropertiesResponse, ShareCreatePermissionResponse, ShareCreateResponse, ShareCreateSnapshotResponse, ShareDeleteResponse, ShareGetAccessPolicyHeaders, ShareGetPermissionResponse, ShareGetPropertiesResponse, ShareGetStatisticsResponse as ShareGetStatisticsResponseModel, ShareItem, ShareSetAccessPolicyResponse, ShareSetMetadataResponse, ShareSetQuotaResponse, SignedIdentifier as SignedIdentifierModel, SourceModifiedAccessConditions, FileForceCloseHandlesHeaders, DirectoryForceCloseHandlesHeaders } from "./generated/src/models";
//# sourceMappingURL=generatedModels.d.ts.map

@@ -9,3 +9,3 @@ import { RestError } from "@azure/core-http";

export { Range } from "./Range";
export { FilePermissionInheritType, FilePermissionPreserveType, TimeNowType, TimePreserveType, FileAttributesPreserveType } from "./models";
export { FilePermissionInheritType, FilePermissionPreserveType, TimeNowType, TimePreserveType, FileAttributesPreserveType, CloseHandlesInfo } from "./models";
export * from "./FileSystemAttributes";

@@ -12,0 +12,0 @@ export * from "./Pipeline";

@@ -17,3 +17,3 @@ import { RestError } from "@azure/core-http";

export { Range } from "./Range";
export { FilePermissionInheritType, FilePermissionPreserveType, TimeNowType, TimePreserveType, FileAttributesPreserveType } from "./models";
export { FilePermissionInheritType, FilePermissionPreserveType, TimeNowType, TimePreserveType, FileAttributesPreserveType, CloseHandlesInfo } from "./models";
export * from "./FileSystemAttributes";

@@ -20,0 +20,0 @@ export * from "./Pipeline";

@@ -131,2 +131,11 @@ import { FileSystemAttributes } from "./FileSystemAttributes";

}
/**
* Close handles result information.
*
* @export
* @interface CloseHandlesInfo
*/
export interface CloseHandlesInfo {
closedHandlesCount: number;
}
export declare function validateFilePermissionOptions(filePermission?: string, filePermissionKey?: string): void;

@@ -133,0 +142,0 @@ export declare function validateAndSetDefaultsForFileAndDirectoryCreateCommonOptions(options: FileAndDirectoryCreateCommonOptions): FileAndDirectoryCreateCommonOptions;

import { AbortSignalLike } from "@azure/abort-controller";
import { DirectoryCreateResponse, DirectoryDeleteResponse, DirectoryForceCloseHandlesResponse, DirectoryGetPropertiesResponse, DirectoryItem, DirectoryListFilesAndDirectoriesSegmentResponse, DirectoryListHandlesResponse, DirectorySetMetadataResponse, DirectorySetPropertiesResponse, FileCreateResponse, FileDeleteResponse, FileItem, HandleItem } from "./generatedModels";
import { Metadata, FileAndDirectoryCreateCommonOptions, FileAndDirectorySetPropertiesCommonOptions } from "./models";
import { DirectoryCreateResponse, DirectoryDeleteResponse, DirectoryGetPropertiesResponse, DirectoryItem, DirectoryListFilesAndDirectoriesSegmentResponse, DirectoryListHandlesResponse, DirectorySetMetadataResponse, DirectorySetPropertiesResponse, FileCreateResponse, FileDeleteResponse, FileItem, HandleItem, DirectoryForceCloseHandlesHeaders } from "./generatedModels";
import { Metadata, FileAndDirectoryCreateCommonOptions, FileAndDirectorySetPropertiesCommonOptions, CloseHandlesInfo } from "./models";
import { StoragePipelineOptions, Pipeline } from "./Pipeline";

@@ -10,2 +10,3 @@ import { StorageClient, CommonOptions } from "./StorageClient";

import { Credential } from "./credentials/Credential";
import { HttpResponse } from "@azure/core-http";
/**

@@ -207,2 +208,40 @@ * Options to configure {@link ShareDirectoryClient.create} operation.

/**
* Additional response header values for close handles request.
*/
export interface DirectoryCloseHandlesHeaders {
/**
* This header uniquely identifies the request that was made and can be used for troubleshooting
* the request.
*/
requestId?: string;
/**
* Indicates the version of the File service used to execute the request.
*/
version?: string;
/**
* A UTC date/time value generated by the service that indicates the time at which the response
* was initiated.
*/
date?: Date;
/**
* A string describing next handle to be closed. It is returned when more handles need to be
* closed to complete the request.
*/
marker?: string;
}
/**
* Response type for {@link ShareDirectoryClient.forceCloseHandle}.
*/
export declare type DirectoryForceCloseHandlesResponse = CloseHandlesInfo & DirectoryCloseHandlesHeaders & {
/**
* The underlying HTTP response.
*/
_response: HttpResponse & {
/**
* The parsed HTTP response headers.
*/
parsedHeaders: DirectoryForceCloseHandlesHeaders;
};
};
/**
* Options to configure {@link ShareDirectoryClient.forceCloseHandle}.

@@ -708,6 +747,6 @@ *

* @param {DirectoryForceCloseHandlesSegmentOptions} [options={}]
* @returns {Promise<number>}
* @returns {Promise<CloseHandlesInfo>}
* @memberof ShareDirectoryClient
*/
forceCloseAllHandles(options?: DirectoryForceCloseHandlesSegmentOptions): Promise<number>;
forceCloseAllHandles(options?: DirectoryForceCloseHandlesSegmentOptions): Promise<CloseHandlesInfo>;
/**

@@ -714,0 +753,0 @@ * Force close a specific handle for a directory.

/// <reference types="node" />
import { HttpRequestBody, HttpResponse, TransferProgressEvent } from "@azure/core-http";
import { AbortSignalLike } from "@azure/abort-controller";
import { FileAbortCopyResponse, FileCreateResponse, FileDeleteResponse, FileDownloadResponseModel, FileForceCloseHandlesResponse, FileGetPropertiesResponse, FileGetRangeListHeaders, FileListHandlesResponse, FileSetHTTPHeadersResponse, FileSetMetadataResponse, FileStartCopyResponse, SourceModifiedAccessConditions, FileUploadRangeFromURLResponse, FileUploadRangeResponse, HandleItem, RangeModel } from "./generatedModels";
import { FileAbortCopyResponse, FileCreateResponse, FileDeleteResponse, FileDownloadResponseModel, FileGetPropertiesResponse, FileGetRangeListHeaders, FileListHandlesResponse, FileSetHTTPHeadersResponse, FileSetMetadataResponse, FileStartCopyResponse, SourceModifiedAccessConditions, FileUploadRangeFromURLResponse, FileUploadRangeResponse, HandleItem, RangeModel, FileForceCloseHandlesHeaders } from "./generatedModels";
import { Range } from "./Range";
import { FileHttpHeaders, Metadata, FileAndDirectoryCreateCommonOptions, FileAndDirectorySetPropertiesCommonOptions } from "./models";
import { FileHttpHeaders, Metadata, FileAndDirectoryCreateCommonOptions, FileAndDirectorySetPropertiesCommonOptions, CloseHandlesInfo } from "./models";
import { StoragePipelineOptions, Pipeline } from "./Pipeline";

@@ -413,3 +413,3 @@ import { StorageClient, CommonOptions } from "./StorageClient";

* - {@link ShareFileClient.forceCloseAllHandles}
* - {@link ShareFileCLient.forceCloseHandle}
* - {@link ShareFileClient.forceCloseHandle}
*

@@ -430,2 +430,40 @@ * @export

/**
* Additional response header values for close handles request.
*/
export interface FileCloseHandlesHeaders {
/**
* This header uniquely identifies the request that was made and can be used for troubleshooting
* the request.
*/
requestId?: string;
/**
* Indicates the version of the File service used to execute the request.
*/
version?: string;
/**
* A UTC date/time value generated by the service that indicates the time at which the response
* was initiated.
*/
date?: Date;
/**
* A string describing next handle to be closed. It is returned when more handles need to be
* closed to complete the request.
*/
marker?: string;
}
/**
* Response type for {@link ShareFileClient.forceCloseHandle}.
*/
export declare type FileForceCloseHandlesResponse = CloseHandlesInfo & FileCloseHandlesHeaders & {
/**
* The underlying HTTP response.
*/
_response: HttpResponse & {
/**
* The parsed HTTP response headers.
*/
parsedHeaders: FileForceCloseHandlesHeaders;
};
};
/**
* Option interface for ShareFileClient.uploadStream().

@@ -721,3 +759,3 @@ *

* "Downloaded file content:",
* await streamToString(downloadFileResponse.contentAsBlob)}
* await blobToString(await downloadFileResponse.blobBody)}
* );

@@ -1107,6 +1145,6 @@ *

* @param {FileForceCloseHandlesOptions} [options] Options to force close handles operation.
* @returns {Promise<number>}
* @returns {Promise<CloseHandlesInfo>}
* @memberof ShareFileClient
*/
forceCloseAllHandles(options?: FileForceCloseHandlesOptions): Promise<number>;
forceCloseAllHandles(options?: FileForceCloseHandlesOptions): Promise<CloseHandlesInfo>;
/**

@@ -1113,0 +1151,0 @@ * Force close a specific handle for a file.

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc