
Research
/Security News
Fake imToken Chrome Extension Steals Seed Phrases via Phishing Redirects
Mixed-script homoglyphs and a lookalike domain mimic imToken’s import flow to capture mnemonics and private keys.
oss-client
Advanced tools
Alibaba cloud OSS(Object Storage Service) Node.js Client.
npm install oss-client
OSS, Object Storage Service. Equal to well known Amazon S3.
All operation use es7 async/await to implement. All api is async function.
npm install oss-client
Commonjs
const { OSSObject } = require('oss-client');
const ossObject = new OSSObject({
region: '<oss region>',
endpoint: '<oss endpoint>',
accessKeyId: '<Your accessKeyId>',
accessKeySecret: '<Your accessKeySecret>',
bucket: '<Your bucket name>',
});
TypeScript and ESM
import { OSSObject } from 'oss-client';
const ossObject = new OSSObject({
region: '<oss region>',
endpoint: '<oss endpoint>',
accessKeyId: '<Your accessKeyId>',
accessKeySecret: '<Your accessKeySecret>',
bucket: '<Your bucket name>',
});
Go to OSS website, create a new account for new user.
After account created, you can create the OSS instance and get the accessKeyId and accessKeySecret.
Each OSS instance required accessKeyId, accessKeySecret and bucket.
Create a Bucket store instance.
options:
region. Set as extranet domain name, intranet domain name, accelerated domain name, etc. according to different needs. please see endpointsoss-cn-hangzhou.false.
If your servers are running on aliyun too, you can set true to save lot of money.60s.'x-oss-request-payer': 'requester' to oss server.
the details you can see requestPayexample:
const { OSSObject } = require('oss-client');
const store = new OSSObject({
accessKeyId: 'your access key',
accessKeySecret: 'your access secret',
bucket: 'your bucket name',
region: 'oss-cn-hangzhou',
});
const { OSSObject } = require('oss-client');
const store = new OSSObject({
accessKeyId: 'your access key',
accessKeySecret: 'your access secret',
bucket: 'your bucket name',
endpoint: 'https://oss-accelerate.aliyuncs.com',
});
See https://help.aliyun.com/zh/oss/user-guide/map-custom-domain-names-5
const { OSSObject } = require('oss-client');
const store = new OSSObject({
accessKeyId: 'your access key',
accessKeySecret: 'your access secret',
cname: true,
// your custom domain endpoint
endpoint: 'https://my-static.domain.com',
});
All operations function return Promise, except signatureUrl.
Add an object to the bucket.
parameters:
name {String} object name store on OSS
file {String|Buffer|ReadStream} object local path, content buffer or ReadStream content instance use in Node, Blob and html5 File
[options] {Object} optional parameters
[timeout] {Number} the operation timeout
[mime] {String} custom mime, will send with Content-Type entity header
[meta] {Object} user meta, will send with x-oss-meta- prefix string
e.g.: { uid: 123, pid: 110 }
[callback] {Object} The callback parameter is composed of a JSON string encoded in Base64,detail see
url {String} After a file is uploaded successfully, the OSS sends a callback request to this URL.
[host] {String} The host header value for initiating callback requests.
body {String} The value of the request body when a callback is initiated, for example, key=${key}&etag=${etag}&my_var=${x:my_var}.
[contentType] {String} The Content-Type of the callback requests initiatiated, It supports application/x-www-form-urlencoded and application/json, and the former is the default value.
[customValue] {Object} Custom parameters are a map of key-values
e.g.:
var customValue = { var1: 'value1', var2: 'value2' };
[headers] {Object} extra headers
Cache-Control: public, no-cacheContent-Disposition: somenameContent-Encoding: gzipTue, 08 Dec 2020 13:49:43 GMTSuccess will return the object information.
object:
example:
const filepath = '/home/ossdemo/demo.txt';
store.put('ossdemo/demo.txt', filepath).then((result) => {
console.log(result);
});
{
name: 'ossdemo/demo.txt',
res: {
status: 200,
headers: {
date: 'Tue, 17 Feb 2015 13:28:17 GMT',
'content-length': '0',
connection: 'close',
etag: '"BF7A03DA01440845BC5D487B369BC168"',
server: 'AliyunOSS',
'x-oss-request-id': '54E341F1707AA0275E829244'
},
size: 0,
rt: 92
}
}
store.put('ossdemo/buffer', Buffer.from('foo content')).then((result) => {
console.log(result);
});
{
name: 'ossdemo/buffer',
url: 'http://demo.oss-cn-hangzhou.aliyuncs.com/ossdemo/buffer',
res: {
status: 200,
headers: {
date: 'Tue, 17 Feb 2015 13:28:17 GMT',
'content-length': '0',
connection: 'close',
etag: '"xxx"',
server: 'AliyunOSS',
'x-oss-request-id': '54E341F1707AA0275E829243'
},
size: 0,
rt: 92
}
}
const filepath = '/home/ossdemo/demo.txt';
store.put('ossdemo/readstream.txt', fs.createReadStream(filepath)).then((result) => {
console.log(result);
});
{
name: 'ossdemo/readstream.txt',
url: 'http://demo.oss-cn-hangzhou.aliyuncs.com/ossdemo/readstream.txt',
res: {
status: 200,
headers: {
date: 'Tue, 17 Feb 2015 13:28:17 GMT',
'content-length': '0',
connection: 'close',
etag: '"BF7A03DA01440845BC5D487B369BC168"',
server: 'AliyunOSS',
'x-oss-request-id': '54E341F1707AA0275E829242'
},
size: 0,
rt: 92
}
}
Add a stream object to the bucket.
parameters:
name {String} object name store on OSS
stream {ReadStream} object ReadStream content instance
[options] {Object} optional parameters
[contentLength] {Number} the stream length, chunked encoding will be used if absent
[timeout] {Number} the operation timeout
[mime] {String} custom mime, will send with Content-Type entity header
[meta] {Object} user meta, will send with x-oss-meta- prefix string
e.g.: { uid: 123, pid: 110 }
[callback] {Object} The callback parameter is composed of a JSON string encoded in Base64,detail see
url {String} After a file is uploaded successfully, the OSS sends a callback request to this URL.
[host] {String} The host header value for initiating callback requests.
body {String} The value of the request body when a callback is initiated, for example, key=${key}&etag=${etag}&my_var=${x:my_var}.
[contentType] {String} The Content-Type of the callback requests initiatiated, It supports application/x-www-form-urlencoded and application/json, and the former is the default value.
[customValue] {Object} Custom parameters are a map of key-values
e.g.:
var customValue = { var1: 'value1', var2: 'value2' };
[headers] {Object} extra headers, detail see RFC 2616
Cache-Control: public, no-cacheContent-Disposition: somenameContent-Encoding: gzipTue, 08 Dec 2020 13:49:43 GMTSuccess will return the object information.
object:
example:
const filepath = '/home/ossdemo/demo.txt';
store.putStream('ossdemo/readstream.txt', fs.createReadStream(filepath)).then((result) => {
console.log(result);
});
{
name: 'ossdemo/readstream.txt',
url: 'http://demo.oss-cn-hangzhou.aliyuncs.com/ossdemo/readstream.txt',
res: {
status: 200,
headers: {
date: 'Tue, 17 Feb 2015 13:28:17 GMT',
'content-length': '0',
connection: 'close',
etag: '"BF7A03DA01440845BC5D487B369BC168"',
server: 'AliyunOSS',
'x-oss-request-id': '54E341F1707AA0275E829242'
},
size: 0,
rt: 92
}
}
Append an object to the bucket, it's almost same as put, but it can add content to existing object rather than override it.
All parameters are same as put except for options.position
Content-Type entity headerx-oss-meta- prefix string
e.g.: { uid: 123, pid: 110 }Cache-Control: public, no-cacheContent-Disposition: somenameContent-Encoding: gzipTue, 08 Dec 2020 13:49:43 GMTobject:
example:
let object = await store.append('ossdemo/buffer', Buffer.from('foo'));
// append content to the existing object
object = await store.append('ossdemo/buffer', Buffer.from('bar'), {
position: object.nextAppendPosition,
});
Get the Object url.
If provide baseUrl, will use baseUrl instead the default bucket and endpoint.
Suggest use generateObjectUrl instead of getObjectUrl.
e.g.:
const url = store.generateObjectUrl('foo/bar.jpg');
// cdnUrl should be `https://${bucketname}.${endpotint}foo/bar.jpg`
const cdnUrl = store.generateObjectUrl(
'foo/bar.jpg',
'https://mycdn.domian.com'
);
// cdnUrl should be `https://mycdn.domian.com/foo/bar.jpg`
Head an object and get the meta info.
parameters:
Success will return the object's meta information.
object:
put(), will return null.
If return status 304, meta will be null tooexample:
await this.store.put('ossdemo/head-meta', Buffer.from('foo'), {
meta: {
uid: 1,
path: 'foo/demo.txt'
}
});
const object = await this.store.head('ossdemo/head-meta');
console.log(object);
{
status: 200,
meta: {
uid: '1',
path: 'foo/demo.txt'
},
res: { ... }
}
const object = await this.store.head('ossdemo/head-meta');
// will throw NoSuchKeyError
Get an object meta info include ETag、Size、LastModified and so on, not return object content.
parameters:
Success will return the object's meta information.
object:
example:
await this.store.put('ossdemo/object-meta', Buffer.from('foo'));
const object = await this.store.getObjectMeta('ossdemo/object-meta');
console.log(object);
{
status: 200,
res: { ... }
}
Get an object from the bucket.
parameters:
file is null or ignore this parameter, function will return info contains content property.x-oss-process
e.g.: {process: 'image/resize,w_200'}Range: bytes=0-9Success will return the info contains response.
object:
file parameter is null or ignoreIf object not exists, will throw NoSuchKeyError.
example:
const filepath = '/home/ossdemo/demo.txt';
await store.get('ossdemo/demo.txt', filepath);
_ Store object to a writestream
await store.get('ossdemo/demo.txt', somestream);
const result = await store.get('ossdemo/demo.txt');
console.log(Buffer.isBuffer(result.content));
const filepath = '/home/ossdemo/demo.png';
await store.get('ossdemo/demo.png', filepath, {
process: 'image/resize,w_200',
});
const filepath = '/home/ossdemo/demo.txt';
await store.get('ossdemo/not-exists-demo.txt', filepath);
// will throw NoSuchKeyError
const filepath = '/home/ossdemo/demo.txt';
const versionId = 'versionId string';
await store.get('ossdemo/not-exists-demo.txt', filepath, {
versionId,
});
Get an object read stream.
parameters:
x-oss-processSuccess will return the stream instance and response info.
object:
null.If object not exists, will throw NoSuchKeyError.
example:
const result = await store.getStream('ossdemo/demo.txt');
result.stream.pipe(fs.createWriteStream('some file.txt'));
Delete an object from the bucket.
parameters:
Success will return the info contains response.
object:
If delete object not exists, will also delete success.
example:
await store.delete('ossdemo/someobject');
await store.delete('ossdemo/some-not-exists-object');
const versionId = 'versionId';
await store.delete('ossdemo/some-not-exists-object', { versionId });
Copy an object from sourceName to name.
parameters:
sourceBucket is same bucket.x-oss-meta- prefix string
e.g.: { uid: 123, pid: 110 }
If the meta set, will override the source object meta.Success will return the copy result in data property.
object:
", e.g.: "5B3C1A2E053D763E1B002CC607C5A0FE"If source object not exists, will throw NoSuchKeyError.
example:
store.copy('newName', 'oldName').then(result => {
console.log(result);
});
store.copy('logo.png', 'logo.png', 'other-bucket').then(result => {
console.log(result);
});
const versionId = 'your verisonId';
store
.copy('logo.png', 'logo.png', 'other-bucket', { versionId })
.then(result => {
console.log(result);
});
Set an exists object meta.
parameters:
x-oss-meta- prefix string
e.g.: { uid: 123, pid: 110 }
If meta: null, will clean up the exists metaSuccess will return the putMeta result in data property.
2015-02-19T08:39:44.000Z", e.g.: "5B3C1A2E053D763E1B002CC607C5A0FE"If object not exists, will throw NoSuchKeyError.
example:
const result = await store.putMeta('ossdemo.txt', {
uid: 1,
pid: 'p123',
});
console.log(result);
await store.putMeta('ossdemo.txt', null);
Delete multi objects in one request.
parameters:
false, verbose mode
quiet mode: if all objects delete succes, return emtpy response.
otherwise return delete error object results.
verbose mode: return all object delete results.Success will return delete success objects in deleted property.
example:
const result = await store.deleteMulti(['obj1', 'obj2', 'obj3'], {
quiet: true,
});
const result = await store.deleteMulti(['obj1', 'obj2', 'obj3']);
const obj1 = {
key: 'key1',
versionId: 'versionId1',
};
const obj2 = {
key: 'key2',
versionId: 'versionId2',
};
const result = await store.deleteMulti([obj1, obj2]);
List objects in the bucket.
parameters:
null
prefix keymarker, including marker key/ only search current dir, not including subdir100, limit to 1000Success will return objects list on objects properties.
ObjectMeta will contains blow properties:
2015-02-19T08:39:44.000Z", e.g.: "5B3C1A2E053D763E1B002CC607C5A0FE"Normal344606Standardid and displayNameexample:
const result = await store.list();
console.log(result.objects);
fun/ dir including subdirs objectsconst result = await store.list({
prefix: 'fun/',
});
console.log(result.objects);
fun/ dir objects, not including subdirsconst result = await store.list({
prefix: 'fun/',
delimiter: '/',
});
console.log(result.objects);
List objects in the bucket.(recommended)
parameters:
null
prefix keycontinuationToken, including continuationToken key/ only search current dir, not including subdir100, limit to 1000Success will return objects list on objects properties.
objects {Array} object meta info list
Each ObjectMeta will contains blow properties:
2015-02-19T08:39:44.000Z", e.g.: "5B3C1A2E053D763E1B002CC607C5A0FE"Normal344606Standardid and displayNameprefixes {Array} prefix list
isTruncated {Boolean} truncate or not
nextContinuationToken {String} next continuation-token string
keyCount {Number} The number of keys returned for this request. If Delimiter is specified, KeyCount is the sum of the elements in Key and CommonPrefixes.
res {Object} response info, including
List top 10 objects
const result = await store.listV2({
'max-keys': 10,
});
console.log(result.objects);
fun/ dir including subdirs objectsconst result = await store.listV2({
prefix: 'fun/',
});
console.log(result.objects);
fun/ dir objects, not including subdirsconst result = await store.listV2({
prefix: 'fun/',
delimiter: '/',
});
console.log(result.objects);
a/ dir objects, after a/b and not include a/bconst result = await store.listV2({
delimiter: '/',
prefix: 'a/',
'start-after': 'a/b',
});
console.log(result.objects);
List the version information of all objects in the bucket, including the delete marker (Delete Marker).
parameters:
null
prefix keykeyMarker, including keyMarker key/ only search current dir, not including subdir100, limit to 1000Success will return objects list on objects properties.
ObjectMeta will contains blow properties:
2015-02-19T08:39:44.000Z", e.g.: "5B3C1A2E053D763E1B002CC607C5A0FE"Normal344606Standardid and displayNameObjectDeleteMarker
2015-02-19T08:39:44.000Zexample:
const result = await store.getBucketVersions();
console.log(result.objects);
console.log(result.deleteMarker);
const result = await store.getBucketVersions({
keyMarker: 'keyMarker',
});
console.log(result.objects);
const result = await store.getBucketVersions({
versionIdMarker: 'versionIdMarker',
keyMarker: 'keyMarker',
});
console.log(result.objects);
console.log(result.deleteMarker);
Create a signature url for download or upload object. When you put object with signatureUrl ,you need to pass Content-Type.Please look at the example.
parameters:
1800x-oss-process
e.g.: {process: 'image/resize,w_200'}819200~838860800.Success will return signature url.
example:
const url = store.signatureUrl('ossdemo.txt');
console.log(url);
// --------------------------------------------------
const url = store.signatureUrl('ossdemo.txt', {
expires: 3600,
method: 'PUT',
});
console.log(url);
// put object with signatureUrl
// -------------------------------------------------
const url = store.signatureUrl('ossdemo.txt', {
expires: 3600,
method: 'PUT',
'Content-Type': 'text/plain; charset=UTF-8',
});
console.log(url);
// --------------------------------------------------
const url = store.signatureUrl('ossdemo.txt', {
expires: 3600,
response: {
'content-type': 'text/custom',
'content-disposition': 'attachment',
},
});
console.log(url);
// put operation
const url = store.signatureUrl('ossdemo.png', {
process: 'image/resize,w_200',
});
console.log(url);
// --------------------------------------------------
const url = store.signatureUrl('ossdemo.png', {
expires: 3600,
process: 'image/resize,w_200',
});
console.log(url);
Basically the same as signatureUrl, if refreshSTSToken is configured asyncSignatureUrl will refresh stsToken
parameters:
1800x-oss-process
e.g.: {process: 'image/resize,w_200'}819200~838860800.Success will return signature url.
example:
const url = await store.asyncSignatureUrl('ossdemo.txt');
console.log(url);
// --------------------------------------------------
const url = await store.asyncSignatureUrl('ossdemo.txt', {
expires: 3600,
method: 'PUT',
});
console.log(url);
// put object with signatureUrl
// -------------------------------------------------
const url = await store.asyncSignatureUrl('ossdemo.txt', {
expires: 3600,
method: 'PUT',
'Content-Type': 'text/plain; charset=UTF-8',
});
console.log(url);
// --------------------------------------------------
const url = await store.asyncSignatureUrl('ossdemo.txt', {
expires: 3600,
response: {
'content-type': 'text/custom',
'content-disposition': 'attachment',
},
});
console.log(url);
// put operation
const url = await store.asyncSignatureUrl('ossdemo.png', {
process: 'image/resize,w_200',
});
console.log(url);
// --------------------------------------------------
const url = await store.asyncSignatureUrl('ossdemo.png', {
expires: 3600,
process: 'image/resize,w_200',
});
console.log(url);
Set object's ACL.
parameters:
Success will return:
example:
await store.putACL('ossdemo.txt', 'public-read');
const versionId = 'object versionId';
await store.putACL('ossdemo.txt', 'public-read', {
versionId,
});
Get object's ACL.
parameters:
Success will return:
example:
const result = await store.getACL('ossdemo.txt');
console.log(result.acl);
const versionId = 'object versionId';
const result = await store.getACL('ossdemo.txt', { versionId });
console.log(result.acl);
Restore Object.
parameters:
Success will return:
example:
const result = await store.restore('ossdemo.txt');
console.log(result.status);
const result = await store.restore('ossdemo.txt', { type: 'ColdArchive' });
console.log(result.status);
const result = await store.restore('ossdemo.txt', {
type: 'ColdArchive',
Days: 2,
});
console.log(result.status);
const versionId = 'object versionId';
const result = await store.restore('ossdemo.txt', { versionId });
console.log(result.status);
PutSymlink
parameters:
name {String} object name
targetName {String} target object name
[options] {Object} optional parameters
x-oss-meta- prefix stringres {Object} response info, including
example:
const options = {
storageClass: 'IA',
meta: {
uid: '1',
slus: 'test.html',
},
};
const result = await store.putSymlink('ossdemo.txt', 'targetName', options);
console.log(result.res);
putSymlink multiversion
const options = {
storageClass: 'IA',
meta: {
uid: '1',
slus: 'test.html',
},
};
const result = await store.putSymlink('ossdemo.txt', 'targetName', options);
console.log(result.res.headers['x-oss-version-id']);
GetSymlink
parameters:
Success will return
example:
const result = await store.getSymlink('ossdemo.txt');
console.log(result.targetName);
for history object
const versionId = 'object versionId';
const result = await store.getSymlink('ossdemo.txt', { versionId });
console.log(result.targetName);
get postObject params
parameters:
Success will return postObject Api params.
Object:
Obtains the tags of an object.
parameters:
Success will return the channel information.
object:
Configures or updates the tags of an object.
parameters:
{var1: value1,var2:value2}Success will return the channel information.
object:
Deletes the tag of a specified object.
parameters:
{var1: value1,var2:value2}Success will return the channel information.
object:
Persistency indicates that images are asynchronously stored in the specified Bucket
parameters:
Success will return the channel information.
object:
const sourceObject = 'a.png';
const targetObject = 'b.png';
const process =
'image/watermark,text_aGVsbG8g5Zu+54mH5pyN5Yqh77yB,color_ff6a00';
await this.store.processObjectSave(sourceObject, targetObject, process);
Each error return by OSS server will contains these properties:
The following table lists the OSS error codes:
| code | status | message | message in Chinese |
|---|---|---|---|
| AccessDenied | 403 | Access Denied | 拒绝访问 |
| BucketAlreadyExists | 409 | Bucket already exists | Bucket 已经存在 |
| BucketNotEmpty | 409 | Bucket is not empty | Bucket 不为空 |
| RestoreAlreadyInProgress | 409 | The restore operation is in progress. | restore 操作正在进行中 |
| OperationNotSupported | 400 | The operation is not supported for this resource | 该资源暂不支持restore操作 |
| EntityTooLarge | 400 | Entity too large | 实体过大 |
| EntityTooSmall | 400 | Entity too small | 实体过小 |
| FileGroupTooLarge | 400 | File group too large | 文件组过大 |
| InvalidLinkName | 400 | Link name can't be the same as the object name | Object Link 与指向的 Object 同名 |
| LinkPartNotExist | 400 | Can't link to not exists object | Object Link 中指向的 Object 不存在 |
| ObjectLinkTooLarge | 400 | Too many links to this object | Object Link 中 Object 个数过多 |
| FieldItemTooLong | 400 | Post form fields items too large | Post 请求中表单域过大 |
| FilePartInterity | 400 | File part has changed | 文件 Part 已改变 |
| FilePartNotExist | 400 | File part not exists | 文件 Part 不存在 |
| FilePartStale | 400 | File part stale | 文件 Part 过时 |
| IncorrectNumberOfFilesInPOSTRequest | 400 | Post request contains invalid number of files | Post 请求中文件个数非法 |
| InvalidArgument | 400 | Invalid format argument | 参数格式错误 |
| InvalidAccessKeyId | 400 | Access key id not exists | Access Key ID 不存在 |
| InvalidBucketName | 400 | Invalid bucket name | 无效的 Bucket 名字 |
| InvalidDigest | 400 | Invalid digest | 无效的摘要 |
| InvalidEncryptionAlgorithm | 400 | Invalid encryption algorithm | 指定的熵编码加密算法错误 |
| InvalidObjectName | 400 | Invalid object name | 无效的 Object 名字 |
| InvalidPart | 400 | Invalid part | 无效的 Part |
| InvalidPartOrder | 400 | Invalid part order | 无效的 part 顺序 |
| InvalidPolicyDocument | 400 | Invalid policy document | 无效的 Policy 文档 |
| InvalidTargetBucketForLogging | 400 | Invalid bucket on logging operation | Logging 操作中有无效的目标 bucket |
| Internal | 500 | OSS server internal error | OSS 内部发生错误 |
| MalformedXML | 400 | Malformed XML format | XML 格式非法 |
| MalformedPOSTRequest | 400 | Invalid post body format | Post 请求的 body 格式非法 |
| MaxPOSTPreDataLengthExceeded | 400 | Post extra data too large | Post 请求上传文件内容之外的 body 过大 |
| MethodNotAllowed | 405 | Not allowed method | 不支持的方法 |
| MissingArgument | 411 | Missing argument | 缺少参数 |
| MissingContentLength | 411 | Missing Content-Length header | 缺少内容长度 |
| NoSuchBucket | 404 | Bucket not exists | Bucket 不存在 |
| NoSuchKey | 404 | Object not exists | 文件不存在 |
| NoSuchUpload | 404 | Multipart upload id not exists | Multipart Upload ID 不存在 |
| NotImplemented | 501 | Not implemented | 无法处理的方法 |
| PreconditionFailed | 412 | Pre condition failed | 预处理错误 |
| RequestTimeTooSkewed | 403 | Request time exceeds 15 minutes to server time | 发起请求的时间和服务器时间超出 15 分钟 |
| RequestTimeout | 400 | Request timeout | 请求超时 |
| RequestIsNotMultiPartContent | 400 | Invalid post content-type | Post 请求 content-type 非法 |
| SignatureDoesNotMatch | 403 | Invalid signature | 签名错误 |
| TooManyBuckets | 400 | Too many buckets on this user | 用户的 Bucket 数目超过限制 |
| RequestError | -1 | network error | 网络出现中断或异常 |
| ConnectionTimeoutError | -2 | request connect timeout | 请求连接超时 |
| SecurityTokenExpired | 403 | sts Security Token Expired | sts Security Token 超时失效 |
Made with contributors-img.
FAQs
Aliyun OSS(Object Storage Service) Node.js Client
The npm package oss-client receives a total of 1,932 weekly downloads. As such, oss-client popularity was classified as popular.
We found that oss-client demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 2 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
Mixed-script homoglyphs and a lookalike domain mimic imToken’s import flow to capture mnemonics and private keys.

Security News
Latio’s 2026 report recognizes Socket as a Supply Chain Innovator and highlights our work in 0-day malware detection, SCA, and auto-patching.

Company News
Join Socket for live demos, rooftop happy hours, and one-on-one meetings during BSidesSF and RSA 2026 in San Francisco.