Research
Security News
Malicious PyPI Package ‘pycord-self’ Targets Discord Developers with Token Theft and Backdoor Exploit
Socket researchers uncover the risks of a malicious Python package targeting Discord developers.
@elastic.io/maester-client
Advanced tools
The official Elastic.io object-storage client.
This library propose you two clients: ObjectStorage
& ObjectStorageWrapper
.
Use ObjectStorageWrapper
to operate with data like string
, number
, object
, array
Use ObjectStorage
to operate attachments (also could be used for same purpose as ObjectStorageWrapper
)
Note: All the code snippets written in Typescript
REQUEST_MAX_RETRY - specifies amount of tries to repeat failed request if server/connection error occurred.
Default value: 2. Min value: 0. Max value: 4. If entered value is out of limits - default value will be used.
REQUEST_TIMEOUT - specifies the number of milliseconds before the request times out. If the request takes longer than 'timeout', the request will be aborted.
Default value: 10000 (10s). Min value: 500 (0.5s). Max value: 20000 (20s). If entered value is out of limits - default value will be used.
import { ObjectStorage, ObjectStorageWrapper } from '@elastic.io/maester-client';
const objectStorageWrapper = new ObjectStorageWrapper(this);
const objectStorage = new ObjectStorage(creds);
The method has the following signature:
async createObject(data: object, queryHeaders?: Header[], metaHeaders?: Header[], ttl?: number)
where
{ key: string, value: string }
, current maximum - 5 items. Where key
(must be lowercase) - searchable field name (see below in Get objects by query parameters
section), must be unique for whole array, if specified - value
must be specified as well; value
- searchable field value, if specified - key
must be specified as well. Optional{ key: string, value: string }
, where key
(must be lowercase) - meta field name, must be unique for whole array, if specified - value
must be specified as well; value
- meta field value, if specified - key
must be specified as well. Optionalconst obj = await objectStorageWrapper.createObject(data);
const obj = await objectStorageWrapper.createObject(data, [], [], 100000);
const obj = await objectStorageWrapper.createObject(
data,
[{key: 'somequeriablefieldkey', value: 'somequeriablefieldvalue'}],
[{key: 'somemetakey', value: 'somemetavalue'}],
60000
);
const obj = await objectStorageWrapper.createObject(
data,
[{key: 'anotherqueriablefieldkey', value: 'anotherqueriablefieldvalue'}, {key: 'anotherqueriablefieldkey2', value: 'anotherqueriablefieldvalue2'}],
[{key: 'somemetakey', value: 'somemetavalue'}],
60000
);
Returns JSON object. The method has the following signature:
async lookupObjectById(id: string)
where
const obj = await objectStorageWrapper.lookupObjectById(id);
The method has the following signature:
async lookupObjectsByQueryParameters(headers: Header[])
where
{ key: string, value: string }
, current maximum - 5 items. Where key
(must be lowercase) - searchable field name, must be unique for whole array, if specified - value
must be specified as well; value
- searchable field value, if specified - key
must be specified as well. RequiredIf you create an object with a queriable headers, internally it looks like this:
x-query-somequeriablefieldkey: somequeriablefieldvalue
x-query-anotherqueriablefieldkey: anotherqueriablefieldvalue
where 'x-query-' is a default prefix.
Using Maester REST API you can find this object by:
/objects?query[somequeriablefieldkey]=somequeriablefieldvalue&query[anotherqueriablefieldkey]=anotherqueriablefieldvalue
Using the library:
const objects = await objectStorageWrapper.lookupObjectsByQueryParameters([
{ key: 'somequeriablefieldkey', value: 'somequeriablefieldvalue' },
{ key: 'anotherqueriablefieldkey', value: 'anotherqueriablefieldvalue' }
]);
The method returns an array of items. It either is empty in case no objects found or contains objects
The method has the following signature:
async updateObject(id: string, data: object, queryHeaders?: Header[], metaHeaders?: Header[])
where
{ key: string, value: string }
, current maximum - 5 items. Where key
(must be lowercase) - searchable field name (see below in Get objects by query parameters
section), must be unique for whole array, if specified - value
must be specified as well; value
- searchable field value, if specified - key
must be specified as well. Note: queryHeaders could be added to an existing object and modified as well, but they can not be deleted. Optional{ key: string, value: string }
, where key
(must be lowercase) - meta field name, must be unique for whole array, if specified - value
must be specified as well; value
- meta field value, if specified - key
must be specified as well. Note: metaHeaders could be added to an existing object and modified as well, but they can not be deleted. Optionalconst obj = await objectStorageWrapper.updateObject(id, data);
const obj = await objectStorageWrapper.updateObject(
id,
data,
[{ key: 'somequeriablefieldkey', value: 'somequeriablefieldvalue' }, { key: 'anotherqueriablefieldkey', value: 'anotherqueriablefieldvalue' }]
);
const obj = await objectStorageWrapper.updateObject(
id,
data,
[{key: 'anotherqueriablefieldkey', value: 'anotherqueriablefieldvalue'}, {key: 'anotherqueriablefieldkey2', value: 'anotherqueriablefieldvalue2'}],
[{key: 'somemetakey', value: 'somemetavalue'}]
);
The method has the following signature:
async deleteObjectById(id: string)
where
const obj = await objectStorageWrapper.deleteObjectById(id);
The method has the following signature:
async deleteObjectsByQueryParameters(headers: Header[])
where
{ key: string, value: string }
, current maximum - 5 items. Where key
(must be lowercase) - searchable field name, must be unique for whole array, if specified - value
must be specified as well; value
- searchable field value, if specified - key
must be specified as well. Requiredconst obj = await objectStorageWrapper.deleteObjectsByQueryParameters([{key: 'somequeriablefieldkey', value: 'somequeriablefieldvalue'}]);
The method has the following signature:
async add(dataOrFunc: uploadData | (() => Promise<Readable>), reqWithBodyOptions?: ReqWithBodyOptions)
where
const obj = await objectStorage.add(data, { headers: {'x-query-somequeriablefieldkey': 'somequeriablefieldvalue'} });
const getAttachAsStream = async () => (await axios.get('https://img.jpg', { responseType: 'stream' })).data;
const obj = await objectStorage.add(getAttachAsStream, { retryOptions: { retriesCount: 5, requestTimeout: 60000 } });
);
The method has the following signature:
async getOne(objectId: string, reqOptions: ReqOptions = {})
where
const { data, headers } = await objectStorage.getOne(id);
const { data: stream, headers } = await objectStorage.getOne(id, { responseType: 'stream'});
The method has the following signature:
async getAllByParams(params: object, reqOptions: ReqOptions = {})
where
Examples:
const obj = await objectStorage.getAllByParams({ 'query[field]': 'value' });
The method returns an array of items. It either is empty in case no objects found or contains objects
The method has the following signature:
async update(objectId: string, dataOrFunc: uploadData | (() => Promise<Readable>), reqWithBodyOptions?: ReqWithBodyOptions)
where
const obj = await objectStorage.update(data, { headers: {'x-query-somequeriablefieldkey': 'somequeriablefieldvalue'} });
const getAttachAsStream = async () => (await axios.get('https://img.jpg', { responseType: 'stream' })).data;
const obj = await objectStorage.update(getAttachAsStream);
);
The method has the following signature:
async deleteOne(objectId: string, reqOptions: ReqOptions = {})
where
const obj = await objectStorage.deleteOne(id);
const obj = await objectStorage.deleteOne(id, { retryOptions: { retriesCount: 5, requestTimeout: 60000 } });
The method has the following signature:
async deleteAllByParams(params: object, reqOptions: ReqOptions = {})
where
const obj = await objectStorage.deleteAllByParams({ 'query[field]': 'value' });
The method has the following signature:
async use(forward: TransformMiddleware, reverse: TransformMiddleware)
where
Create
and Update
object operations (add
, update
methods).Get
object operations (getOne
, getAllByParams
methods).The method has the following signature:
async getHeaders(objectId: string, reqOptions: ReqOptions = {})
where
Create
and Update
object operations (add
, update
methods).Get
object operations (getOne
, getAllByParams
methods).All errors thrown by library are instances of ObjectStorageClientError
class. Check exported Errors
property for a
list of all errors classes and their properties.
ObjectStorage
and ObjectStorageWrapper
could'n process undefined
as values for upsert value. Also value undefined
in array will be converted to null
, e.g
[1, 'str', undefined, null, { d: 2 }]
will be saved as [1, 'str', null, null, { d: 2 }]
const objectId = await objectStorage.add({ a: 2 }, { headers: { 'content-type': 'some-type' } })
- object will be stored with 'content-type': 'some-type'
. But if you are going to update this object without passing same custom 'content-type' (await objectStorage.update(objectId, { a: 3 })
) - object 'content-type' will be calculated automatically, and in this case will be set to 'application/json'.FAQs
The official object-storage client
We found that @elastic.io/maester-client demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 0 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket researchers uncover the risks of a malicious Python package targeting Discord developers.
Security News
The UK is proposing a bold ban on ransomware payments by public entities to disrupt cybercrime, protect critical services, and lead global cybersecurity efforts.
Security News
Snyk's use of malicious npm packages for research raises ethical concerns, highlighting risks in public deployment, data exfiltration, and unauthorized testing.