- Added for SWIFT storage only: When calling the 'connection' function, you can now specify the interface (admin/public/internal) in the Swift configuration. This ensures that the SDK picks the correct endpoints from the Swift server, preventing inconsistencies. Example of auth configuration for Swift with interface:
const swift = storageSDK([{
username : 'user',
password : 'password',
authUrl : 'url',
region : 'region',
interface : 'admin' // or public, or internal
}]);
- Updated dependency "aws4" version from "1.12.0" to "1.13.2"
- Updated dev dependency "mocha/eslint/nock"
- Lint code with new eslint configuration
- S3 and Swift
deleteFiles
improved: For the second argument, you must provide a list of files, it can be:
- A list of String, each string is the filename: ["file1.png", "file2.docx"]
- Or a list of objects with
key
as attribute for the filename: [{"key": "file1.png"}, {"key": "file2.docx"}]
- Or a list of objects with
name
as attribute for the filename: [{"name": "file1.png"}, {"name": "file2.docx"}]
- NEW Or a list of objects with a custom key for filenames, you must define
fileNameKey
as option (third argument). Usage example with a custom key name:
const files = [
{ filename: 'invoice-1.pdf'},
{ filename: 'contract-2021.docx'},
]
storage.deleteFiles('bucket-name', files, { fileNameKey: "filename" }, (err, resp) => {
})
- S3 methods patched: A request can only request one time each region.
- Fixed SWIFT authentication: the
region
value is case insensitive, it can be GRA
or gra
.
- New major version to make S3 and Swift methods identical (function arguments and callback functions)
- SWIFT Breaking changes:
- All callback function are returning now
(err, resp) => {}
. The resp
object contains { body, headers, statusCode }
- Updated
listFiles
: On success, the JSON body is automatically converted into a Javascript Object. If the body returned is not application/json
, the raw body is returned.
- Added: Container aliases are now supported for all methods
- SWIFT New methods:
deleteFiles
to bulk delete files
headBucket
to determine if a bucket (container) exists and you have permission to access it
listBucket
to return a list of all buckets (containers) owned by the authenticated sender of the request. On success, the JSON body is automatically converted into a Javascript Object. If the body returned is not application/json
, the raw body is returned.
setRockReqDefaults
to configure the HTTP client
- SWIFT Code change: important refactoring
- SWIFT updated:
- The authentication object does not require the
tenantName
attribute anymore, it is now optional.
swift.uploadFile
: The 3rd argument accepts a function returning a ReadStream, in addition to the Buffer and the absolute path of the file
- Updated dev npm packages:
eslint
to 8.45.0
nock
to =13.3.2
- Patched
s3.deleteFiles
: the XML body includes object names without encoding. Previously, objects with special character was encoded (encodeURIComponent), and S3 did not delete them.
- Patched
s3.setFileMetadata
: Bucket aliases are now supported and are not generating a 403 error anymore.
- Patched rock-req options initialisation
- Updated package
rock-req
to 5.1.3
- Updated to a singleton pattern: the
require('tiny-storage-client')({ config-S3-or-SWIFT })
return a new storage instance. Meaning, existing instances are not overwritten anymore when creating a new one.
- Updated package
rock-req
to 5.1.2
- Patched loading module
xmlToJson.js
- Updated setting defaults of rock-req by propagating the object instead of assigning.
- Updated package
rock-req
to 5.1.1
- Added the possibility to set defaults rock-req values:
- Added function
setRockReqDefaults
and getRockReqDefaults
- Or create the global variable
global.rockReqConf
, it must be initialised before calling require('tiny-storage-client')
- Added for all S3 methods: the options argument can takes the option
requestOptions
object, it will be merged into the HTTP request options. Example to upload a file: storage.uploadFile('bucket', 'file.pdf', Buffer.from(fileXml), { requestOptions: { tenantId: 200, headers: { "custom-option" : true } } }, (err, resp) => {})
- Replaced
simple-get
by rock-req
package (0 deps, bench: 21797 req/s and streams fully tested)
- To download a file as stream, you have to provide an
output
function as option. The output
function must return the output stream, and it is invoked by rock-req
for every request and retries. If something goes wrong, the Writable stream is destroyed automatically, and the error can be captured with 'error' event or stream.finished
. When the callback is called, the streamed is finised.
The stream:true
boolean options to get an HTTP response a Stream is removed, and replaced by the output: () => { return OutputStream }
option (Explained above).
- Fixed Bucket aliases generating a false AWS4 signature
- Removed unused code
- Updated documentation
- the
request
function accept an option stream:true
to get the HTTP response as a stream, instead of a content as Buffer, such as: request(method, path, { headers, queries, body, stream: true }, (err, resp) => {})
.
- Removed
debug
package
- Add function to create custom request to the object storage. Prototype:
request(method, path, { headers, queries, body }, (err, body, headers) => {})
. The base URL requests by default the account, passing an empty string will request the account details. For container requests, pass the container name, such as: /{container}
. For file requests, pass the container and the file, such as: /{container}/{filename}
. Object Storage Swift API specification: https://docs.openstack.org/api-ref/object-store/
- Add function
setFileMetadata
to create or replace object metadata
- Add function
getFileMetadata
to get an object metadata
- Updated package
debug
to 4.3.4
- Updated package
simple-get
to 4.0.1
- Fixed the
downloadFile
callback function, the third argument is now always returning the response header of the request.
- Added
setLogFunction
used to Override the log function. It takes to arguments: message
as a string, level
as a string and can be: info
/warning
/error
. Example to use:
storage.setLogFunction((message, level) => {
console.log(`${level} : ${message}`);
})
- Fixed
connection
fallback on error & add tests
- Fixed
uploadFile
: return the response body if an error occurs
- Added parallel tests
- Fix the automatic fallback when multiple clients are using all functions in parallel
- Renamed
getFiles
function to listFiles
- Renamed
writeFile
function to uploadFile
- Renamed
readFile
function to downloadFile
- Added: Pass a list of object storage credential to the constructor, the sdk will automatically connect to another storage if something goes wrong (Server or DNS not responding, timeout, error 500, too many redirection, and more...)
- Added: the method
uploadFile
accepts a new optionnal fourth argument option
: { queries: { temp_url_expires: '1440619048' }, headers: { X-Object-Meta-LocationOrigin: 'Paris/France' }
. List of query parameters and headers: https://docs.openstack.org/api-ref/object-store/?expanded=create-or-replace-object-detail#create-or-replace-object
- Updated
writeFile
function : it can take a Buffer as an argument
- Methods to interact with the OVH Object Storage:
- writeFile: upload a file
- readFile: download a file
- deleteFile: delete a file
- a new authentication token is requested when the authentication token is not valid during a request