Socket
Socket
Sign inDemoInstall

libsql-stateless-easy

Package Overview
Dependencies
1
Maintainers
1
Versions
47
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 1.6.8 to 1.6.9

6

dist/main.d.ts

@@ -34,2 +34,8 @@ import { libsqlSQLValue, libsqlSQLStatement, libsqlBatchReqStepExecCond, libsqlBatchReqStep, libsqlStatementResOkData, libsqlBatchStreamResOkData, libsqlStreamResErrData } from 'libsql-stateless';

fetch?: Function;
/** Check if the LibSQL server is compatible with this client.
*
* This involves making a HTTP request when constructing the client.
* By default, this is enabled. Set to false to disable.
*/
checkServer?: boolean;
}

@@ -36,0 +42,0 @@ /** Row returned from an SQL statement.

4

dist/main.js
import { libsqlExecute, libsqlBatch, libsqlServerCompatCheck } from 'libsql-stateless';
var rt=Object.defineProperty;var st=(t,e,r)=>e in t?rt(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var l=(t,e,r)=>(st(t,typeof e!="symbol"?e+"":e,r),r);var h=typeof Buffer=="function",C=typeof btoa=="function",L=typeof atob=="function",T=t=>atob(t),k=t=>btoa(t),O=t=>Buffer.from(t).toString("base64"),U=t=>Buffer.from(t,"binary").toString("base64"),v=t=>Buffer.from(t,"base64"),M=t=>Buffer.from(t,"base64").toString("binary");var nt="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",d=Array.prototype.slice.call(nt),m=(t=>{let e={};return t.forEach((r,s)=>e[r]=s),e})(d),ot=/^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/,at=t=>{let e,r,s,n,o="",i=t.length%3;for(let u=0;u<t.length;){if((r=t.charCodeAt(u++))>255||(s=t.charCodeAt(u++))>255||(n=t.charCodeAt(u++))>255)throw new TypeError("invalid character found");e=r<<16|s<<8|n,o+=d[e>>18&63]+d[e>>12&63]+d[e>>6&63]+d[e&63];}return i?o.slice(0,i-3)+"===".substring(i):o},it=C?t=>k(t):h?t=>U(t):at,lt=t=>t.replace(/=/g,"").replace(/[+\/]/g,e=>e=="+"?"-":"_"),I=h?t=>O(t):t=>{let r=[];for(let s=0,n=t.length;s<n;s+=4096){let o=[];t.subarray(s,s+4096).forEach(i=>o.push(i.valueOf())),r.push(b.apply(null,o));}return it(r.join(""))},b=String.fromCharCode.bind(String),N=(t,e=!1)=>e?lt(I(t)):I(t),Q=t=>t.replace(/[^A-Za-z0-9\+\/]/g,""),ct=t=>{if(t=t.replace(/\s+/g,""),!ot.test(t))throw new TypeError("malformed base64.");t+="==".slice(2-(t.length&3));let e,r="",s,n;for(let o=0;o<t.length;)e=m[t.charAt(o++)]<<18|m[t.charAt(o++)]<<12|(s=m[t.charAt(o++)])<<6|(n=m[t.charAt(o++)]),r+=s===64?b(e>>16&255):n===64?b(e>>16&255,e>>8&255):b(e>>16&255,e>>8&255,e&255);return r},ut=L?t=>T(Q(t)):h?t=>M(t):ct,P=typeof Uint8Array.from=="function"?Uint8Array.from.bind(Uint8Array):t=>new Uint8Array(Array.prototype.slice.call(t,0)),pt=h?t=>P(v(t)):t=>P(ut(t).split("").map(e=>e.charCodeAt(0))),ft=t=>Q(t.replace(/[-_]/g,e=>e=="-"?"+":"/")),V=t=>pt(ft(t));var a=class extends Error{constructor(r,s,n){super(`${s}: ${r}`,{cause:n});l(this,"code");l(this,"rawCode");this.code=s,this.rawCode=void 0,this.name="LibsqlError";}},q=class extends a{constructor(e){super(e,"HRANA_PROTO_ERROR",new class extends Error{constructor(){super(e),this.name="ProtoError";}});}},c=class extends a{constructor(e,r){super(e,r.code||"UNKNOWN",new class extends Error{constructor(){super(e);l(this,"proto");this.name="ResponseError",this.proto=r,this.stack=void 0;}});}},p=class extends a{constructor(e,r){super(e,"SERVER_ERROR",new class extends Error{constructor(){super(e);l(this,"status");this.status=r,this.name="HttpServerError";}});}},f=class extends a{constructor(e){super(e,"INTERNAL_ERROR",new class extends Error{constructor(){super(e),this.name="InternalError";}});}},y=class extends a{constructor(e){super(e,"UNKNOWN",new class extends Error{constructor(){super(e),this.name="MisuseError";}});}};function D(t){if(t===null)return {type:"null"};if(typeof t=="bigint")return {type:"integer",value:""+t};if(typeof t=="number")return {type:"float",value:t};if(typeof t=="string")return {type:"text",value:t};if(t instanceof Uint8Array)return {type:"blob",base64:N(t)};throw new f("Invalid type of input. Cannot build request to server.")}function S(t){if(typeof t!="string"){if(Object.prototype.toString.call(t.args)==="[object Array]")return {sql:t.sql,args:t.args.map(e=>D(e)),want_rows:t.want_rows};{let e=[],r=t.args;for(let s in r)e.push({name:s,value:D(r[s])});return {sql:t.sql,named_args:e,want_rows:t.want_rows}}}return {sql:t}}var _={ok:t=>({type:"ok",step:t}),error:t=>({type:"error",step:t}),not:t=>({type:"not",cond:t}),and:t=>({type:"and",conds:t}),or:t=>({type:"or",conds:t}),is_autocommit:()=>({type:"is_autocommit"})};function j(t,e){return t.map((r,s)=>({stmt:S(r),condition:e[s]||void 0}))}function ht(t){if(t==="write")return {stmt:{sql:"BEGIN IMMEDIATE"}};if(t==="read")return {stmt:{sql:"BEGIN TRANSACTION READONLY"}};if(t==="deferred")return {stmt:{sql:"BEGIN DEFERRED"}};throw RangeError('Unknown transaction mode, supported values are "write", "read" and "deferred"')}function dt(t){return [{stmt:{sql:"COMMIT"},condition:{type:"ok",step:t}},{stmt:{sql:"ROLLBACK"},condition:{type:"not",cond:{type:"ok",step:t+1}}}]}function F(t,e){let r=t.map((s,n)=>({stmt:S(s),condition:_.ok(n)}));return [ht(e)].concat(r).concat(dt(r.length))}function mt(t,e="number"){switch(e){case"number":return +t;case"string":return t;case"bigint":return BigInt(t);default:throw new y('Invalid value for "intMode".')}}function bt(t,e){switch(t.type){case"null":return null;case"integer":return mt(t.value,e);case"float":return Number(t.value);case"text":return t.value;case"blob":return V(t.base64);default:throw new q("Invalid data type from server. Cannot parse.")}}function g(t,e){let r=[];for(let n=0;n<t.rows.length;n++){let o={};Object.defineProperty(o,"length",{value:t.rows[n].length});for(let i=0;i<t.rows[n].length;i++){let u=bt(t.rows[n][i],e);Object.defineProperty(o,i,{value:u});let w=t.cols[i].name;w!==void 0&&!Object.hasOwn(o,w)&&Object.defineProperty(o,w,{value:u,enumerable:!0});}r.push(o);}let s={rows:r,columns:t.cols.map(n=>n.name||""),columnTypes:t.cols.map(n=>n.decltype||""),rowsAffected:t.affected_row_count,lastInsertRowid:t.last_insert_rowid?BigInt(t.last_insert_rowid):void 0,rowsRead:t.rows_read,rowsWritten:t.rows_written,queryDurationMS:t.query_duration_ms};return {...s,toJSON:()=>s}}function x(t,e){return t.step_results.map((r,s)=>{var n;if(r)return g(r,e);if(t.step_errors[s])throw new c(((n=t.step_errors[s])==null?void 0:n.message)||"",t.step_errors[s]);return null})}function H(t,e){let r=x(t,e);return r.slice(1,r.length-2).filter(s=>s!==null)}async function G(t,e){let r=await libsqlExecute({db_url:t.url,authToken:t.authToken},S(e));if(r.isOk)return g(r.val,t.intMode);throw r.err.kind==="LIBSQL_SERVER_ERROR"?new p(r.err.server_message||"Server encountered error.",r.err.http_status_code):new c(r.err.data.message,r.err.data)}async function Vt(t,e,r){let s=await libsqlBatch({db_url:t.url,authToken:t.authToken},j(e,r));if(s.isOk)return x(s.val,t.intMode);throw s.err.kind==="LIBSQL_SERVER_ERROR"?new p(s.err.server_message||"Server encountered error.",s.err.http_status_code):new c(s.err.data.message,s.err.data)}async function R(t){return !!(await libsqlServerCompatCheck({db_url:t.url,authToken:t.authToken})).isOk}async function W(t,e,r="deferred"){let s=await libsqlBatch({db_url:t.url,authToken:t.authToken},F(e,r));if(s.isOk)return H(s.val,t.intMode);throw s.err.kind==="LIBSQL_SERVER_ERROR"?new p(s.err.server_message||"Server encountered error.",s.err.http_status_code):new c(s.err.data.message,s.err.data)}async function z(t,e){let r=e.split(";").filter(n=>n.trim()!=="").map((n,o)=>({stmt:{sql:n},condition:_.ok(o-1)}));r[0].condition=void 0;let s=await libsqlBatch({db_url:t.url,authToken:t.authToken},r);if(!s.isOk)throw s.err.kind==="LIBSQL_SERVER_ERROR"?new p(s.err.server_message||"Server encountered error.",s.err.http_status_code):new c(s.err.data.message,s.err.data)}var K=typeof fetch=="function",Z=typeof console.error=="function";var J=typeof URL=="function",$=t=>console.error(t),Y=t=>new URL(t),X=t=>globalThis.fetch=t;function tt(t){if(!K)if(t.fetch)X(t.fetch);else throw new a("No global fetch. Please provide one.","NO_GLOBAL_FETCH");try{if(!R(t))throw new a("Server incompatible. Please upgrade your libSQL server.","OUT_OF_DATE_SERVER")}catch{throw new a("The fetch function is non functional.","FETCH_FUCKED")}}function B(t){Z&&$(t);}function et(t){if((()=>{if(J)try{let r=Y(t);return !(r.protocol==="https:"||r.protocol==="http:")}catch(r){throw new a(r.message,"ERR_INVALID_URL",r)}else if(t.startsWith("https://")||t.startsWith("http://"))return !1;return !0})())throw new a('This is a HTTP client and only supports "https:" and "http:" URLs.',"URL_SCHEME_NOT_SUPPORTED")}var A=class{constructor(e){l(this,"conf");l(this,"closed");l(this,"protocol");et(e.url),tt(e),this.conf=e,this.closed=!1,this.protocol="http";}async execute(e){return await G(this.conf,e)}async batch(e,r){return await W(this.conf,e,r)}async transaction(e){throw new f("'libsql-stateless' is stateless and does not support interactive transactions. Use this.batch() instead.")}async executeMultiple(e){return await z(this.conf,e)}async sync(){B("'libsql-stateless' is remote only so nothing to sync.");}close(){B("'libsql-stateless' is stateless therefore no connection to close.");}async serverOk(){return await R(this.conf)}};function Jt(t){return new A(t)}
var st=Object.defineProperty;var nt=(t,e,r)=>e in t?st(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var l=(t,e,r)=>(nt(t,typeof e!="symbol"?e+"":e,r),r);var h=typeof Buffer=="function",C=typeof btoa=="function",T=typeof atob=="function",L=t=>atob(t),k=t=>btoa(t),O=t=>Buffer.from(t).toString("base64"),U=t=>Buffer.from(t,"binary").toString("base64"),v=t=>Buffer.from(t,"base64"),M=t=>Buffer.from(t,"base64").toString("binary");var ot="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",d=Array.prototype.slice.call(ot),b=(t=>{let e={};return t.forEach((r,s)=>e[r]=s),e})(d),at=/^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/,it=t=>{let e,r,s,n,o="",i=t.length%3;for(let u=0;u<t.length;){if((r=t.charCodeAt(u++))>255||(s=t.charCodeAt(u++))>255||(n=t.charCodeAt(u++))>255)throw new TypeError("invalid character found");e=r<<16|s<<8|n,o+=d[e>>18&63]+d[e>>12&63]+d[e>>6&63]+d[e&63];}return i?o.slice(0,i-3)+"===".substring(i):o},lt=C?t=>k(t):h?t=>U(t):it,ct=t=>t.replace(/=/g,"").replace(/[+\/]/g,e=>e=="+"?"-":"_"),I=h?t=>O(t):t=>{let r=[];for(let s=0,n=t.length;s<n;s+=4096){let o=[];t.subarray(s,s+4096).forEach(i=>o.push(i.valueOf())),r.push(m.apply(null,o));}return lt(r.join(""))},m=String.fromCharCode.bind(String),N=(t,e=!1)=>e?ct(I(t)):I(t),Q=t=>t.replace(/[^A-Za-z0-9\+\/]/g,""),ut=t=>{if(t=t.replace(/\s+/g,""),!at.test(t))throw new TypeError("malformed base64.");t+="==".slice(2-(t.length&3));let e,r="",s,n;for(let o=0;o<t.length;)e=b[t.charAt(o++)]<<18|b[t.charAt(o++)]<<12|(s=b[t.charAt(o++)])<<6|(n=b[t.charAt(o++)]),r+=s===64?m(e>>16&255):n===64?m(e>>16&255,e>>8&255):m(e>>16&255,e>>8&255,e&255);return r},pt=T?t=>L(Q(t)):h?t=>M(t):ut,P=typeof Uint8Array.from=="function"?Uint8Array.from.bind(Uint8Array):t=>new Uint8Array(Array.prototype.slice.call(t,0)),ft=h?t=>P(v(t)):t=>P(pt(t).split("").map(e=>e.charCodeAt(0))),ht=t=>Q(t.replace(/[-_]/g,e=>e=="-"?"+":"/")),V=t=>ft(ht(t));var a=class extends Error{constructor(r,s,n){super(`${s}: ${r}`,{cause:n});l(this,"code");l(this,"rawCode");this.code=s,this.rawCode=void 0,this.name="LibsqlError";}},q=class extends a{constructor(e){super(e,"HRANA_PROTO_ERROR",new class extends Error{constructor(){super(e),this.name="ProtoError";}});}},c=class extends a{constructor(e,r){super(e,r.code||"UNKNOWN",new class extends Error{constructor(){super(e);l(this,"proto");this.name="ResponseError",this.proto=r,this.stack=void 0;}});}},p=class extends a{constructor(e,r){super(e,"SERVER_ERROR",new class extends Error{constructor(){super(e);l(this,"status");this.status=r,this.name="HttpServerError";}});}},f=class extends a{constructor(e){super(e,"INTERNAL_ERROR",new class extends Error{constructor(){super(e),this.name="InternalError";}});}},y=class extends a{constructor(e){super(e,"UNKNOWN",new class extends Error{constructor(){super(e),this.name="MisuseError";}});}};function D(t){if(t===null)return {type:"null"};if(typeof t=="bigint")return {type:"integer",value:""+t};if(typeof t=="number")return {type:"float",value:t};if(typeof t=="string")return {type:"text",value:t};if(t instanceof Uint8Array)return {type:"blob",base64:N(t)};throw new f("Invalid type of input. Cannot build request to server.")}function S(t){if(typeof t!="string"){if(Object.prototype.toString.call(t.args)==="[object Array]")return {sql:t.sql,args:t.args.map(e=>D(e)),want_rows:t.want_rows};{let e=[],r=t.args;for(let s in r)e.push({name:s,value:D(r[s])});return {sql:t.sql,named_args:e,want_rows:t.want_rows}}}return {sql:t}}var _={ok:t=>({type:"ok",step:t}),error:t=>({type:"error",step:t}),not:t=>({type:"not",cond:t}),and:t=>({type:"and",conds:t}),or:t=>({type:"or",conds:t}),is_autocommit:()=>({type:"is_autocommit"})};function j(t,e){return t.map((r,s)=>({stmt:S(r),condition:e[s]||void 0}))}function dt(t){if(t==="write")return {stmt:{sql:"BEGIN IMMEDIATE"}};if(t==="read")return {stmt:{sql:"BEGIN TRANSACTION READONLY"}};if(t==="deferred")return {stmt:{sql:"BEGIN DEFERRED"}};throw RangeError('Unknown transaction mode, supported values are "write", "read" and "deferred"')}function bt(t){return [{stmt:{sql:"COMMIT"},condition:{type:"ok",step:t}},{stmt:{sql:"ROLLBACK"},condition:{type:"not",cond:{type:"ok",step:t+1}}}]}function F(t,e){let r=t.map((s,n)=>({stmt:S(s),condition:_.ok(n)}));return [dt(e)].concat(r).concat(bt(r.length))}function mt(t,e="number"){switch(e){case"number":return +t;case"string":return t;case"bigint":return BigInt(t);default:throw new y('Invalid value for "intMode".')}}function qt(t,e){switch(t.type){case"null":return null;case"integer":return mt(t.value,e);case"float":return Number(t.value);case"text":return t.value;case"blob":return V(t.base64);default:throw new q("Invalid data type from server. Cannot parse.")}}function g(t,e){let r=[];for(let n=0;n<t.rows.length;n++){let o={};Object.defineProperty(o,"length",{value:t.rows[n].length});for(let i=0;i<t.rows[n].length;i++){let u=qt(t.rows[n][i],e);Object.defineProperty(o,i,{value:u});let w=t.cols[i].name;w!==void 0&&!Object.hasOwn(o,w)&&Object.defineProperty(o,w,{value:u,enumerable:!0});}r.push(o);}let s={rows:r,columns:t.cols.map(n=>n.name||""),columnTypes:t.cols.map(n=>n.decltype||""),rowsAffected:t.affected_row_count,lastInsertRowid:t.last_insert_rowid?BigInt(t.last_insert_rowid):void 0,rowsRead:t.rows_read,rowsWritten:t.rows_written,queryDurationMS:t.query_duration_ms};return {...s,toJSON:()=>s}}function x(t,e){return t.step_results.map((r,s)=>{var n;if(r)return g(r,e);if(t.step_errors[s])throw new c(((n=t.step_errors[s])==null?void 0:n.message)||"",t.step_errors[s]);return null})}function H(t,e){let r=x(t,e);return r.slice(1,r.length-2).filter(s=>s!==null)}async function G(t,e){let r=await libsqlExecute({db_url:t.url,authToken:t.authToken},S(e));if(r.isOk)return g(r.val,t.intMode);throw r.err.kind==="LIBSQL_SERVER_ERROR"?new p(r.err.server_message||"Server encountered error.",r.err.http_status_code):new c(r.err.data.message,r.err.data)}async function Dt(t,e,r){let s=await libsqlBatch({db_url:t.url,authToken:t.authToken},j(e,r));if(s.isOk)return x(s.val,t.intMode);throw s.err.kind==="LIBSQL_SERVER_ERROR"?new p(s.err.server_message||"Server encountered error.",s.err.http_status_code):new c(s.err.data.message,s.err.data)}async function R(t){return !!(await libsqlServerCompatCheck({db_url:t.url,authToken:t.authToken})).isOk}async function W(t,e,r="deferred"){let s=await libsqlBatch({db_url:t.url,authToken:t.authToken},F(e,r));if(s.isOk)return H(s.val,t.intMode);throw s.err.kind==="LIBSQL_SERVER_ERROR"?new p(s.err.server_message||"Server encountered error.",s.err.http_status_code):new c(s.err.data.message,s.err.data)}async function z(t,e){let r=e.split(";").filter(n=>n.trim()!=="").map((n,o)=>({stmt:{sql:n},condition:_.ok(o-1)}));r[0].condition=void 0;let s=await libsqlBatch({db_url:t.url,authToken:t.authToken},r);if(!s.isOk)throw s.err.kind==="LIBSQL_SERVER_ERROR"?new p(s.err.server_message||"Server encountered error.",s.err.http_status_code):new c(s.err.data.message,s.err.data)}var K=typeof fetch=="function",Z=typeof console.error=="function",J=typeof globalThis=="object",$=typeof URL=="function",Y=t=>console.error(t),X=t=>new URL(t),tt=t=>globalThis.fetch=t;function et(t){if(!K&&t.fetch&&J)tt(t.fetch);else throw new a("No global fetch. Please provide one.","NO_GLOBAL_FETCH");if(t.checkServer)try{if(!R(t))throw new a("Server incompatible. Please upgrade your libSQL server.","OUT_OF_DATE_SERVER")}catch{throw new a("The fetch function is non functional.","FETCH_FUCKED")}}function B(t){Z&&Y(t);}function rt(t){if((()=>{if($)try{let r=X(t);return !(r.protocol==="https:"||r.protocol==="http:")}catch(r){throw new a(r.message,"ERR_INVALID_URL",r)}else if(t.startsWith("https://")||t.startsWith("http://"))return !1;return !0})())throw new a('This is a HTTP client and only supports "https:" and "http:" URLs.',"URL_SCHEME_NOT_SUPPORTED")}var A=class{constructor(e){l(this,"conf");l(this,"closed");l(this,"protocol");rt(e.url),et(e),this.conf=e,this.closed=!1,this.protocol="http";}async execute(e){return await G(this.conf,e)}async batch(e,r){return await W(this.conf,e,r)}async transaction(e){throw new f("'libsql-stateless' is stateless and does not support interactive transactions. Use this.batch() instead.")}async executeMultiple(e){return await z(this.conf,e)}async sync(){B("'libsql-stateless' is remote only so nothing to sync.");}close(){B("'libsql-stateless' is stateless therefore no connection to close.");}async serverOk(){return await R(this.conf)}};function $t(t){return new A(t)}
export { p as HttpServerError, f as InternalError, a as LibsqlError, y as MisuseError, q as ProtoError, c as ResponseError, Jt as createClient, Vt as libsqlBatch, _ as libsqlBatchReqStepExecCondBuilder, j as libsqlBatchReqStepsBuilder, x as libsqlBatchStreamResParser, W as libsqlBatchTransaction, A as libsqlClient, G as libsqlExecute, z as libsqlExecuteMultiple, R as libsqlServerCompatCheck, S as libsqlStatementBuilder, g as libsqlStatementResParser, F as libsqlTransactionBatchReqStepsBuilder, H as libsqlTransactionBatchStreamResParser, ht as libsqlTransactionBeginStatement, dt as libsqlTransactionEndStatements, D as libsqlValueBuilder, bt as libsqlValueParser };
export { p as HttpServerError, f as InternalError, a as LibsqlError, y as MisuseError, q as ProtoError, c as ResponseError, $t as createClient, Dt as libsqlBatch, _ as libsqlBatchReqStepExecCondBuilder, j as libsqlBatchReqStepsBuilder, x as libsqlBatchStreamResParser, W as libsqlBatchTransaction, A as libsqlClient, G as libsqlExecute, z as libsqlExecuteMultiple, R as libsqlServerCompatCheck, S as libsqlStatementBuilder, g as libsqlStatementResParser, F as libsqlTransactionBatchReqStepsBuilder, H as libsqlTransactionBatchStreamResParser, dt as libsqlTransactionBeginStatement, bt as libsqlTransactionEndStatements, D as libsqlValueBuilder, qt as libsqlValueParser };
{
"name": "libsql-stateless-easy",
"version": "1.6.8",
"version": "1.6.9",
"description": "thin libSQL stateless http driver for TypeScript and JavaScript but easy",

@@ -5,0 +5,0 @@ "homepage": "https://github.com/DaBigBlob/libsql-stateless-easy#readme",

Sorry, the diff of this file is not supported yet

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