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

@streamlayer/sdk-web-core

Package Overview
Dependencies
Maintainers
14
Versions
124
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@streamlayer/sdk-web-core - npm Package Compare versions

Comparing version 0.15.1 to 0.16.0

lib/store/init.d.ts

35

lib/auth/bypass/index.d.ts

@@ -12,12 +12,39 @@ import { AbstractAuthenticationProvider } from '@streamlayer/sdk-web-interfaces';

private readonly transport;
private readonly $bypassLogin;
private readonly bypassLogin;
constructor(store: CoreStore, transport: Transport);
me: () => Promise<import("@streamlayer/sl-eslib/users/users_common_pb").User | undefined>;
login: (schema: string, userKey: string) => Promise<import("@streamlayer/sl-eslib/users/users_common_pb").User | undefined>;
/**
* Login user by token and schema.
* On success, save the user and update the token to the Transport, UserStore and cache.
* @param schema - schema created by the host app and provided to the StreamLayer SDK.
* @param userKey - user token received from the host app.
*/
login: (schema: string, userKey: string) => Promise<string>;
isAuthenticated: () => Promise<import("@streamlayer/sl-eslib/users/users_common_pb").User | undefined>;
/**
* Logout user. Clears the all user data from the store.
*/
logout: () => void;
/**
* subscribe to user store and set auth header to the Transport on user update
* Soft logout, only clears the StreamLayer user data from the store.
* Does not clear the external token. And automatically tries to re-login by external token.
*/
private subscribe;
softLogout: () => void;
/**
* Try to re-login.
* - If the user has an token, then try to login by it, by calling the me() method.
* - If the user has an external token, then try to login by it, by calling the login() method. On failure, logout.
* -
* - If no one of the above is true, then logout.
*/
reLogin: () => Promise<import("@streamlayer/sl-eslib/users/users_common_pb").User | undefined> | undefined;
/**
* Write token to the Transport and UserStore
*/
private saveToken;
/**
* Add interceptor to the Transport to handle 401 and 403 errors.
* If the user is logged in (auth header is set), then make a soft logout.
*/
private connect;
}
import { AbstractAuthenticationProvider } from '@streamlayer/sdk-web-interfaces';
import { queries } from '@streamlayer/sdk-web-api';
import { UserStorage } from '../../storage';
/**

@@ -11,3 +12,3 @@ * An authorization service manages user access by providing login, logout,

transport;
$bypassLogin;
bypassLogin;
constructor(store, transport) {

@@ -17,13 +18,26 @@ super();

this.transport = transport;
this.$bypassLogin = queries.$bypassLogin(this.transport);
this.subscribe();
this.bypassLogin = queries.bypassLogin(this.transport);
this.connect();
}
me = async () => {
this.$coreStore.getValues().user.invalidate();
const res = await this.$coreStore.getValues().user.getValue();
return res?.data;
};
/**
* Login user by token and schema.
* On success, save the user and update the token to the Transport, UserStore and cache.
* @param schema - schema created by the host app and provided to the StreamLayer SDK.
* @param userKey - user token received from the host app.
*/
login = async (schema, userKey) => {
this.$coreStore.getValues().userKey.setValue(userKey);
await this.$bypassLogin.mutate({ schema, userKey, init: false });
return this.me();
const user = await this.bypassLogin({ schema, userKey, init: false });
const token = user.meta?.jwt;
if (!token) {
throw new Error('internal: token missing');
}
this.$coreStore.getValues().user.getStore().mutate(user);
this.saveToken(token);
return token;
};

@@ -33,2 +47,5 @@ isAuthenticated = () => {

};
/**
* Logout user. Clears the all user data from the store.
*/
logout = () => {

@@ -39,14 +56,74 @@ this.$coreStore.getValues().user.setValue();

this.transport.setAuth('');
const storage = new UserStorage();
storage.clear();
};
/**
* subscribe to user store and set auth header to the Transport on user update
* Soft logout, only clears the StreamLayer user data from the store.
* Does not clear the external token. And automatically tries to re-login by external token.
*/
subscribe = () => {
this.$bypassLogin.subscribe((user, key) => {
if (key === 'data') {
this.transport.setAuth(user?.data?.meta?.jwt);
this.$coreStore.getValues().userToken.setValue(user?.data?.meta?.jwt);
softLogout = () => {
const storage = new UserStorage();
this.$coreStore.getValues().user.setValue();
this.$coreStore.getValues().userToken.setValue();
this.transport.setAuth('');
storage.setToken('');
void this.reLogin();
};
/**
* Try to re-login.
* - If the user has an token, then try to login by it, by calling the me() method.
* - If the user has an external token, then try to login by it, by calling the login() method. On failure, logout.
* -
* - If no one of the above is true, then logout.
*/
reLogin = () => {
const storage = new UserStorage();
const prevUserToken = storage.getToken();
const prevUserExternalToken = storage.getExternalToken();
this.$coreStore.getValues().userKey.setValue(prevUserExternalToken);
this.$coreStore.getValues().userToken.setValue(prevUserToken);
if (prevUserToken) {
this.saveToken(prevUserToken);
return this.me();
}
if (prevUserExternalToken && !prevUserToken) {
const prevUserSchema = storage.getSchema();
if (prevUserSchema && prevUserExternalToken) {
this.login(prevUserSchema, prevUserExternalToken).catch(() => {
this.logout();
});
}
}
return undefined;
};
/**
* Write token to the Transport and UserStore
*/
saveToken = (token) => {
this.transport.setAuth(token);
this.$coreStore.getValues().userToken.setValue(token);
const storage = new UserStorage();
storage.setToken(token);
};
/**
* Add interceptor to the Transport to handle 401 and 403 errors.
* If the user is logged in (auth header is set), then make a soft logout.
*/
connect = () => {
this.transport.registerInterceptor((next) => async (req) => {
try {
return await next(req);
}
catch (err) {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
if (err.code && (err.code === 7 || err.code === 16)) {
if (this.transport.getHeader('authorization')) {
this.softLogout();
}
}
throw err;
}
});
};
}

@@ -15,2 +15,6 @@ import { StreamLayerContext } from '@streamlayer/sdk-web-interfaces';

}
/**
* Bypass authorization, used for login with external token.
* Automatically login user if SDK initialized and READY.
*/
export declare const bypass: (instance: StreamLayerContext, opts: unknown, done: () => void) => void;

19

lib/auth/index.js
import { CoreStatus } from '../store/store';
import { UserStorage } from '../storage';
import { BypassAuth } from './bypass';
const storage = new UserStorage();
/**
* Bypass authorization, used for login with external token.
* Automatically login user if SDK initialized and READY.
*/
export const bypass = (instance, opts, done) => {
instance.auth = new BypassAuth(instance.store, instance.transport);
const storage = new UserStorage();
instance.stores.status.listen(async (status) => {
instance.stores.status.listen((status) => {
if (status === CoreStatus.READY) {
const prevUserSchema = storage.getSchema();
const prevUserToken = storage.getToken();
if (prevUserSchema && prevUserToken) {
await instance.auth.login(prevUserSchema, prevUserToken);
}
void instance.auth.reLogin();
}

@@ -18,7 +18,8 @@ });

await instance.auth.login(schema, userKey);
// ToDo: implement right cache user keys
storage.setSchema('streamlayer:streamlayer');
storage.setSchema(schema);
storage.setExternalToken(userKey);
};
instance.sdk.logout = () => {
instance.auth.logout();
storage.clear();
};

@@ -25,0 +26,0 @@ instance.sdk.getUserStore = () => {

@@ -8,4 +8,5 @@ import { Storage } from '@streamlayer/sdk-web-storage';

getToken: () => string | undefined;
setExternalToken: (value: string) => void;
getExternalToken: () => string | undefined;
removeToken: () => void;
clearNotification: () => void;
}

@@ -5,2 +5,3 @@ import { Storage } from '@streamlayer/sdk-web-storage';

KEY_PREFIX["SCHEMA"] = "schema";
KEY_PREFIX["EXTERNAL_TOKEN"] = "eToken";
KEY_PREFIX["TOKEN"] = "token";

@@ -26,8 +27,12 @@ })(KEY_PREFIX || (KEY_PREFIX = {}));

};
// External Token
setExternalToken = (value) => {
this.write(KEY_PREFIX.EXTERNAL_TOKEN, value);
};
getExternalToken = () => {
return this.read(KEY_PREFIX.EXTERNAL_TOKEN);
};
removeToken = () => {
this.remove(KEY_PREFIX.TOKEN);
};
clearNotification = () => {
this.clear();
};
}
import type { OrganizationAdvertising, StreamSettings, OrganizationSettings, User, UserSettings } from '@streamlayer/sdk-web-types';
import { AbstractStore, SingleStore, ApiStore } from '@streamlayer/sdk-web-interfaces';
import { AbstractStore } from '@streamlayer/sdk-web-interfaces';
import { Transport } from '@streamlayer/sdk-web-api';
import { ReadableAtom } from 'nanostores';
import { FetcherValue } from '@nanostores/query';
export declare enum CoreStatus {
DISABLED = "disabled",
INITIALIZATION = "initialization",
READY = "ready",
FAILED = "failed",
SUSPENDED = "suspended"
}
import { initializeStore, CoreStatus } from './init';
export { CoreStatus };
export interface CoreStoreInterface {

@@ -28,47 +23,2 @@ enabled?: 'on';

}
declare const initializeStore: (transport: Transport) => {
readonly enabled: SingleStore<unknown, import("nanostores").WritableAtom<"on" | undefined>>;
readonly status: SingleStore<unknown, import("nanostores").WritableAtom<CoreStatus>>;
readonly providerStreamId: SingleStore<unknown, import("nanostores").WritableAtom<string | undefined>>;
readonly slStreamId: ApiStore<string | undefined, import("@nanostores/query").FetcherStore<string | undefined, any>>;
readonly streamSettings: ApiStore<import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").StreamSettings | undefined, import("@nanostores/query").FetcherStore<import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").StreamSettings | undefined, any>>;
readonly user: ApiStore<import("@streamlayer/sl-eslib/users/users_pb").MeResponse | undefined, import("@nanostores/query").FetcherStore<import("@streamlayer/sl-eslib/users/users_pb").MeResponse | undefined, any>>;
readonly userKey: SingleStore<unknown, import("nanostores").WritableAtom<string | undefined>>;
readonly userToken: SingleStore<unknown, import("nanostores").WritableAtom<string | undefined>>;
readonly userSettings: ApiStore<import("@streamlayer/sl-eslib/sdkSettings/client/client_pb").ClientSettings | undefined, import("@nanostores/query").FetcherStore<import("@streamlayer/sl-eslib/sdkSettings/client/client_pb").ClientSettings | undefined, any>>;
readonly organizationSettings: ApiStore<{
id: string;
overlays?: import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").SdkOverlay[] | undefined;
buttonIcon?: string | undefined;
tinodeHost?: string | undefined;
audience?: string | undefined;
name?: string | undefined;
provider?: string | undefined;
primaryColor?: string | undefined;
secondaryColor?: string | undefined;
moderationPrimaryColor?: string | undefined;
linkShareIcon?: string | undefined;
linkShareText?: string | undefined;
brandDefaults?: import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").BrandDefaults | undefined;
pub?: import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").JWK | undefined;
getstream?: import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").GetStreamSettingsClient | undefined;
} | undefined, import("@nanostores/query").FetcherStore<{
id: string;
overlays?: import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").SdkOverlay[] | undefined;
buttonIcon?: string | undefined;
tinodeHost?: string | undefined;
audience?: string | undefined;
name?: string | undefined;
provider?: string | undefined;
primaryColor?: string | undefined;
secondaryColor?: string | undefined;
moderationPrimaryColor?: string | undefined;
linkShareIcon?: string | undefined;
linkShareText?: string | undefined;
brandDefaults?: import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").BrandDefaults | undefined;
pub?: import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").JWK | undefined;
getstream?: import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").GetStreamSettingsClient | undefined;
} | undefined, any>>;
readonly organizationAdvertising: ApiStore<import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").Advertising | undefined, import("@nanostores/query").FetcherStore<import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").Advertising | undefined, any>>;
};
export type StoreObj = ReturnType<typeof initializeStore>;

@@ -83,3 +33,15 @@ export type CoreStores = {

/**
* @description main app store
* @description `CoreStore` is a store that contains all the necessary data for the SDK to work.
* `CoreStore` is a singleton and is created when the SDK is initialized. It includes the following stores:
* - `enabled` - the status of the SDK. The SDK is enabled when the `on` value is set.
* - `status` - the status of the SDK. Can be one of the following values: `disabled`, `initialization`, `ready`, `failed`, `suspended`.
* - `userKey` - the user key provided by the host.
* - `userToken` - the user token received from the StreamLayer after login.
* - `organizationSettings` - the organization settings.
* - `organizationAdvertising` - the organization advertising.
* - `streamSettings` - the stream settings.
* - `user` - the user data.
* - `userSettings` - the user settings.
* - `providerStreamId` - the event id provided by the host.
* - `slStreamId` - the event id received from the StreamLayer, resolved by the `providerStreamId`.
*/

@@ -91,12 +53,12 @@ export declare class CoreStore extends AbstractStore<CoreStoreInstance> {

getValues(): {
readonly enabled: SingleStore<unknown, import("nanostores").WritableAtom<"on" | undefined>>;
readonly status: SingleStore<unknown, import("nanostores").WritableAtom<CoreStatus>>;
readonly providerStreamId: SingleStore<unknown, import("nanostores").WritableAtom<string | undefined>>;
readonly slStreamId: ApiStore<string | undefined, import("@nanostores/query").FetcherStore<string | undefined, any>>;
readonly streamSettings: ApiStore<import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").StreamSettings | undefined, import("@nanostores/query").FetcherStore<import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").StreamSettings | undefined, any>>;
readonly user: ApiStore<import("@streamlayer/sl-eslib/users/users_pb").MeResponse | undefined, import("@nanostores/query").FetcherStore<import("@streamlayer/sl-eslib/users/users_pb").MeResponse | undefined, any>>;
readonly userKey: SingleStore<unknown, import("nanostores").WritableAtom<string | undefined>>;
readonly userToken: SingleStore<unknown, import("nanostores").WritableAtom<string | undefined>>;
readonly userSettings: ApiStore<import("@streamlayer/sl-eslib/sdkSettings/client/client_pb").ClientSettings | undefined, import("@nanostores/query").FetcherStore<import("@streamlayer/sl-eslib/sdkSettings/client/client_pb").ClientSettings | undefined, any>>;
readonly organizationSettings: ApiStore<{
readonly enabled: import("@streamlayer/sdk-web-interfaces").SingleStore<unknown, import("nanostores").WritableAtom<"on" | undefined>>;
readonly status: import("@streamlayer/sdk-web-interfaces").SingleStore<unknown, import("nanostores").WritableAtom<CoreStatus>>;
readonly providerStreamId: import("@streamlayer/sdk-web-interfaces").SingleStore<unknown, import("nanostores").WritableAtom<string | undefined>>;
readonly slStreamId: import("@streamlayer/sdk-web-interfaces").ApiStore<string | undefined, import("@nanostores/query").FetcherStore<string | undefined, any>>;
readonly streamSettings: import("@streamlayer/sdk-web-interfaces").ApiStore<import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").StreamSettings | undefined, import("@nanostores/query").FetcherStore<import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").StreamSettings | undefined, any>>;
readonly user: import("@streamlayer/sdk-web-interfaces").ApiStore<import("@streamlayer/sl-eslib/users/users_pb").MeResponse | undefined, import("@nanostores/query").FetcherStore<import("@streamlayer/sl-eslib/users/users_pb").MeResponse | undefined, any>>;
readonly userKey: import("@streamlayer/sdk-web-interfaces").SingleStore<unknown, import("nanostores").WritableAtom<string | undefined>>;
readonly userToken: import("@streamlayer/sdk-web-interfaces").SingleStore<unknown, import("nanostores").WritableAtom<string | undefined>>;
readonly userSettings: import("@streamlayer/sdk-web-interfaces").ApiStore<import("@streamlayer/sl-eslib/sdkSettings/client/client_pb").ClientSettings | undefined, import("@nanostores/query").FetcherStore<import("@streamlayer/sl-eslib/sdkSettings/client/client_pb").ClientSettings | undefined, any>>;
readonly organizationSettings: import("@streamlayer/sdk-web-interfaces").ApiStore<{
id: string;

@@ -134,3 +96,3 @@ overlays?: import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").SdkOverlay[] | undefined;

} | undefined, any>>;
readonly organizationAdvertising: ApiStore<import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").Advertising | undefined, import("@nanostores/query").FetcherStore<import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").Advertising | undefined, any>>;
readonly organizationAdvertising: import("@streamlayer/sdk-web-interfaces").ApiStore<import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").Advertising | undefined, import("@nanostores/query").FetcherStore<import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").Advertising | undefined, any>>;
};

@@ -144,2 +106,1 @@ setValue(): void;

};
export {};

@@ -1,65 +0,18 @@

import { AbstractStore, createSingleStore, SingleStore, mergeStores, ApiStore } from '@streamlayer/sdk-web-interfaces';
import { queries } from '@streamlayer/sdk-web-api';
import { UserStorage } from '../storage';
export var CoreStatus;
(function (CoreStatus) {
CoreStatus["DISABLED"] = "disabled";
CoreStatus["INITIALIZATION"] = "initialization";
CoreStatus["READY"] = "ready";
CoreStatus["FAILED"] = "failed";
CoreStatus["SUSPENDED"] = "suspended";
})(CoreStatus || (CoreStatus = {}));
const initializeStore = (transport) => {
// sdk toggle
const enabled = new SingleStore(createSingleStore(undefined), 'enabled');
// sdk status
const status = new SingleStore(createSingleStore(CoreStatus.DISABLED), 'status');
// host user key
const userKey = new SingleStore(createSingleStore(undefined), 'userKey');
// sl user key
const userToken = new SingleStore(createSingleStore(undefined), 'userToken');
const storage = new UserStorage();
userToken.listen((token) => {
if (token) {
storage.setToken(token);
}
else {
storage.removeToken();
}
});
// host event id
const providerStreamId = new SingleStore(createSingleStore(undefined), 'providerStreamId');
// sl event id
const slStreamId = new ApiStore(queries.$retrieveEventId(providerStreamId.getStore(), transport), 'slStreamId', (data) => data?.data);
// sl user data
const user = new ApiStore(queries.$user(userToken.getStore(), transport), 'user', (data) => data?.data?.data?.id);
// sl user settings
const userSettings = new ApiStore(queries.$userSettings(userToken.getStore(), transport), 'userSettings');
// sl stream settings
const streamSettings = new ApiStore(queries.$streamSettings(slStreamId.getAtomStore(), transport), 'streamSettings');
slStreamId.getAtomStore().listen((eventId) => {
if (eventId === '' || eventId === undefined) {
streamSettings.getStore().mutate(undefined);
}
});
// sl organization settings
const organizationSettings = new ApiStore(queries.$organizationSettings(enabled.getStore(), transport), 'organizationSettings', (data) => data?.data?.id);
// sl organization advertising
const organizationAdvertising = new ApiStore(queries.$organizationAdvertising(organizationSettings.getAtomStore(), transport), 'organizationAdvertising');
return {
enabled,
status,
providerStreamId,
slStreamId,
streamSettings,
user,
userKey,
userToken,
userSettings,
organizationSettings,
organizationAdvertising,
};
};
import { AbstractStore, mergeStores } from '@streamlayer/sdk-web-interfaces';
import { initializeStore, CoreStatus } from './init';
export { CoreStatus };
/**
* @description main app store
* @description `CoreStore` is a store that contains all the necessary data for the SDK to work.
* `CoreStore` is a singleton and is created when the SDK is initialized. It includes the following stores:
* - `enabled` - the status of the SDK. The SDK is enabled when the `on` value is set.
* - `status` - the status of the SDK. Can be one of the following values: `disabled`, `initialization`, `ready`, `failed`, `suspended`.
* - `userKey` - the user key provided by the host.
* - `userToken` - the user token received from the StreamLayer after login.
* - `organizationSettings` - the organization settings.
* - `organizationAdvertising` - the organization advertising.
* - `streamSettings` - the stream settings.
* - `user` - the user data.
* - `userSettings` - the user settings.
* - `providerStreamId` - the event id provided by the host.
* - `slStreamId` - the event id received from the StreamLayer, resolved by the `providerStreamId`.
*/

@@ -66,0 +19,0 @@ export class CoreStore extends AbstractStore {

@@ -12,3 +12,3 @@ {

"@streamlayer/sdk-web-storage": "^0.3.7",
"@streamlayer/sdk-web-api": "^0.0.7",
"@streamlayer/sdk-web-api": "^0.1.0",
"@streamlayer/sdk-web-types": "^0.16.5"

@@ -43,3 +43,3 @@ },

},
"version": "0.15.1",
"version": "0.16.0",
"type": "module",

@@ -46,0 +46,0 @@ "main": "./lib/index.js",

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