azure-storage
Advanced tools
Comparing version 1.4.0 to 2.0.0
@@ -0,1 +1,12 @@ | ||
Tracking Breaking Changes in 2.0.0 | ||
ALL | ||
* Fixed the issue that retry filter will continuously retry for client error like `ETIMEDOUT`. | ||
BLOB | ||
* When specifiying access condition `If-None-Match: *` for read, it will always fail. | ||
QUEUE | ||
* `createMessage` callback has been changed from `errorOrResponse` to `errorOrResult<QueueMessageResult>` which contains `messageId`, `popReceipt`, `timeNextVisible`, `insertionTime` and `expirationTime`. It can be passed to `updateMessage` and `deleteMessage` APIs. | ||
Tracking Breaking Changes in 1.4.0 | ||
@@ -2,0 +13,0 @@ |
Note: This is an Azure Storage only package. The all up Azure node sdk still has the old storage bits in there. In a future release, those storage bits will be removed and an npm dependency to this storage node sdk will | ||
be taken. This is a GA release and the changes described below indicate the changes from the Azure node SDK 0.9.8 available here - https://github.com/Azure/azure-sdk-for-node. | ||
2017.01 Version 2.0.0 | ||
ALL | ||
* Updated storage service version to 2016-05-31. Fore more information, please see - https://msdn.microsoft.com/en-us/library/azure/dd894041.aspx | ||
* Fixed the issue that `BatchOperation` doesn't support socket reuse for some node versions. | ||
* Fixed the issue that `BatchOperation` request pool size is too big when the socket reuse is supported. | ||
* Added empty headers to string-to-sign. | ||
* For response has body and no `content-type` header, try to parse the body using xml format. | ||
* Fixed the issue that retry filter will continuously retry for client error like `ETIMEDOUT`. | ||
* Added support for client side timeout. In order to set the timeout per API, please use `options.clientRequestTimeoutInMs`. To set the default value for all requests made via a particular service, please use `{blob|queue|table|file}Service.defaultClientRequestTimeoutInMs`. | ||
BLOB | ||
* Added support for large block blob. | ||
* Added `publicAccessLevel` to `ContainerResult` for the APIs `listContainersSegmented` and `listContainersSegmentedWithPrefix`. | ||
* When specifiying access condition `If-None-Match: *` for reading, it will always fail. | ||
* Returned content MD5 for range gets Blobs. | ||
* Fixed the issue that `useTransactionalMD5` didn't take effect for downloading a big blob. | ||
QUEUE | ||
* `createMessage` callback has been changed from `errorOrResponse` to `errorOrResult<QueueMessageResult>` which contains `messageId`, `popReceipt`, `timeNextVisible`, `insertionTime` and `expirationTime`. It can be passed to updateMessage and deleteMessage APIs. | ||
FILE | ||
* Returned content MD5 for range gets Files. | ||
* Fixed the issue that `useTransactionalMD5` didn't take effect for downloading a big file. | ||
* Added support for listing files and directories with prefix, refer to `FileService.listFilesAndDirectoriesSegmentedWithPrefix`. | ||
TABLE | ||
* Fixed the issue that response in incorrect for table batch operation when the error response item is not the first item in the responses. | ||
2016.11 Version 1.4.0 | ||
@@ -5,0 +34,0 @@ |
@@ -79,5 +79,4 @@ // | ||
incrementDelta *= boundedRandDelta; | ||
retryData.retryInterval = Math.min(this.minRetryInterval + incrementDelta, this.maxRetryInterval); | ||
retryData.retryable = retryData.retryCount ? retryData.retryCount < this.retryCount : true; | ||
@@ -84,0 +83,0 @@ return RetryPolicyFilter._shouldRetryOnError(statusCode, requestOptions); |
@@ -61,3 +61,2 @@ // | ||
retryData.retryInterval = this.retryInterval; | ||
retryData.retryable = retryData.retryCount ? retryData.retryCount < this.retryCount : true; | ||
@@ -64,0 +63,0 @@ return RetryPolicyFilter._shouldRetryOnError(statusCode, requestOptions); |
@@ -110,5 +110,6 @@ // | ||
var notExceedMaxRetryCount = retryRequestOptions.retryContext.retryCount ? retryRequestOptions.retryContext.retryCount <= self.retryCount : true; | ||
var retryInfo = self.shouldRetry(secondaryNotFound ? 500 : (azureutil.objectIsNull(returnObject.response) ? 306 : returnObject.response.statusCode), retryRequestOptions); | ||
retryRequestOptions.retryContext.retryCount++; | ||
if (retryInfo.ignore) { | ||
@@ -132,6 +133,15 @@ returnObject.error = null; | ||
// we should NOT retry within the SDK as the stream data is not valid anymore if we retry directly. | ||
if (!returnObject.outputStreamSent && returnObject.error && azureutil.objectIsNull(returnObject.retryable) && | ||
((!azureutil.objectIsNull(returnObject.response) && retryInfo.retryable) || | ||
(returnObject.error.code === 'ECONNREFUSED' || returnObject.error.code === 'ETIMEDOUT' || returnObject.error.code === 'ESOCKETTIMEDOUT' || returnObject.error.code === 'ECONNRESET' || returnObject.error.code === 'EAI_AGAIN'))) { | ||
if ( | ||
!returnObject.outputStreamSent && returnObject.error && azureutil.objectIsNull(returnObject.retryable) && notExceedMaxRetryCount && | ||
( | ||
(!azureutil.objectIsNull(returnObject.response) && retryInfo.retryable) || | ||
( | ||
returnObject.error.code === 'ECONNREFUSED' || | ||
returnObject.error.code === 'ETIMEDOUT' || | ||
returnObject.error.code === 'ESOCKETTIMEDOUT' || | ||
returnObject.error.code === 'ECONNRESET' || | ||
returnObject.error.code === 'EAI_AGAIN' | ||
) | ||
) | ||
) { | ||
if (retryRequestOptions.currentLocation === Constants.StorageLocation.PRIMARY) { | ||
@@ -138,0 +148,0 @@ lastPrimaryAttempt = returnObject.operationEndTime; |
@@ -27,6 +27,6 @@ // | ||
var os = require('os'); | ||
var crypto = require('crypto'); | ||
var extend = require('extend'); | ||
var Parser = require('json-edm-parser'); | ||
var Md5Wrapper = require('../md5-wrapper'); | ||
var azureutil = require('../util/util'); | ||
@@ -187,7 +187,8 @@ var validate = require('../util/validate'); | ||
* | ||
* @param {WebResource} webResource The webresource on which to perform the request. | ||
* @param {string} outputData The outgoing request data as a raw string. | ||
* @param {object} [options] The request options. | ||
* @param {int} [options.timeoutIntervalInMs] The timeout interval, in milliseconds, to use for the request. | ||
* @param {function} callback The response callback function. | ||
* @param {WebResource} webResource The webresource on which to perform the request. | ||
* @param {string} outputData The outgoing request data as a raw string. | ||
* @param {object} [options] The request options. | ||
* @param {int} [options.timeoutIntervalInMs] The timeout interval, in milliseconds, to use for the request. | ||
* @param {int} [options.clientRequestTimeoutInMs] The timeout of client requests, in milliseconds, to use for the request. | ||
* @param {function} callback The response callback function. | ||
*/ | ||
@@ -202,7 +203,8 @@ StorageServiceClient.prototype.performRequest = function (webResource, outputData, options, callback) { | ||
* | ||
* @param {WebResource} webResource The webresource on which to perform the request. | ||
* @param {Stream} outputStream The outgoing request data as a stream. | ||
* @param {object} [options] The request options. | ||
* @param {int} [options.timeoutIntervalInMs] The timeout interval, in milliseconds, to use for the request. | ||
* @param {function} callback The response callback function. | ||
* @param {WebResource} webResource The webresource on which to perform the request. | ||
* @param {Stream} outputStream The outgoing request data as a stream. | ||
* @param {object} [options] The request options. | ||
* @param {int} [options.timeoutIntervalInMs] The timeout interval, in milliseconds, to use for the request. | ||
* @param {int} [options.clientRequestTimeoutInMs] The timeout of client requests, in milliseconds, to use for the request. | ||
* @param {function} callback The response callback function. | ||
*/ | ||
@@ -217,8 +219,9 @@ StorageServiceClient.prototype.performRequestOutputStream = function (webResource, outputStream, options, callback) { | ||
* | ||
* @param {WebResource} webResource The webresource on which to perform the request. | ||
* @param {string} outputData The outgoing request data as a raw string. | ||
* @param {Stream} inputStream The ingoing response data as a stream. | ||
* @param {object} [options] The request options. | ||
* @param {int} [options.timeoutIntervalInMs] The timeout interval, in milliseconds, to use for the request. | ||
* @param {function} callback The response callback function. | ||
* @param {WebResource} webResource The webresource on which to perform the request. | ||
* @param {string} outputData The outgoing request data as a raw string. | ||
* @param {Stream} inputStream The ingoing response data as a stream. | ||
* @param {object} [options] The request options. | ||
* @param {int} [options.timeoutIntervalInMs] The timeout interval, in milliseconds, to use for the request. | ||
* @param {int} [options.clientRequestTimeoutInMs] The timeout of client requests, in milliseconds, to use for the request. | ||
* @param {function} callback The response callback function. | ||
*/ | ||
@@ -233,11 +236,12 @@ StorageServiceClient.prototype.performRequestInputStream = function (webResource, outputData, inputStream, options, callback) { | ||
* | ||
* @param {WebResource} webResource The webresource on which to perform the request. | ||
* @param {object} body The request body. | ||
* @param {string} [body.outputData] The outgoing request data as a raw string. | ||
* @param {Stream} [body.outputStream] The outgoing request data as a stream. | ||
* @param {Stream} [body.inputStream] The ingoing response data as a stream. | ||
* @param {object} [options] The request options. | ||
* @param {string} [options.clientRequestId] A string that represents the client request ID with a 1KB character limit. | ||
* @param {int} [options.timeoutIntervalInMs] The timeout interval, in milliseconds, to use for the request. | ||
* @param {function} callback The response callback function. | ||
* @param {WebResource} webResource The webresource on which to perform the request. | ||
* @param {object} body The request body. | ||
* @param {string} [body.outputData] The outgoing request data as a raw string. | ||
* @param {Stream} [body.outputStream] The outgoing request data as a stream. | ||
* @param {Stream} [body.inputStream] The ingoing response data as a stream. | ||
* @param {object} [options] The request options. | ||
* @param {string} [options.clientRequestId] A string that represents the client request ID with a 1KB character limit. | ||
* @param {int} [options.timeoutIntervalInMs] The timeout interval, in milliseconds, to use for the request. | ||
* @param {int} [options.clientRequestTimeoutInMs] The timeout of client requests, in milliseconds, to use for the request. | ||
* @param {function} callback The response callback function. | ||
*/ | ||
@@ -388,3 +392,3 @@ StorageServiceClient.prototype._performRequest = function (webResource, body, options, callback) { | ||
var responseLength = 0; | ||
var internalHash = crypto.createHash('md5'); | ||
var internalHash = new Md5Wrapper().createMd5Hash(); | ||
requestStream.on('data', function(data) { | ||
@@ -570,2 +574,10 @@ responseLength += data.length; | ||
// Browsers cache GET/HEAD requests by adding conditional headers such as 'IF_MODIFIED_SINCE' after Azure Storage 'Authorization header' calculation, | ||
// which may result in a 403 authorization error. So add timestamp to GET/HEAD request URLs thus avoid the browser cache. | ||
if (azureutil.isBrowser() && ( | ||
webResource.method === Constants.HttpConstants.HttpVerbs.GET || | ||
webResource.method === Constants.HttpConstants.HttpVerbs.HEAD)) { | ||
webResource.withQueryOption(HeaderConstants.FORCE_NO_CACHE_IN_BROWSER, new Date().getTime()); | ||
} | ||
if(azureutil.objectIsNull(options.timeoutIntervalInMs)) { | ||
@@ -575,2 +587,6 @@ options.timeoutIntervalInMs = this.defaultTimeoutIntervalInMs; | ||
if(azureutil.objectIsNull(options.clientRequestTimeoutInMs)) { | ||
options.clientRequestTimeoutInMs = this.defaultClientRequestTimeoutInMs; | ||
} | ||
if(!azureutil.objectIsNull(options.timeoutIntervalInMs) && options.timeoutIntervalInMs > 0) { | ||
@@ -632,8 +648,15 @@ webResource.withQueryOption(QueryStringConstants.TIMEOUT, Math.ceil(options.timeoutIntervalInMs / 1000)); | ||
headers: webResource.headers, | ||
mode: 'disable-fetch' | ||
}; | ||
if(options) { | ||
if (options) { | ||
//set encoding of response data. If set to null, the body is returned as a Buffer | ||
requestOptions.encoding = options.responseEncoding; | ||
} | ||
if (options && options.clientRequestTimeoutInMs) { | ||
requestOptions.timeout = options.clientRequestTimeoutInMs; | ||
} else { | ||
requestOptions.timeout = Constants.DEFAULT_CLIENT_REQUEST_TIMEOUT_IN_MS; // 2 minutes | ||
} | ||
} | ||
@@ -849,3 +872,4 @@ | ||
} else { | ||
throw new SyntaxError(SR.CONTENT_TYPE_MISSING, null); | ||
response.body = parseXml(response.body); | ||
// throw new SyntaxError(SR.CONTENT_TYPE_MISSING, null); | ||
} | ||
@@ -1011,2 +1035,3 @@ } catch (e) { | ||
* @param {int} [options.timeoutIntervalInMs] The server timeout interval, in milliseconds, to use for the request. | ||
* @param {int} [options.clientRequestTimeoutInMs] The timeout of client requests, in milliseconds, to use for the request. | ||
* @param {int} [options.maximumExecutionTimeInMs] The maximum execution time, in milliseconds, across all potential retries, to use when making this request. | ||
@@ -1064,2 +1089,3 @@ * The maximum execution time interval begins at the time that the client begins building the request. The maximum | ||
* @param {int} [options.timeoutIntervalInMs] The server timeout interval, in milliseconds, to use for the request. | ||
* @param {int} [options.clientRequestTimeoutInMs] The timeout of client requests, in milliseconds, to use for the request. | ||
* @param {int} [options.maximumExecutionTimeInMs] The maximum execution time, in milliseconds, across all potential retries, to use when making this request. | ||
@@ -1066,0 +1092,0 @@ * The maximum execution time interval begins at the time that the client begins building the request. The maximum |
@@ -269,2 +269,4 @@ // | ||
canonicalizedHeaders += currentHeaderItem.canonicalized + ':' + value + '\n'; | ||
} else { | ||
canonicalizedHeaders += currentHeaderItem.canonicalized + ':\n'; | ||
} | ||
@@ -271,0 +273,0 @@ }); |
@@ -35,3 +35,3 @@ // | ||
var nodeVersion = azureutil.getNodeVersion(); | ||
var enableReuseSocket = nodeVersion.major >= 0 && nodeVersion.minor >= 10; | ||
var enableReuseSocket = nodeVersion.major > 0 || nodeVersion.minor >= 10; | ||
@@ -114,3 +114,3 @@ /** | ||
if(enableReuseSocket && !this.callInOrder) { | ||
sharedRequest = 10; | ||
sharedRequest = 2; | ||
} | ||
@@ -117,0 +117,0 @@ return this._activeOperation >= sharedRequest * this.concurrency || |
@@ -18,5 +18,5 @@ // | ||
var stream = require('stream'); | ||
var crypto = require('crypto'); | ||
var util = require('util'); | ||
var Md5Wrapper = require('../md5-wrapper'); | ||
var Constants = require('../util/constants'); | ||
@@ -56,3 +56,3 @@ var bufferSize = Constants.BlobConstants.DEFAULT_WRITE_BLOCK_SIZE_IN_BYTES; | ||
if (options.calcContentMd5) { | ||
this._md5hash = crypto.createHash('md5'); | ||
this._md5hash = new Md5Wrapper().createMd5Hash(); | ||
} | ||
@@ -59,0 +59,0 @@ } |
@@ -18,3 +18,2 @@ // | ||
var stream = require('stream'); | ||
var crypto = require('crypto'); | ||
var util = require('util'); | ||
@@ -24,2 +23,3 @@ var fs = require('fs'); | ||
var Md5Wrapper = require('../md5-wrapper'); | ||
var Constants = require('../util/constants'); | ||
@@ -60,3 +60,3 @@ var bufferSize = Constants.BlobConstants.DEFAULT_WRITE_BLOCK_SIZE_IN_BYTES; | ||
if (options.calcContentMd5) { | ||
this._md5hash = crypto.createHash('md5'); | ||
this._md5hash = new Md5Wrapper().createMd5Hash(); | ||
} | ||
@@ -63,0 +63,0 @@ |
@@ -34,3 +34,3 @@ // | ||
*/ | ||
USER_AGENT_PRODUCT_VERSION: '1.4.0', | ||
USER_AGENT_PRODUCT_VERSION: '2.0.0', | ||
@@ -102,2 +102,12 @@ /** | ||
/** | ||
* Default client request timeout in milliseconds. | ||
* Integer containing the number of milliseconds to wait for a server to send response headers (and start the response body) before aborting the request. | ||
* 2 minutes by default. | ||
* | ||
* @constant | ||
* @type {int} | ||
*/ | ||
DEFAULT_CLIENT_REQUEST_TIMEOUT_IN_MS: 120000, | ||
/** | ||
* Marker for atom metadata. | ||
@@ -506,3 +516,3 @@ * | ||
/** | ||
* The maximum size of a single block. | ||
* The maximum size of a single block of block blob. | ||
* | ||
@@ -512,5 +522,13 @@ * @const | ||
*/ | ||
MAX_BLOCK_SIZE: 4 * 1024 * 1024, | ||
MAX_BLOCK_BLOB_BLOCK_SIZE: 100 * 1024 * 1024, | ||
/** | ||
* The maximum size of a single block of append blob. | ||
* | ||
* @const | ||
* @type {int} | ||
*/ | ||
MAX_APPEND_BLOB_BLOCK_SIZE: 4 * 1024 * 1024, | ||
/** | ||
* The maximum size, in bytes, of a blob before it must be separated into blocks. | ||
@@ -937,2 +955,10 @@ * | ||
/** | ||
* The header that is used to avoid browser cache. | ||
* | ||
* @const | ||
* @type {string} | ||
*/ | ||
FORCE_NO_CACHE_IN_BROWSER: '_', | ||
/** | ||
* The header that specifies public access to blobs. | ||
@@ -1567,3 +1593,3 @@ * | ||
*/ | ||
TARGET_STORAGE_VERSION: '2015-12-11', | ||
TARGET_STORAGE_VERSION: '2016-05-31', | ||
@@ -1570,0 +1596,0 @@ /** |
@@ -19,3 +19,2 @@ // | ||
var path = require('path'); | ||
var crypto = require('crypto'); | ||
var _ = require('underscore'); | ||
@@ -26,2 +25,3 @@ var util = require('util'); | ||
var Constants = require('./constants'); | ||
var Md5Wrapper = require('../md5-wrapper'); | ||
var StorageUtilities = require('./storageutilities'); | ||
@@ -74,2 +74,11 @@ var SR = require('./sr'); | ||
/** | ||
* Checks if in a browser environment. | ||
* | ||
* @return {bool} True if in a browser environment, false otherwise. | ||
*/ | ||
exports.isBrowser = function () { | ||
return typeof window !== 'undefined'; | ||
}; | ||
/** | ||
* Checks if a value is null or undefined. | ||
@@ -105,6 +114,16 @@ * | ||
/** | ||
* Determines if an object is a NaN. | ||
* | ||
* @param {object} value The object to assert. | ||
* @return {bool} True if the object is a NaN; false otherwise. | ||
*/ | ||
exports.objectIsNaN = function (value) { | ||
return typeof(value) === 'number' && isNaN(value); | ||
}; | ||
/** | ||
* Checks if an object is a string. | ||
* | ||
* @param {object} object The object to check if it is a string. | ||
* @return {bool} True if the object is a strign, false otherwise. | ||
* @return {bool} True if the object is a string, false otherwise. | ||
*/ | ||
@@ -367,3 +386,3 @@ exports.objectIsString = function (object) { | ||
if (calculateMD5) { | ||
digest = crypto.createHash('md5'); | ||
digest = new Md5Wrapper().createMd5Hash(); | ||
} | ||
@@ -396,3 +415,3 @@ | ||
var index = 0; | ||
var internalHash = crypto.createHash('md5'); | ||
var internalHash = new Md5Wrapper().createMd5Hash(); | ||
readStream.on('data', function(data) { | ||
@@ -478,3 +497,3 @@ if (index + data.length > bufferLength) { | ||
if (!encoding) encoding = 'base64'; | ||
var internalHash = crypto.createHash('md5'); | ||
var internalHash = new Md5Wrapper().createMd5Hash(); | ||
internalHash.update(content, 'utf8'); | ||
@@ -555,3 +574,4 @@ return internalHash.digest(encoding); | ||
'copyCompletionTime': 'copy.completionTime', | ||
'copyStatusDescription': 'copy.statusDescription' | ||
'copyStatusDescription': 'copy.statusDescription', | ||
'publicAccess': 'publicAccessLevel' | ||
}; | ||
@@ -558,0 +578,0 @@ |
@@ -153,2 +153,5 @@ // | ||
// For range get, 'x-ms-blob-content-md5' indicate the overall MD5 of the blob. Try to set the contentMD5 using this header if it presents | ||
setBlobPropertyFromHeaders('contentSettings.contentMD5', HeaderConstants['BLOB_CONTENT_MD5']); | ||
_.chain(headersForProperties).pairs().each(function (pair) { | ||
@@ -159,2 +162,3 @@ var property = pair[0]; | ||
}); | ||
}; | ||
@@ -161,0 +165,0 @@ |
@@ -73,2 +73,6 @@ // | ||
if (!containerResult.publicAccessLevel) { | ||
containerResult.publicAccessLevel = BlobUtilities.BlobContainerPublicAccessType.OFF; | ||
} | ||
return containerResult; | ||
@@ -75,0 +79,0 @@ }; |
@@ -91,2 +91,3 @@ // | ||
'contentSettings.contentMD5': 'CONTENT_MD5', | ||
'contentSettings.fileContentMD5': 'FILE_CONTENT_MD5', | ||
@@ -115,2 +116,5 @@ 'copy.id': 'COPY_ID', | ||
}; | ||
// For range get, 'x-ms-content-md5' indicate the overall MD5 of the file. Try to set the contentMD5 using this header if it presents | ||
setFilePropertyFromHeaders('contentSettings.contentMD5', HeaderConstants['FILE_CONTENT_MD5']); | ||
@@ -126,4 +130,5 @@ setFilePropertyFromHeaders('etag', HeaderConstants.ETAG); | ||
setFilePropertyFromHeaders(property, header); | ||
}); | ||
} | ||
}); | ||
} | ||
}; | ||
@@ -130,0 +135,0 @@ |
@@ -131,3 +131,3 @@ // | ||
} | ||
if (Number.isNaN(value)) { | ||
if (azureutil.objectIsNaN(value)) { | ||
return 'NaN'; | ||
@@ -156,3 +156,3 @@ } | ||
case EdmType.INT32: | ||
if (typeof value !== 'number' || value === Number.POSITIVE_INFINITY || value === Number.NEGATIVE_INFINITY || (Number.isNaN(value))) { | ||
if (typeof value !== 'number' || value === Number.POSITIVE_INFINITY || value === Number.NEGATIVE_INFINITY || (azureutil.objectIsNaN(value))) { | ||
return true; | ||
@@ -159,0 +159,0 @@ } |
@@ -79,3 +79,3 @@ // | ||
} | ||
if (Number.isNaN(value)) { | ||
if (azureutil.objectIsNaN(value)) { | ||
return 'NaN'; | ||
@@ -82,0 +82,0 @@ } |
@@ -64,2 +64,3 @@ // | ||
* @param {int} [options.timeoutIntervalInMs] The server timeout interval, in milliseconds, to use for the request. | ||
* @param {int} [options.clientRequestTimeoutInMs] The timeout of client requests, in milliseconds, to use for the request. | ||
* @param {int} [options.maximumExecutionTimeInMs] The maximum execution time, in milliseconds, across all potential retries, to use when making this request. | ||
@@ -66,0 +67,0 @@ * The maximum execution time interval begins at the time that the client begins building the request. The maximum |
@@ -18,5 +18,4 @@ // | ||
// Module dependencies. | ||
var crypto = require('crypto'); | ||
var azureCommon = require('./../../../common/common'); | ||
var Md5Wrapper = require('./../../../common/md5-wrapper'); | ||
var StorageServiceClient = azureCommon.StorageServiceClient; | ||
@@ -55,3 +54,3 @@ var WebResource = azureCommon.WebResource; | ||
BatchResult._getBoundary = function () { | ||
return crypto.createHash('md5').update('' + (new Date()).getTime()).digest('hex'); | ||
return (new Md5Wrapper().createMd5Hash()).update('' + (new Date()).getTime()).digest('hex'); | ||
}; | ||
@@ -58,0 +57,0 @@ |
{ | ||
"name": "azure-storage", | ||
"author": "Microsoft Corporation", | ||
"version": "1.4.0", | ||
"version": "2.0.0", | ||
"description": "Microsoft Azure Storage Client Library for Node.js", | ||
@@ -23,5 +23,6 @@ "typings": "typings/azure-storage/azure-storage.d.ts", | ||
"dependencies": { | ||
"browserify-mime": "~1.2.9", | ||
"extend": "~1.2.1", | ||
"browserify-mime": "~1.2.9", | ||
"json-edm-parser": "0.1.2", | ||
"md5.js": "1.3.4", | ||
"node-uuid": "~1.4.0", | ||
@@ -33,3 +34,4 @@ "readable-stream": "~2.0.0", | ||
"xml2js": "0.2.7", | ||
"xmlbuilder": "0.4.3" | ||
"xmlbuilder": "0.4.3", | ||
"md5.js": "1.3.4" | ||
}, | ||
@@ -36,0 +38,0 @@ "devDependencies": { |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
2289475
93
34430
11
+ Addedmd5.js@1.3.4
+ Addedhash-base@3.1.0(transitive)
+ Addedmd5.js@1.3.4(transitive)
+ Addedreadable-stream@3.6.2(transitive)
+ Addedsafe-buffer@5.2.1(transitive)
+ Addedstring_decoder@1.3.0(transitive)