New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@logto/client

Package Overview
Dependencies
Maintainers
1
Versions
54
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@logto/client - npm Package Compare versions

Comparing version 1.1.2 to 2.0.0

./lib/index.cjs

9

lib/errors.d.ts

@@ -1,11 +0,8 @@

import type { NormalizeKeyPaths } from '@silverhand/essentials';
declare const logtoClientErrorCodes: Readonly<{
sign_in_session: {
invalid: string;
not_found: string;
};
'sign_in_session.invalid': "Invalid sign-in session.";
'sign_in_session.not_found': "Sign-in session not found.";
not_authenticated: "Not authenticated.";
fetch_user_info_failed: "Unable to fetch user info. The access token may be invalid.";
}>;
export type LogtoClientErrorCode = NormalizeKeyPaths<typeof logtoClientErrorCodes>;
export type LogtoClientErrorCode = keyof typeof logtoClientErrorCodes;
export declare class LogtoClientError extends Error {

@@ -12,0 +9,0 @@ code: LogtoClientErrorCode;

@@ -1,28 +0,10 @@

'use strict';
var get = require('lodash.get');
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
var get__default = /*#__PURE__*/_interopDefault(get);
const logtoClientErrorCodes = Object.freeze({
sign_in_session: {
invalid: 'Invalid sign-in session.',
not_found: 'Sign-in session not found.',
},
'sign_in_session.invalid': 'Invalid sign-in session.',
'sign_in_session.not_found': 'Sign-in session not found.',
not_authenticated: 'Not authenticated.',
fetch_user_info_failed: 'Unable to fetch user info. The access token may be invalid.',
});
const getMessageByErrorCode = (errorCode) => {
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
const message = get__default.default(logtoClientErrorCodes, errorCode);
if (typeof message === 'string') {
return message;
}
return errorCode;
};
class LogtoClientError extends Error {
constructor(code, data) {
super(getMessageByErrorCode(code));
super(logtoClientErrorCodes[code]);
this.code = code;

@@ -33,2 +15,2 @@ this.data = data;

exports.LogtoClientError = LogtoClientError;
export { LogtoClientError };
import type { IdTokenClaims, UserInfoResponse, InteractionMode } from '@logto/js';
import type { Nullable } from '@silverhand/essentials';
import type { ClientAdapter } from './adapter';
import type { AccessToken, LogtoConfig, LogtoSignInSessionItem } from './types';
import type { ClientAdapter } from './adapter.js';
import type { AccessToken, LogtoConfig, LogtoSignInSessionItem } from './types/index.js';
export type { IdTokenClaims, LogtoErrorCode, UserInfoResponse, InteractionMode } from '@logto/js';
export { LogtoError, OidcError, Prompt, LogtoRequestError, ReservedScope, UserScope, } from '@logto/js';
export * from './errors';
export type { Storage, StorageKey, ClientAdapter } from './adapter';
export { createRequester } from './utils';
export * from './types';
export * from './errors.js';
export type { Storage, StorageKey, ClientAdapter } from './adapter.js';
export { createRequester } from './utils/index.js';
export * from './types/index.js';
export default class LogtoClient {
protected readonly logtoConfig: LogtoConfig;
protected readonly getOidcConfig: () => Promise<import("@silverhand/essentials").KeysToCamelCase<{
authorization_endpoint: string;
token_endpoint: string;
userinfo_endpoint: string;
end_session_endpoint: string;
revocation_endpoint: string;
jwks_uri: string;
issuer: string;
}>>;
protected readonly getJwtVerifyGetKey: () => Promise<(protectedHeader?: import("jose").JWSHeaderParameters | undefined, token?: import("jose").FlattenedJWSInput | undefined) => Promise<import("jose").KeyLike>>;
protected readonly getOidcConfig: typeof this._getOidcConfig;
protected readonly getJwtVerifyGetKey: (...args: unknown[]) => Promise<(protectedHeader?: import("jose").JWSHeaderParameters | undefined, token?: import("jose").FlattenedJWSInput | undefined) => Promise<import("jose").KeyLike>>;
protected readonly adapter: ClientAdapter;

@@ -24,0 +16,0 @@ protected readonly accessTokenMap: Map<string, AccessToken>;

@@ -1,26 +0,19 @@

'use strict';
import { Prompt, withDefaultScopes, decodeIdToken, fetchUserInfo, generateSignInUri, verifyAndParseCodeFromCallbackUri, fetchTokenByAuthorizationCode, revoke, generateSignOutUri, fetchTokenByRefreshToken, fetchOidcConfig, verifyIdToken } from '@logto/js';
export { LogtoError, LogtoRequestError, OidcError, Prompt, ReservedScope, UserScope } from '@logto/js';
import { createRemoteJWKSet } from 'jose';
import { LogtoClientError } from './errors.js';
import { isLogtoSignInSessionItem, isLogtoAccessTokenMap } from './types/index.js';
import { buildAccessTokenKey, getDiscoveryEndpoint } from './utils/index.js';
import { once } from './utils/once.js';
export { createRequester } from './utils/requester.js';
Object.defineProperty(exports, '__esModule', { value: true });
var js = require('@logto/js');
var jose = require('jose');
var once = require('lodash.once');
var errors = require('./errors.js');
var index = require('./types/index.js');
var index$1 = require('./utils/index.js');
var requester = require('./utils/requester.js');
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
var once__default = /*#__PURE__*/_interopDefault(once);
class LogtoClient {
constructor(logtoConfig, adapter) {
this.getOidcConfig = once__default.default(this._getOidcConfig);
this.getJwtVerifyGetKey = once__default.default(this._getJwtVerifyGetKey);
this.getOidcConfig = once(this._getOidcConfig);
this.getJwtVerifyGetKey = once(this._getJwtVerifyGetKey);
this.accessTokenMap = new Map();
this.logtoConfig = {
...logtoConfig,
prompt: logtoConfig.prompt ?? js.Prompt.Consent,
scopes: js.withDefaultScopes(logtoConfig.scopes).split(' '),
prompt: logtoConfig.prompt ?? Prompt.Consent,
scopes: withDefaultScopes(logtoConfig.scopes).split(' '),
};

@@ -41,5 +34,5 @@ this.adapter = adapter;

if (!(await this.getIdToken())) {
throw new errors.LogtoClientError('not_authenticated');
throw new LogtoClientError('not_authenticated');
}
const accessTokenKey = index$1.buildAccessTokenKey(resource);
const accessTokenKey = buildAccessTokenKey(resource);
const accessToken = this.accessTokenMap.get(accessTokenKey);

@@ -61,5 +54,5 @@ if (accessToken && accessToken.expiresAt > Date.now() / 1000) {

if (!idToken) {
throw new errors.LogtoClientError('not_authenticated');
throw new LogtoClientError('not_authenticated');
}
return js.decodeIdToken(idToken);
return decodeIdToken(idToken);
}

@@ -70,5 +63,5 @@ async fetchUserInfo() {

if (!accessToken) {
throw new errors.LogtoClientError('fetch_user_info_failed');
throw new LogtoClientError('fetch_user_info_failed');
}
return js.fetchUserInfo(userinfoEndpoint, accessToken, this.adapter.requester);
return fetchUserInfo(userinfoEndpoint, accessToken, this.adapter.requester);
}

@@ -81,3 +74,3 @@ async signIn(redirectUri, interactionMode) {

const state = this.adapter.generateState();
const signInUri = js.generateSignInUri({
const signInUri = generateSignInUri({
authorizationEndpoint,

@@ -112,9 +105,9 @@ clientId,

if (!signInSession) {
throw new errors.LogtoClientError('sign_in_session.not_found');
throw new LogtoClientError('sign_in_session.not_found');
}
const { redirectUri, state, codeVerifier } = signInSession;
const code = js.verifyAndParseCodeFromCallbackUri(callbackUri, redirectUri, state);
const code = verifyAndParseCodeFromCallbackUri(callbackUri, redirectUri, state);
const { appId: clientId } = logtoConfig;
const { tokenEndpoint } = await this.getOidcConfig();
const codeTokenResponse = await js.fetchTokenByAuthorizationCode({
const codeTokenResponse = await fetchTokenByAuthorizationCode({
clientId,

@@ -136,3 +129,3 @@ tokenEndpoint,

try {
await js.revoke(revocationEndpoint, clientId, refreshToken, this.adapter.requester);
await revoke(revocationEndpoint, clientId, refreshToken, this.adapter.requester);
}

@@ -143,3 +136,3 @@ catch {

}
const url = js.generateSignOutUri({
const url = generateSignOutUri({
endSessionEndpoint,

@@ -161,4 +154,4 @@ postLogoutRedirectUri,

const item = JSON.parse(jsonItem);
if (!index.isLogtoSignInSessionItem(item)) {
throw new errors.LogtoClientError('sign_in_session.invalid');
if (!isLogtoSignInSessionItem(item)) {
throw new LogtoClientError('sign_in_session.invalid');
}

@@ -192,8 +185,8 @@ return item;

if (!currentRefreshToken) {
throw new errors.LogtoClientError('not_authenticated');
throw new LogtoClientError('not_authenticated');
}
const accessTokenKey = index$1.buildAccessTokenKey(resource);
const accessTokenKey = buildAccessTokenKey(resource);
const { appId: clientId } = this.logtoConfig;
const { tokenEndpoint } = await this.getOidcConfig();
const { accessToken, refreshToken, idToken, scope, expiresIn } = await js.fetchTokenByRefreshToken({
const { accessToken, refreshToken, idToken, scope, expiresIn } = await fetchTokenByRefreshToken({
clientId,

@@ -219,8 +212,8 @@ tokenEndpoint,

const { endpoint } = this.logtoConfig;
const discoveryEndpoint = index$1.getDiscoveryEndpoint(endpoint);
return js.fetchOidcConfig(discoveryEndpoint, this.adapter.requester);
const discoveryEndpoint = getDiscoveryEndpoint(endpoint);
return fetchOidcConfig(discoveryEndpoint, this.adapter.requester);
}
async _getJwtVerifyGetKey() {
const { jwksUri } = await this.getOidcConfig();
return jose.createRemoteJWKSet(new URL(jwksUri));
return createRemoteJWKSet(new URL(jwksUri));
}

@@ -231,3 +224,3 @@ async verifyIdToken(idToken) {

const jwtVerifyGetKey = await this.getJwtVerifyGetKey();
await js.verifyIdToken(idToken, appId, issuer, jwtVerifyGetKey);
await verifyIdToken(idToken, appId, issuer, jwtVerifyGetKey);
}

@@ -238,3 +231,3 @@ async saveCodeToken({ refreshToken, idToken, scope, accessToken, expiresIn, }) {

// NOTE: Will add scope to accessTokenKey when needed. (Linear issue LOG-1589)
const accessTokenKey = index$1.buildAccessTokenKey();
const accessTokenKey = buildAccessTokenKey();
const expiresAt = Date.now() / 1000 + expiresIn;

@@ -259,3 +252,3 @@ this.accessTokenMap.set(accessTokenKey, { token: accessToken, scope, expiresAt });

const json = JSON.parse(raw);
if (!index.isLogtoAccessTokenMap(json)) {
if (!isLogtoAccessTokenMap(json)) {
return;

@@ -274,30 +267,2 @@ }

Object.defineProperty(exports, 'LogtoError', {
enumerable: true,
get: function () { return js.LogtoError; }
});
Object.defineProperty(exports, 'LogtoRequestError', {
enumerable: true,
get: function () { return js.LogtoRequestError; }
});
Object.defineProperty(exports, 'OidcError', {
enumerable: true,
get: function () { return js.OidcError; }
});
Object.defineProperty(exports, 'Prompt', {
enumerable: true,
get: function () { return js.Prompt; }
});
Object.defineProperty(exports, 'ReservedScope', {
enumerable: true,
get: function () { return js.ReservedScope; }
});
Object.defineProperty(exports, 'UserScope', {
enumerable: true,
get: function () { return js.UserScope; }
});
exports.LogtoClientError = errors.LogtoClientError;
exports.isLogtoAccessTokenMap = index.isLogtoAccessTokenMap;
exports.isLogtoSignInSessionItem = index.isLogtoSignInSessionItem;
exports.createRequester = requester.createRequester;
exports.default = LogtoClient;
export { LogtoClientError, LogtoClient as default, isLogtoAccessTokenMap, isLogtoSignInSessionItem };
/// <reference types="jest" />
import { Prompt } from '@logto/js';
import type { Nullable } from '@silverhand/essentials';
import type { AccessToken, LogtoConfig, LogtoSignInSessionItem } from '.';
import LogtoClient from '.';
import type { Storage } from './adapter';
import type { Storage } from './adapter.js';
import type { AccessToken, LogtoConfig, LogtoSignInSessionItem } from './index.js';
import LogtoClient from './index.js';
export declare const appId = "app_id_value";

@@ -8,0 +8,0 @@ export declare const endpoint = "https://logto.dev";

@@ -1,7 +0,5 @@

'use strict';
import { isArbitraryObject } from '@logto/js';
var js = require('@logto/js');
const isLogtoSignInSessionItem = (data) => {
if (!js.isArbitraryObject(data)) {
if (!isArbitraryObject(data)) {
return false;

@@ -12,7 +10,7 @@ }

const isLogtoAccessTokenMap = (data) => {
if (!js.isArbitraryObject(data)) {
if (!isArbitraryObject(data)) {
return false;
}
return Object.values(data).every((value) => {
if (!js.isArbitraryObject(value)) {
if (!isArbitraryObject(value)) {
return false;

@@ -26,3 +24,2 @@ }

exports.isLogtoAccessTokenMap = isLogtoAccessTokenMap;
exports.isLogtoSignInSessionItem = isLogtoSignInSessionItem;
export { isLogtoAccessTokenMap, isLogtoSignInSessionItem };

@@ -1,3 +0,3 @@

export * from './requester';
export * from './requester.js';
export declare const buildAccessTokenKey: (resource?: string, scopes?: string[]) => string;
export declare const getDiscoveryEndpoint: (endpoint: string) => string;

@@ -1,9 +0,6 @@

'use strict';
import { discoveryPath } from '@logto/js';
var js = require('@logto/js');
const buildAccessTokenKey = (resource = '', scopes = []) => `${scopes.slice().sort().join(' ')}@${resource}`;
const getDiscoveryEndpoint = (endpoint) => new URL(js.discoveryPath, endpoint).toString();
const getDiscoveryEndpoint = (endpoint) => new URL(discoveryPath, endpoint).toString();
exports.buildAccessTokenKey = buildAccessTokenKey;
exports.getDiscoveryEndpoint = getDiscoveryEndpoint;
export { buildAccessTokenKey, getDiscoveryEndpoint };

@@ -1,5 +0,3 @@

'use strict';
import { isLogtoRequestError, LogtoError, LogtoRequestError } from '@logto/js';
var js = require('@logto/js');
const createRequester = (fetchFunction) => {

@@ -10,8 +8,8 @@ return async (...args) => {

const responseJson = await response.json();
if (!js.isLogtoRequestError(responseJson)) {
throw new js.LogtoError('unexpected_response_error', responseJson);
if (!isLogtoRequestError(responseJson)) {
throw new LogtoError('unexpected_response_error', responseJson);
}
// Expected request error from server
const { code, message } = responseJson;
throw new js.LogtoRequestError(code, message);
throw new LogtoRequestError(code, message);
}

@@ -22,2 +20,2 @@ return response.json();

exports.createRequester = createRequester;
export { createRequester };
{
"name": "@logto/client",
"version": "1.1.2",
"source": "./src/index.ts",
"main": "./lib/index.js",
"version": "2.0.0",
"type": "module",
"main": "./lib/index.cjs",
"module": "./lib/index.js",
"types": "./lib/index.d.ts",
"exports": {
"require": "./lib/index.js",
"import": "./lib/index.mjs"
"types": "./lib/index.d.ts",
"require": "./lib/index.cjs",
"import": "./lib/index.js",
"default": "./lib/index.js"
},
"module": "./lib/index.mjs",
"types": "./lib/index.d.ts",
"files": [

@@ -21,29 +23,14 @@ "lib"

},
"scripts": {
"dev:tsc": "tsc -p tsconfig.build.json -w --preserveWatchOutput",
"precommit": "lint-staged",
"check": "tsc --noEmit",
"build": "rm -rf lib/ && tsc -p tsconfig.build.json --noEmit && rollup -c",
"lint": "eslint --ext .ts src",
"test": "jest",
"test:coverage": "jest --silent --env=jsdom && jest --silent --coverage",
"prepack": "pnpm test"
},
"dependencies": {
"@logto/js": "^1.1.2",
"@silverhand/essentials": "^2.6.1",
"@logto/js": "^2.0.0",
"@silverhand/essentials": "^2.6.2",
"camelcase-keys": "^7.0.1",
"jose": "^4.13.2",
"lodash.get": "^4.4.2",
"lodash.once": "^4.1.1"
"jose": "^4.13.2"
},
"devDependencies": {
"@jest/types": "^29.5.0",
"@silverhand/eslint-config": "^2.0.0",
"@silverhand/ts-config": "^1.0.0",
"@silverhand/eslint-config": "^3.0.1",
"@silverhand/ts-config": "^3.0.0",
"@swc/core": "^1.3.50",
"@swc/jest": "^0.2.24",
"@types/jest": "^29.5.0",
"@types/lodash.get": "^4.4.6",
"@types/lodash.once": "^4.1.7",
"@types/node": "^18.0.0",

@@ -67,3 +54,11 @@ "eslint": "^8.38.0",

},
"gitHead": "9e9a8b0887ef67baa7c3c564590bb06e7801d03e"
}
"scripts": {
"dev:tsc": "tsc -p tsconfig.build.json -w --preserveWatchOutput",
"precommit": "lint-staged",
"check": "tsc --noEmit",
"build": "rm -rf lib/ && tsc -p tsconfig.build.json --noEmit && rollup -c",
"lint": "eslint --ext .ts src",
"test": "jest",
"test:coverage": "jest --silent --env=jsdom && jest --silent --coverage"
}
}
SocketSocket SOC 2 Logo

Product

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

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc