Socket
Socket
Sign inDemoInstall

stream-chat

Package Overview
Dependencies
41
Maintainers
1
Versions
283
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 0.1.11 to 0.1.12

68

dist/channel.js

@@ -943,2 +943,11 @@ "use strict";

}()
/**
* banUser - Bans a user from a channel
*
* @param targetUserID
* @param timeout
* @param reason
* @returns {Promise<*>}
*/
}, {

@@ -949,4 +958,3 @@ key: "banUser",

/*#__PURE__*/
_regenerator.default.mark(function _callee17(targetUserID, timeout, banIP, reason) {
var data;
_regenerator.default.mark(function _callee17(targetUserID, timeout, reason) {
return _regenerator.default.wrap(function _callee17$(_context17) {

@@ -959,14 +967,11 @@ while (1) {

_context17.next = 3;
return this.client.post(this.client.baseURL + '/ban', (0, _objectSpread2.default)({
target_user_id: targetUserID,
return this.client.banUser(targetUserID, (0, _objectSpread2.default)({
timeout: timeout,
reason: reason,
banIP: banIP
reason: reason
}, this._channelParams()));
case 3:
data = _context17.sent;
return _context17.abrupt("return", data);
return _context17.abrupt("return", _context17.sent);
case 5:
case 4:
case "end":

@@ -979,3 +984,3 @@ return _context17.stop();

function banUser(_x17, _x18, _x19, _x20) {
function banUser(_x17, _x18, _x19) {
return _banUser.apply(this, arguments);

@@ -987,2 +992,41 @@ }

/**
* banUser - Removes the bans for a user on a channel
*
* @param targetUserID
* @returns {Promise<*>}
*/
}, {
key: "unbanUser",
value: function () {
var _unbanUser = (0, _asyncToGenerator2.default)(
/*#__PURE__*/
_regenerator.default.mark(function _callee18(targetUserID) {
return _regenerator.default.wrap(function _callee18$(_context18) {
while (1) {
switch (_context18.prev = _context18.next) {
case 0:
this._checkInitialized();
_context18.next = 3;
return this.client.unbanUser(targetUserID, this._channelParams());
case 3:
return _context18.abrupt("return", _context18.sent);
case 4:
case "end":
return _context18.stop();
}
}
}, _callee18, this);
}));
function unbanUser(_x20) {
return _unbanUser.apply(this, arguments);
}
return unbanUser;
}()
/**
* on - Listen to events on this channel.

@@ -1059,3 +1103,3 @@ *

if (event.type === 'typing.start') {
s.typing = s.typing.set(event.user.id, new Date());
s.typing = s.typing.set(event.user.id, (0, _seamlessImmutable.default)(event.user));
} else if (event.type === 'typing.stop') {

@@ -1116,3 +1160,3 @@ s.typing = s.typing.without(event.user.id);

user_details: this.client.userDetails,
user_token: this.client.userToken,
// user_token: this.client.userToken,
client_id: this.client.clientID,

@@ -1119,0 +1163,0 @@ type: this.type,

328

dist/client.js

@@ -1062,9 +1062,18 @@ "use strict";

}()
/**
* updateUsers - Batch update the list of users
*
* @param {array} A list of users
*
* @return {object}
*/
}, {
key: "banUser",
key: "updateUsers",
value: function () {
var _banUser = (0, _asyncToGenerator2.default)(
var _updateUsers = (0, _asyncToGenerator2.default)(
/*#__PURE__*/
_regenerator.default.mark(function _callee11(targetUserID, options) {
var defaultOptions;
_regenerator.default.mark(function _callee11(users) {
var userMap, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, userObject;
return _regenerator.default.wrap(function _callee11$(_context11) {

@@ -1074,15 +1083,76 @@ while (1) {

case 0:
defaultOptions = {
block_ip: false
};
options = (0, _objectSpread2.default)({}, options, defaultOptions);
_context11.next = 4;
return this.post(this.baseURL + '/moderation/ban', (0, _objectSpread2.default)({
target_user_id: targetUserID
}, options, this._clientParams()));
userMap = {};
_iteratorNormalCompletion2 = true;
_didIteratorError2 = false;
_iteratorError2 = undefined;
_context11.prev = 4;
_iterator2 = users[Symbol.iterator]();
case 4:
case 6:
if (_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done) {
_context11.next = 14;
break;
}
userObject = _step2.value;
if (userObject.id) {
_context11.next = 10;
break;
}
throw Error('User ID is required when updating a user');
case 10:
userMap[userObject.id] = userObject;
case 11:
_iteratorNormalCompletion2 = true;
_context11.next = 6;
break;
case 14:
_context11.next = 20;
break;
case 16:
_context11.prev = 16;
_context11.t0 = _context11["catch"](4);
_didIteratorError2 = true;
_iteratorError2 = _context11.t0;
case 20:
_context11.prev = 20;
_context11.prev = 21;
if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
_iterator2.return();
}
case 23:
_context11.prev = 23;
if (!_didIteratorError2) {
_context11.next = 26;
break;
}
throw _iteratorError2;
case 26:
return _context11.finish(23);
case 27:
return _context11.finish(20);
case 28:
_context11.next = 30;
return this.post(this.baseURL + '/users/edit', (0, _objectSpread2.default)({
users: userMap
}, this._clientParams()));
case 30:
return _context11.abrupt("return", _context11.sent);
case 5:
case 31:
case "end":

@@ -1092,17 +1162,24 @@ return _context11.stop();

}
}, _callee11, this);
}, _callee11, this, [[4, 16, 20, 28], [21,, 23, 27]]);
}));
function banUser(_x22, _x23) {
return _banUser.apply(this, arguments);
function updateUsers(_x22) {
return _updateUsers.apply(this, arguments);
}
return banUser;
return updateUsers;
}()
/** banUser - bans a user from all channels
*
* @param targetUserID
* @param options
* @returns {Promise<*>}
*/
}, {
key: "muteUser",
key: "banUser",
value: function () {
var _muteUser = (0, _asyncToGenerator2.default)(
var _banUser = (0, _asyncToGenerator2.default)(
/*#__PURE__*/
_regenerator.default.mark(function _callee12(targetUserID) {
_regenerator.default.mark(function _callee12(targetUserID, options) {
return _regenerator.default.wrap(function _callee12$(_context12) {

@@ -1113,5 +1190,5 @@ while (1) {

_context12.next = 2;
return this.post(this.baseURL + '/moderation/mute', (0, _objectSpread2.default)({
return this.post(this.baseURL + '/moderation/ban', (0, _objectSpread2.default)({
target_user_id: targetUserID
}, this._clientParams()));
}, options));

@@ -1129,14 +1206,20 @@ case 2:

function muteUser(_x24) {
return _muteUser.apply(this, arguments);
function banUser(_x23, _x24) {
return _banUser.apply(this, arguments);
}
return muteUser;
return banUser;
}()
/** unbanUser - revoke global ban for a user
*
* @param targetUserID
* @returns {Promise<*>}
*/
}, {
key: "unmuteUser",
key: "unbanUser",
value: function () {
var _unmuteUser = (0, _asyncToGenerator2.default)(
var _unbanUser = (0, _asyncToGenerator2.default)(
/*#__PURE__*/
_regenerator.default.mark(function _callee13(targetUserID) {
_regenerator.default.mark(function _callee13(targetUserID, options) {
return _regenerator.default.wrap(function _callee13$(_context13) {

@@ -1147,5 +1230,5 @@ while (1) {

_context13.next = 2;
return this.post(this.baseURL + '/moderation/unmute', (0, _objectSpread2.default)({
return this.delete(this.baseURL + '/moderation/ban', (0, _objectSpread2.default)({
target_user_id: targetUserID
}, this._clientParams()));
}, options));

@@ -1163,14 +1246,20 @@ case 2:

function unmuteUser(_x25) {
return _unmuteUser.apply(this, arguments);
function unbanUser(_x25, _x26) {
return _unbanUser.apply(this, arguments);
}
return unmuteUser;
return unbanUser;
}()
/** muteUser - mutes a user
*
* @param targetUserID
* @returns {Promise<*>}
*/
}, {
key: "flagMessage",
key: "muteUser",
value: function () {
var _flagMessage = (0, _asyncToGenerator2.default)(
var _muteUser = (0, _asyncToGenerator2.default)(
/*#__PURE__*/
_regenerator.default.mark(function _callee14(messageID) {
_regenerator.default.mark(function _callee14(targetUserID) {
return _regenerator.default.wrap(function _callee14$(_context14) {

@@ -1181,4 +1270,4 @@ while (1) {

_context14.next = 2;
return this.post(this.baseURL + '/moderation/flag', (0, _objectSpread2.default)({
target_message_id: messageID
return this.post(this.baseURL + '/moderation/mute', (0, _objectSpread2.default)({
target_user_id: targetUserID
}, this._clientParams()));

@@ -1197,14 +1286,20 @@

function flagMessage(_x26) {
return _flagMessage.apply(this, arguments);
function muteUser(_x27) {
return _muteUser.apply(this, arguments);
}
return flagMessage;
return muteUser;
}()
/** unmuteUser - mutes a user
*
* @param targetUserID
* @returns {Promise<*>}
*/
}, {
key: "flagUser",
key: "unmuteUser",
value: function () {
var _flagUser = (0, _asyncToGenerator2.default)(
var _unmuteUser = (0, _asyncToGenerator2.default)(
/*#__PURE__*/
_regenerator.default.mark(function _callee15(userID) {
_regenerator.default.mark(function _callee15(targetUserID) {
return _regenerator.default.wrap(function _callee15$(_context15) {

@@ -1215,4 +1310,4 @@ while (1) {

_context15.next = 2;
return this.post(this.baseURL + '/moderation/flag', (0, _objectSpread2.default)({
target_user_id: userID
return this.post(this.baseURL + '/moderation/unmute', (0, _objectSpread2.default)({
target_user_id: targetUserID
}, this._clientParams()));

@@ -1231,12 +1326,12 @@

function flagUser(_x27) {
return _flagUser.apply(this, arguments);
function unmuteUser(_x28) {
return _unmuteUser.apply(this, arguments);
}
return flagUser;
return unmuteUser;
}()
}, {
key: "unflagMessage",
key: "flagMessage",
value: function () {
var _unflagMessage = (0, _asyncToGenerator2.default)(
var _flagMessage = (0, _asyncToGenerator2.default)(
/*#__PURE__*/

@@ -1249,3 +1344,3 @@ _regenerator.default.mark(function _callee16(messageID) {

_context16.next = 2;
return this.post(this.baseURL + '/moderation/unflag', (0, _objectSpread2.default)({
return this.post(this.baseURL + '/moderation/flag', (0, _objectSpread2.default)({
target_message_id: messageID

@@ -1265,12 +1360,12 @@ }, this._clientParams()));

function unflagMessage(_x28) {
return _unflagMessage.apply(this, arguments);
function flagMessage(_x29) {
return _flagMessage.apply(this, arguments);
}
return unflagMessage;
return flagMessage;
}()
}, {
key: "unflagUser",
key: "flagUser",
value: function () {
var _unflagUser = (0, _asyncToGenerator2.default)(
var _flagUser = (0, _asyncToGenerator2.default)(
/*#__PURE__*/

@@ -1283,3 +1378,3 @@ _regenerator.default.mark(function _callee17(userID) {

_context17.next = 2;
return this.post(this.baseURL + '/moderation/unflag', (0, _objectSpread2.default)({
return this.post(this.baseURL + '/moderation/flag', (0, _objectSpread2.default)({
target_user_id: userID

@@ -1299,3 +1394,67 @@ }, this._clientParams()));

function unflagUser(_x29) {
function flagUser(_x30) {
return _flagUser.apply(this, arguments);
}
return flagUser;
}()
}, {
key: "unflagMessage",
value: function () {
var _unflagMessage = (0, _asyncToGenerator2.default)(
/*#__PURE__*/
_regenerator.default.mark(function _callee18(messageID) {
return _regenerator.default.wrap(function _callee18$(_context18) {
while (1) {
switch (_context18.prev = _context18.next) {
case 0:
_context18.next = 2;
return this.post(this.baseURL + '/moderation/unflag', (0, _objectSpread2.default)({
target_message_id: messageID
}, this._clientParams()));
case 2:
return _context18.abrupt("return", _context18.sent);
case 3:
case "end":
return _context18.stop();
}
}
}, _callee18, this);
}));
function unflagMessage(_x31) {
return _unflagMessage.apply(this, arguments);
}
return unflagMessage;
}()
}, {
key: "unflagUser",
value: function () {
var _unflagUser = (0, _asyncToGenerator2.default)(
/*#__PURE__*/
_regenerator.default.mark(function _callee19(userID) {
return _regenerator.default.wrap(function _callee19$(_context19) {
while (1) {
switch (_context19.prev = _context19.next) {
case 0:
_context19.next = 2;
return this.post(this.baseURL + '/moderation/unflag', (0, _objectSpread2.default)({
target_user_id: userID
}, this._clientParams()));
case 2:
return _context19.abrupt("return", _context19.sent);
case 3:
case "end":
return _context19.stop();
}
}
}, _callee19, this);
}));
function unflagUser(_x32) {
return _unflagUser.apply(this, arguments);

@@ -1312,3 +1471,3 @@ }

}, data);
return this.post(this.baseURL + '/channels', channelData);
return this.post(this.baseURL + '/channeltypes', channelData);
}

@@ -1318,3 +1477,3 @@ }, {

value: function getChannelType(channelType) {
return this.get(this.baseURL + "/channels/".concat(channelType));
return this.get(this.baseURL + "/channeltypes/".concat(channelType));
}

@@ -1324,3 +1483,3 @@ }, {

value: function updateChannelType(channelType, data) {
return this.put(this.baseURL + "/channels/".concat(channelType), data);
return this.put(this.baseURL + "/channeltypes/".concat(channelType), data);
}

@@ -1330,4 +1489,9 @@ }, {

value: function deleteChannelType(channelType) {
return this.delete(this.baseURL + "/channels/".concat(channelType));
return this.delete(this.baseURL + "/channeltypes/".concat(channelType));
}
}, {
key: "listChannelTypes",
value: function listChannelTypes() {
return this.get(this.baseURL + "/channeltypes");
}
/**

@@ -1346,10 +1510,10 @@ * updateMessage - Update the given message

/*#__PURE__*/
_regenerator.default.mark(function _callee18(message) {
_regenerator.default.mark(function _callee20(message) {
var clonedMessage, reservedMessageFields;
return _regenerator.default.wrap(function _callee18$(_context18) {
return _regenerator.default.wrap(function _callee20$(_context20) {
while (1) {
switch (_context18.prev = _context18.next) {
switch (_context20.prev = _context20.next) {
case 0:
if (message.id) {
_context18.next = 2;
_context20.next = 2;
break;

@@ -1363,3 +1527,3 @@ }

delete clonedMessage.id;
reservedMessageFields = ['reactions', 'own_reactions', 'reply_count', 'created_at', 'updated_at', 'html', 'command', 'type'];
reservedMessageFields = ['latest_reactions', 'own_reactions', 'reply_count', 'created_at', 'updated_at', 'html', 'command', 'type'];
reservedMessageFields.forEach(function (item) {

@@ -1371,3 +1535,3 @@ if (clonedMessage[item] != null) {

});
_context18.next = 8;
_context20.next = 8;
return this.post(this.baseURL + "/messages/".concat(message.id), (0, _objectSpread2.default)({

@@ -1378,13 +1542,13 @@ message: clonedMessage

case 8:
return _context18.abrupt("return", _context18.sent);
return _context20.abrupt("return", _context20.sent);
case 9:
case "end":
return _context18.stop();
return _context20.stop();
}
}
}, _callee18, this);
}, _callee20, this);
}));
function updateMessage(_x30) {
function updateMessage(_x33) {
return _updateMessage.apply(this, arguments);

@@ -1400,22 +1564,22 @@ }

/*#__PURE__*/
_regenerator.default.mark(function _callee19(messageID) {
return _regenerator.default.wrap(function _callee19$(_context19) {
_regenerator.default.mark(function _callee21(messageID) {
return _regenerator.default.wrap(function _callee21$(_context21) {
while (1) {
switch (_context19.prev = _context19.next) {
switch (_context21.prev = _context21.next) {
case 0:
_context19.next = 2;
_context21.next = 2;
return this.delete(this.baseURL + "/messages/".concat(messageID), (0, _objectSpread2.default)({}, this._clientParams()));
case 2:
return _context19.abrupt("return", _context19.sent);
return _context21.abrupt("return", _context21.sent);
case 3:
case "end":
return _context19.stop();
return _context21.stop();
}
}
}, _callee19, this);
}, _callee21, this);
}));
function deleteMessage(_x31) {
function deleteMessage(_x34) {
return _deleteMessage.apply(this, arguments);

@@ -1422,0 +1586,0 @@ }

@@ -22,2 +22,4 @@ "use strict";

var _utils = require("./utils");
/**

@@ -97,3 +99,2 @@ * StableWSConnection - A WS connection that reconnects upon failure.

} else {
// reconnect if its an abnormal failure
_this.consecutiveFailures += 1;

@@ -104,6 +105,9 @@ _this.totalFailures += 1;

_this.rejectPromise(_this._errorFromWSEvent(event)); // reconnect if its an abnormal failure
_this._reconnect();
}
});
(0, _defineProperty2.default)(this, "onerror", function (wsID) {
(0, _defineProperty2.default)(this, "onerror", function (wsID, event) {
if (_this.wsID !== wsID) return;

@@ -115,2 +119,4 @@ _this.consecutiveFailures += 1;

_this.rejectPromise(_this._errorFromWSEvent(event));
_this._reconnect();

@@ -139,2 +145,8 @@ });

});
(0, _defineProperty2.default)(this, "_errorFromWSEvent", function (event) {
var error = new Error("WS failed with code ".concat(event.code));
error.code = event.code;
error.isWSFailure = true;
return error;
});
(0, _defineProperty2.default)(this, "_listenForConnectionChanges", function () {

@@ -161,4 +173,7 @@ if (typeof window !== 'undefined') {

}).then(function (e) {
e.data = JSON.parse(e.data);
return e;
try {
return JSON.parse(e.data);
} catch (e) {
return {};
}
});

@@ -219,7 +234,16 @@ });

case 0:
_context.prev = 0;
_context.next = 3;
if (!this.isConnecting) {
_context.next = 2;
break;
}
throw Error("You've called connect twice, can only attempt 1 connection at the time");
case 2:
_context.prev = 2;
this.isConnecting = true;
_context.next = 6;
return this._connect();
case 3:
case 6:
healthCheck = _context.sent;

@@ -235,10 +259,16 @@ this.isConnecting = false;

case 11:
_context.prev = 11;
_context.t0 = _context["catch"](0);
case 14:
_context.prev = 14;
_context.t0 = _context["catch"](2);
// This is a permanent failure, throw the error...
this.isConnecting = false;
if (_context.t0.isWSFailure) {
_context.next = 19;
break;
}
throw _context.t0;
case 15:
case 19:
case "end":

@@ -248,3 +278,3 @@ return _context.stop();

}
}, _callee, this, [[0, 11]]);
}, _callee, this, [[2, 14]]);
}));

@@ -275,3 +305,3 @@

this._removeConnectionListeners(); // rest the wsID;
this._removeConnectionListeners(); // reset the wsID;

@@ -302,9 +332,4 @@

value: function _connect() {
if (this.isConnecting) {
throw Error("You've called connect twice, can only attempt 1 connection at the time");
}
this._setupConnectionPromise();
this.isConnecting = true;
this.ws = new _isomorphicWs.default(this.wsURL);

@@ -334,3 +359,3 @@ this.ws.onopen = this.onopen.bind(this, this.wsID);

case 0:
if (!this.isConnecting) {
if (!(this.isConnecting || this.isHealthy)) {
_context2.next = 2;

@@ -343,4 +368,5 @@ break;

case 2:
// reconnect in case of on error or on close
this.isConnecting = true; // reconnect in case of on error or on close
// also reconnect if the health check cycle fails
if (interval === undefined) {

@@ -354,7 +380,11 @@ interval = this._retryInterval();

_context2.prev = 4;
_context2.next = 7;
return (0, _utils.sleep)(interval);
case 7:
_context2.prev = 7;
_context2.next = 10;
return this._connect();
case 7:
case 10:
open = _context2.sent;

@@ -364,13 +394,16 @@ this.recoverCallback(open);

this.consecutiveFailures = 0;
_context2.next = 17;
_context2.next = 21;
break;
case 13:
_context2.prev = 13;
_context2.t0 = _context2["catch"](4);
case 16:
_context2.prev = 16;
_context2.t0 = _context2["catch"](7);
this.isConnecting = false;
console.warn("reconnect failed with error", _context2.t0); // reconnect on WS failures, dont reconnect if there is a code bug
this._reconnect();
if (_context2.t0.isWSFailure) {
this._reconnect();
}
case 17:
case 21:
case "end":

@@ -380,3 +413,3 @@ return _context2.stop();

}
}, _callee2, this, [[4, 13]]);
}, _callee2, this, [[7, 16]]);
}));

@@ -409,8 +442,11 @@

if (this.ws && this.ws.removeAllListeners) {
this.ws.removeAllListeners();
}
try {
if (this.ws && this.ws.removeAllListeners) {
this.ws.removeAllListeners();
}
if (this.ws && this.ws.close) {
this.ws.close();
if (this.ws && this.ws.close) {
this.ws.close();
}
} catch (e) {// we dont care
}

@@ -436,2 +472,7 @@ }

var interval = Math.round(Math.random() * (max - min) + min);
if (interval < 1000) {
interval = 1000;
}
return interval;

@@ -438,0 +479,0 @@ }

@@ -25,8 +25,7 @@ "use strict";

var Permission = function Permission(name) {
var action = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Allow;
var owner = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
var priority = arguments.length > 3 ? arguments[3] : undefined;
var resources = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : AnyResource;
var roles = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : AnyRole;
var Permission = function Permission(name, priority) {
var resources = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : AnyResource;
var roles = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : AnyRole;
var owner = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
var action = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : Allow;
(0, _classCallCheck2.default)(this, Permission);

@@ -42,5 +41,5 @@ this.name = name;

exports.Permission = Permission;
var AllowAll = new Permission('Allow all', Allow, false, MaxPriority, AnyResource, AnyRole);
var AllowAll = new Permission('Allow all', MaxPriority, AnyResource, AnyRole, false, Allow);
exports.AllowAll = AllowAll;
var DenyAll = new Permission('Deny all', Deny, false, MinPriority, AnyResource, AnyRole);
var DenyAll = new Permission('Deny all', MinPriority, AnyResource, AnyRole, false, Deny);
exports.DenyAll = DenyAll;

@@ -7,2 +7,3 @@ "use strict";

exports.logChatPromiseExecution = logChatPromiseExecution;
exports.sleep = void 0;

@@ -22,2 +23,10 @@ /**

});
}
}
var sleep = function sleep(m) {
return new Promise(function (r) {
return setTimeout(r, m);
});
};
exports.sleep = sleep;
{
"name": "stream-chat",
"version": "0.1.11",
"version": "0.1.12",
"description": "JS SDK for the Stream Chat API",

@@ -35,3 +35,4 @@ "author": "GetStream",

"@babel/cli": "^7.1.5",
"@babel/core": "^7.1.6",
"@babel/core": "^7.2.2",
"@babel/node": "^7.2.2",
"@babel/plugin-proposal-class-properties": "^7.1.0",

@@ -60,2 +61,3 @@ "@babel/plugin-transform-async-to-generator": "^7.2.0",

"build": "babel src --out-dir dist --ignore node_modules",
"start": "babel src -w --out-dir dist --ignore node_modules",
"prettier": "npx prettier --list-different '**/*.{js,ts,md,css,scss,json}' .eslintrc.json .prettierrc .babelrc",

@@ -62,0 +64,0 @@ "prettier-fix": "npx prettier --write '**/*.{js,ts,md,css,scss,json}' .eslintrc.json .prettierrc .babelrc",

SocketSocket SOC 2 Logo

Product

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

Packages

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc