@streamlayer/sdk-web-core 0.15.1 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/auth/bypass/index.d.ts +31 -4
- package/lib/auth/bypass/index.js +88 -11
- package/lib/auth/index.d.ts +4 -0
- package/lib/auth/index.js +10 -9
- package/lib/storage.d.ts +2 -1
- package/lib/storage.js +8 -3
- package/lib/store/init.d.ts +54 -0
- package/lib/store/init.js +71 -0
- package/lib/store/store.d.ts +27 -66
- package/lib/store/store.js +16 -63
- package/package.json +2 -2
|
@@ -9,14 +9,41 @@ import { CoreStore } from '../../store/store';
|
|
|
9
9
|
export declare class BypassAuth extends AbstractAuthenticationProvider {
|
|
10
10
|
private readonly $coreStore;
|
|
11
11
|
private readonly transport;
|
|
12
|
-
private readonly
|
|
12
|
+
private readonly bypassLogin;
|
|
13
13
|
constructor(store: CoreStore, transport: Transport);
|
|
14
14
|
me: () => Promise<import("@streamlayer/sl-eslib/users/users_common_pb").User | undefined>;
|
|
15
|
-
|
|
15
|
+
/**
|
|
16
|
+
* Login user by token and schema.
|
|
17
|
+
* On success, save the user and update the token to the Transport, UserStore and cache.
|
|
18
|
+
* @param schema - schema created by the host app and provided to the StreamLayer SDK.
|
|
19
|
+
* @param userKey - user token received from the host app.
|
|
20
|
+
*/
|
|
21
|
+
login: (schema: string, userKey: string) => Promise<string>;
|
|
16
22
|
isAuthenticated: () => Promise<import("@streamlayer/sl-eslib/users/users_common_pb").User | undefined>;
|
|
23
|
+
/**
|
|
24
|
+
* Logout user. Clears the all user data from the store.
|
|
25
|
+
*/
|
|
17
26
|
logout: () => void;
|
|
18
27
|
/**
|
|
19
|
-
*
|
|
28
|
+
* Soft logout, only clears the StreamLayer user data from the store.
|
|
29
|
+
* Does not clear the external token. And automatically tries to re-login by external token.
|
|
30
|
+
*/
|
|
31
|
+
softLogout: () => void;
|
|
32
|
+
/**
|
|
33
|
+
* Try to re-login.
|
|
34
|
+
* - If the user has an token, then try to login by it, by calling the me() method.
|
|
35
|
+
* - If the user has an external token, then try to login by it, by calling the login() method. On failure, logout.
|
|
36
|
+
* -
|
|
37
|
+
* - If no one of the above is true, then logout.
|
|
38
|
+
*/
|
|
39
|
+
reLogin: () => Promise<import("@streamlayer/sl-eslib/users/users_common_pb").User | undefined> | undefined;
|
|
40
|
+
/**
|
|
41
|
+
* Write token to the Transport and UserStore
|
|
42
|
+
*/
|
|
43
|
+
private saveToken;
|
|
44
|
+
/**
|
|
45
|
+
* Add interceptor to the Transport to handle 401 and 403 errors.
|
|
46
|
+
* If the user is logged in (auth header is set), then make a soft logout.
|
|
20
47
|
*/
|
|
21
|
-
private
|
|
48
|
+
private connect;
|
|
22
49
|
}
|
package/lib/auth/bypass/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { AbstractAuthenticationProvider } from '@streamlayer/sdk-web-interfaces';
|
|
2
2
|
import { queries } from '@streamlayer/sdk-web-api';
|
|
3
|
+
import { UserStorage } from '../../storage';
|
|
3
4
|
/**
|
|
4
5
|
* An authorization service manages user access by providing login, logout,
|
|
5
6
|
* authentication checks, and the ability to revoke access.
|
|
@@ -8,40 +9,116 @@ import { queries } from '@streamlayer/sdk-web-api';
|
|
|
8
9
|
export class BypassAuth extends AbstractAuthenticationProvider {
|
|
9
10
|
$coreStore;
|
|
10
11
|
transport;
|
|
11
|
-
|
|
12
|
+
bypassLogin;
|
|
12
13
|
constructor(store, transport) {
|
|
13
14
|
super();
|
|
14
15
|
this.$coreStore = store;
|
|
15
16
|
this.transport = transport;
|
|
16
|
-
this
|
|
17
|
-
this.
|
|
17
|
+
this.bypassLogin = queries.bypassLogin(this.transport);
|
|
18
|
+
this.connect();
|
|
18
19
|
}
|
|
19
20
|
me = async () => {
|
|
21
|
+
this.$coreStore.getValues().user.invalidate();
|
|
20
22
|
const res = await this.$coreStore.getValues().user.getValue();
|
|
21
23
|
return res?.data;
|
|
22
24
|
};
|
|
25
|
+
/**
|
|
26
|
+
* Login user by token and schema.
|
|
27
|
+
* On success, save the user and update the token to the Transport, UserStore and cache.
|
|
28
|
+
* @param schema - schema created by the host app and provided to the StreamLayer SDK.
|
|
29
|
+
* @param userKey - user token received from the host app.
|
|
30
|
+
*/
|
|
23
31
|
login = async (schema, userKey) => {
|
|
24
32
|
this.$coreStore.getValues().userKey.setValue(userKey);
|
|
25
|
-
await this
|
|
26
|
-
|
|
33
|
+
const user = await this.bypassLogin({ schema, userKey, init: false });
|
|
34
|
+
const token = user.meta?.jwt;
|
|
35
|
+
if (!token) {
|
|
36
|
+
throw new Error('internal: token missing');
|
|
37
|
+
}
|
|
38
|
+
this.$coreStore.getValues().user.getStore().mutate(user);
|
|
39
|
+
this.saveToken(token);
|
|
40
|
+
return token;
|
|
27
41
|
};
|
|
28
42
|
isAuthenticated = () => {
|
|
29
43
|
return this.me();
|
|
30
44
|
};
|
|
45
|
+
/**
|
|
46
|
+
* Logout user. Clears the all user data from the store.
|
|
47
|
+
*/
|
|
31
48
|
logout = () => {
|
|
32
49
|
this.$coreStore.getValues().user.setValue();
|
|
33
50
|
this.$coreStore.getValues().userKey.setValue();
|
|
34
51
|
this.$coreStore.getValues().userToken.setValue();
|
|
35
52
|
this.transport.setAuth('');
|
|
53
|
+
const storage = new UserStorage();
|
|
54
|
+
storage.clear();
|
|
36
55
|
};
|
|
37
56
|
/**
|
|
38
|
-
*
|
|
57
|
+
* Soft logout, only clears the StreamLayer user data from the store.
|
|
58
|
+
* Does not clear the external token. And automatically tries to re-login by external token.
|
|
39
59
|
*/
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
60
|
+
softLogout = () => {
|
|
61
|
+
const storage = new UserStorage();
|
|
62
|
+
this.$coreStore.getValues().user.setValue();
|
|
63
|
+
this.$coreStore.getValues().userToken.setValue();
|
|
64
|
+
this.transport.setAuth('');
|
|
65
|
+
storage.setToken('');
|
|
66
|
+
void this.reLogin();
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Try to re-login.
|
|
70
|
+
* - If the user has an token, then try to login by it, by calling the me() method.
|
|
71
|
+
* - If the user has an external token, then try to login by it, by calling the login() method. On failure, logout.
|
|
72
|
+
* -
|
|
73
|
+
* - If no one of the above is true, then logout.
|
|
74
|
+
*/
|
|
75
|
+
reLogin = () => {
|
|
76
|
+
const storage = new UserStorage();
|
|
77
|
+
const prevUserToken = storage.getToken();
|
|
78
|
+
const prevUserExternalToken = storage.getExternalToken();
|
|
79
|
+
this.$coreStore.getValues().userKey.setValue(prevUserExternalToken);
|
|
80
|
+
this.$coreStore.getValues().userToken.setValue(prevUserToken);
|
|
81
|
+
if (prevUserToken) {
|
|
82
|
+
this.saveToken(prevUserToken);
|
|
83
|
+
return this.me();
|
|
84
|
+
}
|
|
85
|
+
if (prevUserExternalToken && !prevUserToken) {
|
|
86
|
+
const prevUserSchema = storage.getSchema();
|
|
87
|
+
if (prevUserSchema && prevUserExternalToken) {
|
|
88
|
+
this.login(prevUserSchema, prevUserExternalToken).catch(() => {
|
|
89
|
+
this.logout();
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return undefined;
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* Write token to the Transport and UserStore
|
|
97
|
+
*/
|
|
98
|
+
saveToken = (token) => {
|
|
99
|
+
this.transport.setAuth(token);
|
|
100
|
+
this.$coreStore.getValues().userToken.setValue(token);
|
|
101
|
+
const storage = new UserStorage();
|
|
102
|
+
storage.setToken(token);
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* Add interceptor to the Transport to handle 401 and 403 errors.
|
|
106
|
+
* If the user is logged in (auth header is set), then make a soft logout.
|
|
107
|
+
*/
|
|
108
|
+
connect = () => {
|
|
109
|
+
this.transport.registerInterceptor((next) => async (req) => {
|
|
110
|
+
try {
|
|
111
|
+
return await next(req);
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
115
|
+
// @ts-ignore
|
|
116
|
+
if (err.code && (err.code === 7 || err.code === 16)) {
|
|
117
|
+
if (this.transport.getHeader('authorization')) {
|
|
118
|
+
this.softLogout();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
throw err;
|
|
45
122
|
}
|
|
46
123
|
});
|
|
47
124
|
};
|
package/lib/auth/index.d.ts
CHANGED
|
@@ -12,4 +12,8 @@ declare module '@streamlayer/sdk-web-interfaces' {
|
|
|
12
12
|
auth: BypassAuth;
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Bypass authorization, used for login with external token.
|
|
17
|
+
* Automatically login user if SDK initialized and READY.
|
|
18
|
+
*/
|
|
15
19
|
export declare const bypass: (instance: StreamLayerContext, opts: unknown, done: () => void) => void;
|
package/lib/auth/index.js
CHANGED
|
@@ -1,25 +1,26 @@
|
|
|
1
1
|
import { CoreStatus } from '../store/store';
|
|
2
2
|
import { UserStorage } from '../storage';
|
|
3
3
|
import { BypassAuth } from './bypass';
|
|
4
|
+
const storage = new UserStorage();
|
|
5
|
+
/**
|
|
6
|
+
* Bypass authorization, used for login with external token.
|
|
7
|
+
* Automatically login user if SDK initialized and READY.
|
|
8
|
+
*/
|
|
4
9
|
export const bypass = (instance, opts, done) => {
|
|
5
10
|
instance.auth = new BypassAuth(instance.store, instance.transport);
|
|
6
|
-
|
|
7
|
-
instance.stores.status.listen(async (status) => {
|
|
11
|
+
instance.stores.status.listen((status) => {
|
|
8
12
|
if (status === CoreStatus.READY) {
|
|
9
|
-
|
|
10
|
-
const prevUserToken = storage.getToken();
|
|
11
|
-
if (prevUserSchema && prevUserToken) {
|
|
12
|
-
await instance.auth.login(prevUserSchema, prevUserToken);
|
|
13
|
-
}
|
|
13
|
+
void instance.auth.reLogin();
|
|
14
14
|
}
|
|
15
15
|
});
|
|
16
16
|
instance.sdk.authorizationBypass = async (schema, userKey) => {
|
|
17
17
|
await instance.auth.login(schema, userKey);
|
|
18
|
-
|
|
19
|
-
storage.
|
|
18
|
+
storage.setSchema(schema);
|
|
19
|
+
storage.setExternalToken(userKey);
|
|
20
20
|
};
|
|
21
21
|
instance.sdk.logout = () => {
|
|
22
22
|
instance.auth.logout();
|
|
23
|
+
storage.clear();
|
|
23
24
|
};
|
|
24
25
|
instance.sdk.getUserStore = () => {
|
|
25
26
|
return instance.stores.user.getStore();
|
package/lib/storage.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export declare class UserStorage extends Storage {
|
|
|
5
5
|
getSchema: () => string | undefined;
|
|
6
6
|
setToken: (value: string) => void;
|
|
7
7
|
getToken: () => string | undefined;
|
|
8
|
+
setExternalToken: (value: string) => void;
|
|
9
|
+
getExternalToken: () => string | undefined;
|
|
8
10
|
removeToken: () => void;
|
|
9
|
-
clearNotification: () => void;
|
|
10
11
|
}
|
package/lib/storage.js
CHANGED
|
@@ -2,6 +2,7 @@ import { Storage } from '@streamlayer/sdk-web-storage';
|
|
|
2
2
|
var KEY_PREFIX;
|
|
3
3
|
(function (KEY_PREFIX) {
|
|
4
4
|
KEY_PREFIX["SCHEMA"] = "schema";
|
|
5
|
+
KEY_PREFIX["EXTERNAL_TOKEN"] = "eToken";
|
|
5
6
|
KEY_PREFIX["TOKEN"] = "token";
|
|
6
7
|
})(KEY_PREFIX || (KEY_PREFIX = {}));
|
|
7
8
|
export class UserStorage extends Storage {
|
|
@@ -22,10 +23,14 @@ export class UserStorage extends Storage {
|
|
|
22
23
|
getToken = () => {
|
|
23
24
|
return this.read(KEY_PREFIX.TOKEN);
|
|
24
25
|
};
|
|
26
|
+
// External Token
|
|
27
|
+
setExternalToken = (value) => {
|
|
28
|
+
this.write(KEY_PREFIX.EXTERNAL_TOKEN, value);
|
|
29
|
+
};
|
|
30
|
+
getExternalToken = () => {
|
|
31
|
+
return this.read(KEY_PREFIX.EXTERNAL_TOKEN);
|
|
32
|
+
};
|
|
25
33
|
removeToken = () => {
|
|
26
34
|
this.remove(KEY_PREFIX.TOKEN);
|
|
27
35
|
};
|
|
28
|
-
clearNotification = () => {
|
|
29
|
-
this.clear();
|
|
30
|
-
};
|
|
31
36
|
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { SingleStore, ApiStore } from '@streamlayer/sdk-web-interfaces';
|
|
2
|
+
import { Transport } from '@streamlayer/sdk-web-api';
|
|
3
|
+
export declare enum CoreStatus {
|
|
4
|
+
DISABLED = "disabled",
|
|
5
|
+
INITIALIZATION = "initialization",
|
|
6
|
+
READY = "ready",
|
|
7
|
+
FAILED = "failed",
|
|
8
|
+
SUSPENDED = "suspended"
|
|
9
|
+
}
|
|
10
|
+
export declare const initializeStore: (transport: Transport) => {
|
|
11
|
+
readonly enabled: SingleStore<unknown, import("nanostores").WritableAtom<"on" | undefined>>;
|
|
12
|
+
readonly status: SingleStore<unknown, import("nanostores").WritableAtom<CoreStatus>>;
|
|
13
|
+
readonly providerStreamId: SingleStore<unknown, import("nanostores").WritableAtom<string | undefined>>;
|
|
14
|
+
readonly slStreamId: ApiStore<string | undefined, import("@nanostores/query").FetcherStore<string | undefined, any>>;
|
|
15
|
+
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>>;
|
|
16
|
+
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>>;
|
|
17
|
+
readonly userKey: SingleStore<unknown, import("nanostores").WritableAtom<string | undefined>>;
|
|
18
|
+
readonly userToken: SingleStore<unknown, import("nanostores").WritableAtom<string | undefined>>;
|
|
19
|
+
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>>;
|
|
20
|
+
readonly organizationSettings: ApiStore<{
|
|
21
|
+
id: string;
|
|
22
|
+
overlays?: import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").SdkOverlay[] | undefined;
|
|
23
|
+
buttonIcon?: string | undefined;
|
|
24
|
+
tinodeHost?: string | undefined;
|
|
25
|
+
audience?: string | undefined;
|
|
26
|
+
name?: string | undefined;
|
|
27
|
+
provider?: string | undefined;
|
|
28
|
+
primaryColor?: string | undefined;
|
|
29
|
+
secondaryColor?: string | undefined;
|
|
30
|
+
moderationPrimaryColor?: string | undefined;
|
|
31
|
+
linkShareIcon?: string | undefined;
|
|
32
|
+
linkShareText?: string | undefined;
|
|
33
|
+
brandDefaults?: import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").BrandDefaults | undefined;
|
|
34
|
+
pub?: import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").JWK | undefined;
|
|
35
|
+
getstream?: import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").GetStreamSettingsClient | undefined;
|
|
36
|
+
} | undefined, import("@nanostores/query").FetcherStore<{
|
|
37
|
+
id: string;
|
|
38
|
+
overlays?: import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").SdkOverlay[] | undefined;
|
|
39
|
+
buttonIcon?: string | undefined;
|
|
40
|
+
tinodeHost?: string | undefined;
|
|
41
|
+
audience?: string | undefined;
|
|
42
|
+
name?: string | undefined;
|
|
43
|
+
provider?: string | undefined;
|
|
44
|
+
primaryColor?: string | undefined;
|
|
45
|
+
secondaryColor?: string | undefined;
|
|
46
|
+
moderationPrimaryColor?: string | undefined;
|
|
47
|
+
linkShareIcon?: string | undefined;
|
|
48
|
+
linkShareText?: string | undefined;
|
|
49
|
+
brandDefaults?: import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").BrandDefaults | undefined;
|
|
50
|
+
pub?: import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").JWK | undefined;
|
|
51
|
+
getstream?: import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").GetStreamSettingsClient | undefined;
|
|
52
|
+
} | undefined, any>>;
|
|
53
|
+
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>>;
|
|
54
|
+
};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { createSingleStore, SingleStore, ApiStore } from '@streamlayer/sdk-web-interfaces';
|
|
2
|
+
import { queries } from '@streamlayer/sdk-web-api';
|
|
3
|
+
import { UserStorage } from '../storage';
|
|
4
|
+
export var CoreStatus;
|
|
5
|
+
(function (CoreStatus) {
|
|
6
|
+
CoreStatus["DISABLED"] = "disabled";
|
|
7
|
+
CoreStatus["INITIALIZATION"] = "initialization";
|
|
8
|
+
CoreStatus["READY"] = "ready";
|
|
9
|
+
CoreStatus["FAILED"] = "failed";
|
|
10
|
+
CoreStatus["SUSPENDED"] = "suspended";
|
|
11
|
+
})(CoreStatus || (CoreStatus = {}));
|
|
12
|
+
const initializeUserStores = (transport) => {
|
|
13
|
+
const storage = new UserStorage();
|
|
14
|
+
// host user key
|
|
15
|
+
const userKey = new SingleStore(createSingleStore(storage.getExternalToken()), 'userKey');
|
|
16
|
+
// sl user key
|
|
17
|
+
const userToken = new SingleStore(createSingleStore(storage.getToken()), 'userToken');
|
|
18
|
+
// sl user data
|
|
19
|
+
const user = new ApiStore(queries.$user(userToken.getStore(), transport), 'user', (data) => data?.data?.data?.id);
|
|
20
|
+
// sl user settings
|
|
21
|
+
const userSettings = new ApiStore(queries.$userSettings(userToken.getStore(), transport), 'userSettings');
|
|
22
|
+
return {
|
|
23
|
+
userKey,
|
|
24
|
+
userToken,
|
|
25
|
+
user,
|
|
26
|
+
userSettings,
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
const initializeStreamStores = (transport) => {
|
|
30
|
+
// host event id
|
|
31
|
+
const providerStreamId = new SingleStore(createSingleStore(undefined), 'providerStreamId');
|
|
32
|
+
// sl event id
|
|
33
|
+
const slStreamId = new ApiStore(queries.$retrieveEventId(providerStreamId.getStore(), transport), 'slStreamId', (data) => data?.data);
|
|
34
|
+
// sl stream settings
|
|
35
|
+
const streamSettings = new ApiStore(queries.$streamSettings(slStreamId.getAtomStore(), transport), 'streamSettings');
|
|
36
|
+
slStreamId.getAtomStore().listen((eventId) => {
|
|
37
|
+
if (eventId === '' || eventId === undefined) {
|
|
38
|
+
streamSettings.getStore().mutate(undefined);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
return {
|
|
42
|
+
providerStreamId,
|
|
43
|
+
slStreamId,
|
|
44
|
+
streamSettings,
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
export const initializeStore = (transport) => {
|
|
48
|
+
// sdk toggle
|
|
49
|
+
const enabled = new SingleStore(createSingleStore(undefined), 'enabled');
|
|
50
|
+
// sdk status
|
|
51
|
+
const status = new SingleStore(createSingleStore(CoreStatus.DISABLED), 'status');
|
|
52
|
+
// sl organization settings
|
|
53
|
+
const organizationSettings = new ApiStore(queries.$organizationSettings(enabled.getStore(), transport), 'organizationSettings', (data) => data?.data?.id);
|
|
54
|
+
// sl organization advertising
|
|
55
|
+
const organizationAdvertising = new ApiStore(queries.$organizationAdvertising(organizationSettings.getAtomStore(), transport), 'organizationAdvertising');
|
|
56
|
+
const userStores = initializeUserStores(transport);
|
|
57
|
+
const streamStores = initializeStreamStores(transport);
|
|
58
|
+
return {
|
|
59
|
+
enabled,
|
|
60
|
+
status,
|
|
61
|
+
providerStreamId: streamStores.providerStreamId,
|
|
62
|
+
slStreamId: streamStores.slStreamId,
|
|
63
|
+
streamSettings: streamStores.streamSettings,
|
|
64
|
+
user: userStores.user,
|
|
65
|
+
userKey: userStores.userKey,
|
|
66
|
+
userToken: userStores.userToken,
|
|
67
|
+
userSettings: userStores.userSettings,
|
|
68
|
+
organizationSettings,
|
|
69
|
+
organizationAdvertising,
|
|
70
|
+
};
|
|
71
|
+
};
|
package/lib/store/store.d.ts
CHANGED
|
@@ -1,15 +1,10 @@
|
|
|
1
1
|
import type { OrganizationAdvertising, StreamSettings, OrganizationSettings, User, UserSettings } from '@streamlayer/sdk-web-types';
|
|
2
|
-
import { AbstractStore
|
|
2
|
+
import { AbstractStore } from '@streamlayer/sdk-web-interfaces';
|
|
3
3
|
import { Transport } from '@streamlayer/sdk-web-api';
|
|
4
4
|
import { ReadableAtom } from 'nanostores';
|
|
5
5
|
import { FetcherValue } from '@nanostores/query';
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
INITIALIZATION = "initialization",
|
|
9
|
-
READY = "ready",
|
|
10
|
-
FAILED = "failed",
|
|
11
|
-
SUSPENDED = "suspended"
|
|
12
|
-
}
|
|
6
|
+
import { initializeStore, CoreStatus } from './init';
|
|
7
|
+
export { CoreStatus };
|
|
13
8
|
export interface CoreStoreInterface {
|
|
14
9
|
enabled?: 'on';
|
|
15
10
|
status: string;
|
|
@@ -25,51 +20,6 @@ export interface CoreStoreInterface {
|
|
|
25
20
|
providerStreamId?: string;
|
|
26
21
|
slStreamId?: string;
|
|
27
22
|
}
|
|
28
|
-
declare const initializeStore: (transport: Transport) => {
|
|
29
|
-
readonly enabled: SingleStore<unknown, import("nanostores").WritableAtom<"on" | undefined>>;
|
|
30
|
-
readonly status: SingleStore<unknown, import("nanostores").WritableAtom<CoreStatus>>;
|
|
31
|
-
readonly providerStreamId: SingleStore<unknown, import("nanostores").WritableAtom<string | undefined>>;
|
|
32
|
-
readonly slStreamId: ApiStore<string | undefined, import("@nanostores/query").FetcherStore<string | undefined, any>>;
|
|
33
|
-
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>>;
|
|
34
|
-
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>>;
|
|
35
|
-
readonly userKey: SingleStore<unknown, import("nanostores").WritableAtom<string | undefined>>;
|
|
36
|
-
readonly userToken: SingleStore<unknown, import("nanostores").WritableAtom<string | undefined>>;
|
|
37
|
-
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>>;
|
|
38
|
-
readonly organizationSettings: ApiStore<{
|
|
39
|
-
id: string;
|
|
40
|
-
overlays?: import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").SdkOverlay[] | undefined;
|
|
41
|
-
buttonIcon?: string | undefined;
|
|
42
|
-
tinodeHost?: string | undefined;
|
|
43
|
-
audience?: string | undefined;
|
|
44
|
-
name?: string | undefined;
|
|
45
|
-
provider?: string | undefined;
|
|
46
|
-
primaryColor?: string | undefined;
|
|
47
|
-
secondaryColor?: string | undefined;
|
|
48
|
-
moderationPrimaryColor?: string | undefined;
|
|
49
|
-
linkShareIcon?: string | undefined;
|
|
50
|
-
linkShareText?: string | undefined;
|
|
51
|
-
brandDefaults?: import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").BrandDefaults | undefined;
|
|
52
|
-
pub?: import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").JWK | undefined;
|
|
53
|
-
getstream?: import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").GetStreamSettingsClient | undefined;
|
|
54
|
-
} | undefined, import("@nanostores/query").FetcherStore<{
|
|
55
|
-
id: string;
|
|
56
|
-
overlays?: import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").SdkOverlay[] | undefined;
|
|
57
|
-
buttonIcon?: string | undefined;
|
|
58
|
-
tinodeHost?: string | undefined;
|
|
59
|
-
audience?: string | undefined;
|
|
60
|
-
name?: string | undefined;
|
|
61
|
-
provider?: string | undefined;
|
|
62
|
-
primaryColor?: string | undefined;
|
|
63
|
-
secondaryColor?: string | undefined;
|
|
64
|
-
moderationPrimaryColor?: string | undefined;
|
|
65
|
-
linkShareIcon?: string | undefined;
|
|
66
|
-
linkShareText?: string | undefined;
|
|
67
|
-
brandDefaults?: import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").BrandDefaults | undefined;
|
|
68
|
-
pub?: import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").JWK | undefined;
|
|
69
|
-
getstream?: import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").GetStreamSettingsClient | undefined;
|
|
70
|
-
} | undefined, any>>;
|
|
71
|
-
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>>;
|
|
72
|
-
};
|
|
73
23
|
export type StoreObj = ReturnType<typeof initializeStore>;
|
|
74
24
|
export type CoreStores = {
|
|
75
25
|
[Index in keyof StoreObj]: ReturnType<StoreObj[Index]['getStore']>;
|
|
@@ -79,23 +29,35 @@ export type CoreStoresValues = {
|
|
|
79
29
|
};
|
|
80
30
|
export type CoreStoreInstance = ReadableAtom<CoreStoresValues>;
|
|
81
31
|
/**
|
|
82
|
-
* @description
|
|
32
|
+
* @description `CoreStore` is a store that contains all the necessary data for the SDK to work.
|
|
33
|
+
* `CoreStore` is a singleton and is created when the SDK is initialized. It includes the following stores:
|
|
34
|
+
* - `enabled` - the status of the SDK. The SDK is enabled when the `on` value is set.
|
|
35
|
+
* - `status` - the status of the SDK. Can be one of the following values: `disabled`, `initialization`, `ready`, `failed`, `suspended`.
|
|
36
|
+
* - `userKey` - the user key provided by the host.
|
|
37
|
+
* - `userToken` - the user token received from the StreamLayer after login.
|
|
38
|
+
* - `organizationSettings` - the organization settings.
|
|
39
|
+
* - `organizationAdvertising` - the organization advertising.
|
|
40
|
+
* - `streamSettings` - the stream settings.
|
|
41
|
+
* - `user` - the user data.
|
|
42
|
+
* - `userSettings` - the user settings.
|
|
43
|
+
* - `providerStreamId` - the event id provided by the host.
|
|
44
|
+
* - `slStreamId` - the event id received from the StreamLayer, resolved by the `providerStreamId`.
|
|
83
45
|
*/
|
|
84
46
|
export declare class CoreStore extends AbstractStore<CoreStoreInstance> {
|
|
85
47
|
private stores;
|
|
86
48
|
constructor(transport: Transport);
|
|
87
49
|
getValue(): unknown;
|
|
88
50
|
getValues(): {
|
|
89
|
-
readonly enabled: SingleStore<unknown, import("nanostores").WritableAtom<"on" | undefined>>;
|
|
90
|
-
readonly status: SingleStore<unknown, import("nanostores").WritableAtom<CoreStatus>>;
|
|
91
|
-
readonly providerStreamId: SingleStore<unknown, import("nanostores").WritableAtom<string | undefined>>;
|
|
92
|
-
readonly slStreamId: ApiStore<string | undefined, import("@nanostores/query").FetcherStore<string | undefined, any>>;
|
|
93
|
-
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>>;
|
|
94
|
-
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>>;
|
|
95
|
-
readonly userKey: SingleStore<unknown, import("nanostores").WritableAtom<string | undefined>>;
|
|
96
|
-
readonly userToken: SingleStore<unknown, import("nanostores").WritableAtom<string | undefined>>;
|
|
97
|
-
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>>;
|
|
98
|
-
readonly organizationSettings: ApiStore<{
|
|
51
|
+
readonly enabled: import("@streamlayer/sdk-web-interfaces").SingleStore<unknown, import("nanostores").WritableAtom<"on" | undefined>>;
|
|
52
|
+
readonly status: import("@streamlayer/sdk-web-interfaces").SingleStore<unknown, import("nanostores").WritableAtom<CoreStatus>>;
|
|
53
|
+
readonly providerStreamId: import("@streamlayer/sdk-web-interfaces").SingleStore<unknown, import("nanostores").WritableAtom<string | undefined>>;
|
|
54
|
+
readonly slStreamId: import("@streamlayer/sdk-web-interfaces").ApiStore<string | undefined, import("@nanostores/query").FetcherStore<string | undefined, any>>;
|
|
55
|
+
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>>;
|
|
56
|
+
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>>;
|
|
57
|
+
readonly userKey: import("@streamlayer/sdk-web-interfaces").SingleStore<unknown, import("nanostores").WritableAtom<string | undefined>>;
|
|
58
|
+
readonly userToken: import("@streamlayer/sdk-web-interfaces").SingleStore<unknown, import("nanostores").WritableAtom<string | undefined>>;
|
|
59
|
+
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>>;
|
|
60
|
+
readonly organizationSettings: import("@streamlayer/sdk-web-interfaces").ApiStore<{
|
|
99
61
|
id: string;
|
|
100
62
|
overlays?: import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").SdkOverlay[] | undefined;
|
|
101
63
|
buttonIcon?: string | undefined;
|
|
@@ -128,7 +90,7 @@ export declare class CoreStore extends AbstractStore<CoreStoreInstance> {
|
|
|
128
90
|
pub?: import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").JWK | undefined;
|
|
129
91
|
getstream?: import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").GetStreamSettingsClient | undefined;
|
|
130
92
|
} | undefined, any>>;
|
|
131
|
-
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>>;
|
|
93
|
+
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>>;
|
|
132
94
|
};
|
|
133
95
|
setValue(): void;
|
|
134
96
|
subscribe: (subscribes: Partial<StoreListeners>) => void;
|
|
@@ -137,4 +99,3 @@ export declare class CoreStore extends AbstractStore<CoreStoreInstance> {
|
|
|
137
99
|
export type StoreListeners = {
|
|
138
100
|
[Index in keyof StoreObj]: (params: FetcherValue<CoreStoreInterface[Index]>) => void;
|
|
139
101
|
};
|
|
140
|
-
export {};
|
package/lib/store/store.js
CHANGED
|
@@ -1,67 +1,20 @@
|
|
|
1
|
-
import { AbstractStore,
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
export var CoreStatus;
|
|
5
|
-
(function (CoreStatus) {
|
|
6
|
-
CoreStatus["DISABLED"] = "disabled";
|
|
7
|
-
CoreStatus["INITIALIZATION"] = "initialization";
|
|
8
|
-
CoreStatus["READY"] = "ready";
|
|
9
|
-
CoreStatus["FAILED"] = "failed";
|
|
10
|
-
CoreStatus["SUSPENDED"] = "suspended";
|
|
11
|
-
})(CoreStatus || (CoreStatus = {}));
|
|
12
|
-
const initializeStore = (transport) => {
|
|
13
|
-
// sdk toggle
|
|
14
|
-
const enabled = new SingleStore(createSingleStore(undefined), 'enabled');
|
|
15
|
-
// sdk status
|
|
16
|
-
const status = new SingleStore(createSingleStore(CoreStatus.DISABLED), 'status');
|
|
17
|
-
// host user key
|
|
18
|
-
const userKey = new SingleStore(createSingleStore(undefined), 'userKey');
|
|
19
|
-
// sl user key
|
|
20
|
-
const userToken = new SingleStore(createSingleStore(undefined), 'userToken');
|
|
21
|
-
const storage = new UserStorage();
|
|
22
|
-
userToken.listen((token) => {
|
|
23
|
-
if (token) {
|
|
24
|
-
storage.setToken(token);
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
storage.removeToken();
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
// host event id
|
|
31
|
-
const providerStreamId = new SingleStore(createSingleStore(undefined), 'providerStreamId');
|
|
32
|
-
// sl event id
|
|
33
|
-
const slStreamId = new ApiStore(queries.$retrieveEventId(providerStreamId.getStore(), transport), 'slStreamId', (data) => data?.data);
|
|
34
|
-
// sl user data
|
|
35
|
-
const user = new ApiStore(queries.$user(userToken.getStore(), transport), 'user', (data) => data?.data?.data?.id);
|
|
36
|
-
// sl user settings
|
|
37
|
-
const userSettings = new ApiStore(queries.$userSettings(userToken.getStore(), transport), 'userSettings');
|
|
38
|
-
// sl stream settings
|
|
39
|
-
const streamSettings = new ApiStore(queries.$streamSettings(slStreamId.getAtomStore(), transport), 'streamSettings');
|
|
40
|
-
slStreamId.getAtomStore().listen((eventId) => {
|
|
41
|
-
if (eventId === '' || eventId === undefined) {
|
|
42
|
-
streamSettings.getStore().mutate(undefined);
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
// sl organization settings
|
|
46
|
-
const organizationSettings = new ApiStore(queries.$organizationSettings(enabled.getStore(), transport), 'organizationSettings', (data) => data?.data?.id);
|
|
47
|
-
// sl organization advertising
|
|
48
|
-
const organizationAdvertising = new ApiStore(queries.$organizationAdvertising(organizationSettings.getAtomStore(), transport), 'organizationAdvertising');
|
|
49
|
-
return {
|
|
50
|
-
enabled,
|
|
51
|
-
status,
|
|
52
|
-
providerStreamId,
|
|
53
|
-
slStreamId,
|
|
54
|
-
streamSettings,
|
|
55
|
-
user,
|
|
56
|
-
userKey,
|
|
57
|
-
userToken,
|
|
58
|
-
userSettings,
|
|
59
|
-
organizationSettings,
|
|
60
|
-
organizationAdvertising,
|
|
61
|
-
};
|
|
62
|
-
};
|
|
1
|
+
import { AbstractStore, mergeStores } from '@streamlayer/sdk-web-interfaces';
|
|
2
|
+
import { initializeStore, CoreStatus } from './init';
|
|
3
|
+
export { CoreStatus };
|
|
63
4
|
/**
|
|
64
|
-
* @description
|
|
5
|
+
* @description `CoreStore` is a store that contains all the necessary data for the SDK to work.
|
|
6
|
+
* `CoreStore` is a singleton and is created when the SDK is initialized. It includes the following stores:
|
|
7
|
+
* - `enabled` - the status of the SDK. The SDK is enabled when the `on` value is set.
|
|
8
|
+
* - `status` - the status of the SDK. Can be one of the following values: `disabled`, `initialization`, `ready`, `failed`, `suspended`.
|
|
9
|
+
* - `userKey` - the user key provided by the host.
|
|
10
|
+
* - `userToken` - the user token received from the StreamLayer after login.
|
|
11
|
+
* - `organizationSettings` - the organization settings.
|
|
12
|
+
* - `organizationAdvertising` - the organization advertising.
|
|
13
|
+
* - `streamSettings` - the stream settings.
|
|
14
|
+
* - `user` - the user data.
|
|
15
|
+
* - `userSettings` - the user settings.
|
|
16
|
+
* - `providerStreamId` - the event id provided by the host.
|
|
17
|
+
* - `slStreamId` - the event id received from the StreamLayer, resolved by the `providerStreamId`.
|
|
65
18
|
*/
|
|
66
19
|
export class CoreStore extends AbstractStore {
|
|
67
20
|
stores;
|
package/package.json
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"@streamlayer/sl-eslib": "^5.52.0",
|
|
10
10
|
"@streamlayer/sdk-web-interfaces": "^0.18.5",
|
|
11
11
|
"@streamlayer/sdk-web-storage": "^0.3.7",
|
|
12
|
-
"@streamlayer/sdk-web-api": "^0.0
|
|
12
|
+
"@streamlayer/sdk-web-api": "^0.1.0",
|
|
13
13
|
"@streamlayer/sdk-web-types": "^0.16.5"
|
|
14
14
|
},
|
|
15
15
|
"exports": {
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"default": "./lib/auth/index.js"
|
|
40
40
|
}
|
|
41
41
|
},
|
|
42
|
-
"version": "0.
|
|
42
|
+
"version": "0.16.0",
|
|
43
43
|
"type": "module",
|
|
44
44
|
"main": "./lib/index.js",
|
|
45
45
|
"module": "./lib/index.js",
|