@streamlayer/sdk-web-api 0.3.0 → 0.6.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/package.json +3 -1
- package/src/grpc/queries/event.d.ts +3 -3
- package/src/grpc/queries/event.js +14 -17
- package/src/grpc/queries/event.js.map +1 -1
- package/src/grpc/queries/organization.d.ts +3 -3
- package/src/grpc/queries/organization.js +8 -15
- package/src/grpc/queries/organization.js.map +1 -1
- package/src/grpc/queries/queries.test.js +37 -0
- package/src/grpc/queries/queries.test.js.map +1 -0
- package/src/grpc/queries/user.d.ts +3 -3
- package/src/grpc/queries/user.js +15 -18
- package/src/grpc/queries/user.js.map +1 -1
- package/src/grpc/transport.d.ts +19 -2
- package/src/grpc/transport.js +53 -11
- package/src/grpc/transport.js.map +1 -1
- package/src/grpc/transport.test.js +77 -6
- package/src/grpc/transport.test.js.map +1 -1
- package/src/utils/grpc-stub.d.ts +7 -0
- package/src/utils/grpc-stub.js +36 -0
- package/src/utils/grpc-stub.js.map +1 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@streamlayer/sdk-web-api",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./src/index.js",
|
|
6
6
|
"typings": "./src/index.d.ts",
|
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"@bufbuild/connect": "*",
|
|
12
12
|
"@bufbuild/connect-web": "*",
|
|
13
|
+
"@bufbuild/protobuf": "*",
|
|
14
|
+
"@connectrpc/connect": "*",
|
|
13
15
|
"@nanostores/query": "*",
|
|
14
16
|
"@streamlayer/sdk-web-interfaces": "*",
|
|
15
17
|
"@streamlayer/sl-eslib": "*",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ReadableAtom } from 'nanostores';
|
|
2
|
-
import {
|
|
2
|
+
import { Transport } from '../transport';
|
|
3
3
|
export { $user } from './user';
|
|
4
|
-
export declare const $retrieveEventId: ($providerStreamId: ReadableAtom<string>, transport:
|
|
5
|
-
export declare const $streamSettings: (slStreamId: string, transport:
|
|
4
|
+
export declare const $retrieveEventId: ($providerStreamId: ReadableAtom<string>, transport: Transport) => import("@nanostores/query").FetcherStore<string, any>;
|
|
5
|
+
export declare const $streamSettings: (slStreamId: string, transport: Transport) => import("@nanostores/query").FetcherStore<import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").StreamSettings, any>;
|
|
@@ -1,23 +1,21 @@
|
|
|
1
1
|
import { nanoquery } from '@nanostores/query';
|
|
2
|
-
import { createPromiseClient } from '@bufbuild/connect';
|
|
3
2
|
import { Events } from '@streamlayer/sl-eslib/sports/events/events_connect';
|
|
4
3
|
import { Client } from '@streamlayer/sl-eslib/sdkSettings/client/client_connect';
|
|
5
4
|
export { $user } from './user';
|
|
6
5
|
const [createFetcherStore] = nanoquery();
|
|
7
6
|
export const $retrieveEventId = ($providerStreamId, transport)=>{
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
];
|
|
7
|
+
const { client, queryKey } = transport.createPromiseClient(Events, {
|
|
8
|
+
method: 'retrieveEventId',
|
|
9
|
+
params: [
|
|
10
|
+
$providerStreamId
|
|
11
|
+
]
|
|
12
|
+
});
|
|
15
13
|
return createFetcherStore(queryKey, {
|
|
16
14
|
fetcher: async (_, __, id)=>{
|
|
17
15
|
if (!id) {
|
|
18
16
|
return '';
|
|
19
17
|
}
|
|
20
|
-
const res = await
|
|
18
|
+
const res = await client.retrieveEventId({
|
|
21
19
|
id
|
|
22
20
|
});
|
|
23
21
|
return res.data?.id || '';
|
|
@@ -25,16 +23,15 @@ export const $retrieveEventId = ($providerStreamId, transport)=>{
|
|
|
25
23
|
});
|
|
26
24
|
};
|
|
27
25
|
export const $streamSettings = (slStreamId, transport)=>{
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
];
|
|
26
|
+
const { client, queryKey } = transport.createPromiseClient(Client, {
|
|
27
|
+
method: 'getStream',
|
|
28
|
+
params: [
|
|
29
|
+
slStreamId
|
|
30
|
+
]
|
|
31
|
+
});
|
|
35
32
|
return createFetcherStore(queryKey, {
|
|
36
33
|
fetcher: async (_, __, id)=>{
|
|
37
|
-
const res = await
|
|
34
|
+
const res = await client.getStream({
|
|
38
35
|
id
|
|
39
36
|
});
|
|
40
37
|
return res.data?.attributes;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../packages/sdk-web-api/src/grpc/queries/event.ts"],"sourcesContent":["import { nanoquery } from '@nanostores/query'\nimport { ReadableAtom } from 'nanostores'\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../../../../packages/sdk-web-api/src/grpc/queries/event.ts"],"sourcesContent":["import { nanoquery } from '@nanostores/query'\nimport { ReadableAtom } from 'nanostores'\nimport { Events } from '@streamlayer/sl-eslib/sports/events/events_connect'\nimport { Client } from '@streamlayer/sl-eslib/sdkSettings/client/client_connect'\n\nimport { Transport } from '../transport'\n\nexport { $user } from './user'\n\nconst [createFetcherStore] = nanoquery()\n\nexport const $retrieveEventId = (\n $providerStreamId: ReadableAtom<string>,\n transport: Transport\n) => {\n const { client, queryKey } = transport.createPromiseClient(Events, { method: 'retrieveEventId', params: [$providerStreamId] })\n\n return createFetcherStore(queryKey, {\n fetcher: async (_: string, __: string, id: string) => {\n if (!id) {\n return ''\n }\n\n const res = await client.retrieveEventId({\n id,\n })\n\n return res.data?.id as unknown as string || ''\n },\n })\n}\n\nexport const $streamSettings = (\n slStreamId: string,\n transport: Transport\n) => {\n const { client, queryKey } = transport.createPromiseClient(Client, { method: 'getStream', params: [slStreamId] })\n\n return createFetcherStore(queryKey, {\n fetcher: async (_: string, __: string, id: string) => {\n const res = await client.getStream({\n id,\n })\n\n return res.data?.attributes\n },\n })\n}\n"],"names":["nanoquery","Events","Client","$user","createFetcherStore","$retrieveEventId","$providerStreamId","transport","client","queryKey","createPromiseClient","method","params","fetcher","_","__","id","res","retrieveEventId","data","$streamSettings","slStreamId","getStream","attributes"],"mappings":"AAAA,SAASA,SAAS,QAAQ,oBAAmB;AAE7C,SAASC,MAAM,QAAQ,qDAAoD;AAC3E,SAASC,MAAM,QAAQ,0DAAyD;AAIhF,SAASC,KAAK,QAAQ,SAAQ;AAE9B,MAAM,CAACC,mBAAmB,GAAGJ;AAE7B,OAAO,MAAMK,mBAAmB,CAC9BC,mBACAC;IAEA,MAAM,EAAEC,MAAM,EAAEC,QAAQ,EAAE,GAAGF,UAAUG,mBAAmB,CAACT,QAAQ;QAAEU,QAAQ;QAAmBC,QAAQ;YAACN;SAAkB;IAAC;IAE5H,OAAOF,mBAAmBK,UAAU;QAClCI,SAAS,OAAOC,GAAWC,IAAYC;YACrC,IAAI,CAACA,IAAI;gBACP,OAAO;YACT;YAEA,MAAMC,MAAM,MAAMT,OAAOU,eAAe,CAAC;gBACvCF;YACF;YAEA,OAAOC,IAAIE,IAAI,EAAEH,MAA2B;QAC9C;IACF;AACF,EAAC;AAED,OAAO,MAAMI,kBAAkB,CAC7BC,YACAd;IAEA,MAAM,EAAEC,MAAM,EAAEC,QAAQ,EAAE,GAAGF,UAAUG,mBAAmB,CAACR,QAAQ;QAAES,QAAQ;QAAaC,QAAQ;YAACS;SAAW;IAAC;IAE/G,OAAOjB,mBAAmBK,UAAU;QAClCI,SAAS,OAAOC,GAAWC,IAAYC;YACrC,MAAMC,MAAM,MAAMT,OAAOc,SAAS,CAAC;gBACjCN;YACF;YAEA,OAAOC,IAAIE,IAAI,EAAEI;QACnB;IACF;AACF,EAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Transport } from '../transport';
|
|
2
2
|
export { $user } from './user';
|
|
3
|
-
export declare const $organizationSettings: (transport:
|
|
4
|
-
export declare const $organizationAdvertising: (transport:
|
|
3
|
+
export declare const $organizationSettings: (transport: Transport) => import("@nanostores/query").FetcherStore<import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").OrganizationSettings, any>;
|
|
4
|
+
export declare const $organizationAdvertising: (transport: Transport) => import("@nanostores/query").FetcherStore<import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").Advertising, any>;
|
|
@@ -1,32 +1,25 @@
|
|
|
1
1
|
import { nanoquery } from '@nanostores/query';
|
|
2
|
-
import { createPromiseClient } from '@bufbuild/connect';
|
|
3
2
|
import { Client } from '@streamlayer/sl-eslib/sdkSettings/client/client_connect';
|
|
4
3
|
export { $user } from './user';
|
|
5
4
|
const [createFetcherStore] = nanoquery();
|
|
6
5
|
export const $organizationSettings = (transport)=>{
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
Client.typeName,
|
|
11
|
-
methodName.charAt(0).toLowerCase() + methodName.slice(1)
|
|
12
|
-
];
|
|
6
|
+
const { client, queryKey } = transport.createPromiseClient(Client, {
|
|
7
|
+
method: 'getOrganization'
|
|
8
|
+
});
|
|
13
9
|
return createFetcherStore(queryKey, {
|
|
14
10
|
fetcher: async ()=>{
|
|
15
|
-
const res = await
|
|
11
|
+
const res = await client.getOrganization({});
|
|
16
12
|
return res.data?.attributes;
|
|
17
13
|
}
|
|
18
14
|
});
|
|
19
15
|
};
|
|
20
16
|
export const $organizationAdvertising = (transport)=>{
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
Client.typeName,
|
|
25
|
-
methodName.charAt(0).toLowerCase() + methodName.slice(1)
|
|
26
|
-
];
|
|
17
|
+
const { client, queryKey } = transport.createPromiseClient(Client, {
|
|
18
|
+
method: 'getOrganizationAdvertising'
|
|
19
|
+
});
|
|
27
20
|
return createFetcherStore(queryKey, {
|
|
28
21
|
fetcher: async ()=>{
|
|
29
|
-
const res = await
|
|
22
|
+
const res = await client.getOrganizationAdvertising({});
|
|
30
23
|
return res.data?.attributes;
|
|
31
24
|
}
|
|
32
25
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../packages/sdk-web-api/src/grpc/queries/organization.ts"],"sourcesContent":["import { nanoquery } from '@nanostores/query'\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../../../../packages/sdk-web-api/src/grpc/queries/organization.ts"],"sourcesContent":["import { nanoquery } from '@nanostores/query'\nimport { Client } from '@streamlayer/sl-eslib/sdkSettings/client/client_connect'\n\nimport { Transport } from '../transport'\n\nexport { $user } from './user'\n\nconst [createFetcherStore] = nanoquery()\n\nexport const $organizationSettings = (transport: Transport) => {\n const { client, queryKey } = transport.createPromiseClient(Client, { method: 'getOrganization' })\n\n return createFetcherStore(queryKey, {\n fetcher: async () => {\n const res = await client.getOrganization({})\n\n return res.data?.attributes\n },\n })\n}\n\nexport const $organizationAdvertising = (transport: Transport) => {\n const { client, queryKey } = transport.createPromiseClient(Client, { method: 'getOrganizationAdvertising' })\n\n return createFetcherStore(queryKey, {\n fetcher: async () => {\n const res = await client.getOrganizationAdvertising({})\n\n return res.data?.attributes\n },\n })\n}\n"],"names":["nanoquery","Client","$user","createFetcherStore","$organizationSettings","transport","client","queryKey","createPromiseClient","method","fetcher","res","getOrganization","data","attributes","$organizationAdvertising","getOrganizationAdvertising"],"mappings":"AAAA,SAASA,SAAS,QAAQ,oBAAmB;AAC7C,SAASC,MAAM,QAAQ,0DAAyD;AAIhF,SAASC,KAAK,QAAQ,SAAQ;AAE9B,MAAM,CAACC,mBAAmB,GAAGH;AAE7B,OAAO,MAAMI,wBAAwB,CAACC;IACpC,MAAM,EAAEC,MAAM,EAAEC,QAAQ,EAAE,GAAGF,UAAUG,mBAAmB,CAACP,QAAQ;QAAEQ,QAAQ;IAAkB;IAE/F,OAAON,mBAAmBI,UAAU;QAClCG,SAAS;YACP,MAAMC,MAAM,MAAML,OAAOM,eAAe,CAAC,CAAC;YAE1C,OAAOD,IAAIE,IAAI,EAAEC;QACnB;IACF;AACF,EAAC;AAED,OAAO,MAAMC,2BAA2B,CAACV;IACvC,MAAM,EAAEC,MAAM,EAAEC,QAAQ,EAAE,GAAGF,UAAUG,mBAAmB,CAACP,QAAQ;QAAEQ,QAAQ;IAA6B;IAE1G,OAAON,mBAAmBI,UAAU;QAClCG,SAAS;YACP,MAAMC,MAAM,MAAML,OAAOU,0BAA0B,CAAC,CAAC;YAErD,OAAOL,IAAIE,IAAI,EAAEC;QACnB;IACF;AACF,EAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { ApiStore, createSingleStore } from "@streamlayer/sdk-web-interfaces";
|
|
2
|
+
import { Events } from "@streamlayer/sl-eslib/streamlayer/sports/events/events_connect";
|
|
3
|
+
import { MockTransport } from '../transport';
|
|
4
|
+
import { $retrieveEventId } from './event';
|
|
5
|
+
describe("Simple requests test", ()=>{
|
|
6
|
+
const ctx = {
|
|
7
|
+
providerStreamId: createSingleStore('')
|
|
8
|
+
};
|
|
9
|
+
beforeAll(()=>{
|
|
10
|
+
const mock = ({ service })=>{
|
|
11
|
+
service(Events, {
|
|
12
|
+
retrieveEventId: ()=>({
|
|
13
|
+
data: {
|
|
14
|
+
id: 123
|
|
15
|
+
}
|
|
16
|
+
})
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
ctx.transport = new MockTransport(mock);
|
|
20
|
+
ctx.api = new ApiStore($retrieveEventId(ctx.providerStreamId, ctx.transport));
|
|
21
|
+
ctx.api.listen(()=>{});
|
|
22
|
+
});
|
|
23
|
+
afterAll(()=>{
|
|
24
|
+
ctx.api.off();
|
|
25
|
+
});
|
|
26
|
+
it('returns empty sl event id if provider id not defined', async ()=>{
|
|
27
|
+
const emptyEvent = await ctx.api.getValue();
|
|
28
|
+
expect(emptyEvent).toEqual('');
|
|
29
|
+
});
|
|
30
|
+
it('returns sl event id if provider id defined', async ()=>{
|
|
31
|
+
ctx.providerStreamId.set('demo:event');
|
|
32
|
+
const resolvedEvent = await ctx.api.getValue();
|
|
33
|
+
expect(resolvedEvent).toEqual('123');
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
//# sourceMappingURL=queries.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../packages/sdk-web-api/src/grpc/queries/queries.test.ts"],"sourcesContent":["import { ApiStore, createSingleStore } from \"@streamlayer/sdk-web-interfaces\";\n\nimport { Events } from \"@streamlayer/sl-eslib/streamlayer/sports/events/events_connect\";\n\nimport { MockTransport } from '../transport';\n\nimport { $retrieveEventId } from './event';\n\ndescribe(\"Simple requests test\", () => {\n const ctx: {\n providerStreamId: ReturnType<typeof createSingleStore<string>>\n api?: ApiStore<ReturnType<typeof $retrieveEventId>>\n transport?: MockTransport\n } = {\n providerStreamId: createSingleStore(''),\n };\n\n beforeAll(() => {\n const mock = ({ service }) => {\n service(Events, {\n retrieveEventId: () => ({ data: { id: 123 } })\n });\n }\n\n ctx.transport = new MockTransport(mock)\n\n ctx.api = new ApiStore($retrieveEventId(ctx.providerStreamId, ctx.transport));\n ctx.api.listen(() => {});\n });\n\n afterAll(() => {\n ctx.api.off();\n });\n\n it('returns empty sl event id if provider id not defined', async () => {\n const emptyEvent = await ctx.api.getValue();\n\n expect(emptyEvent).toEqual('')\n });\n\n it('returns sl event id if provider id defined', async () => {\n ctx.providerStreamId.set('demo:event');\n const resolvedEvent = await ctx.api.getValue()\n\n expect(resolvedEvent).toEqual('123')\n });\n});\n"],"names":["ApiStore","createSingleStore","Events","MockTransport","$retrieveEventId","describe","ctx","providerStreamId","beforeAll","mock","service","retrieveEventId","data","id","transport","api","listen","afterAll","off","it","emptyEvent","getValue","expect","toEqual","set","resolvedEvent"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,iBAAiB,QAAQ,kCAAkC;AAE9E,SAASC,MAAM,QAAQ,iEAAiE;AAExF,SAASC,aAAa,QAAQ,eAAe;AAE7C,SAASC,gBAAgB,QAAQ,UAAU;AAE3CC,SAAS,wBAAwB;IAC/B,MAAMC,MAIF;QACFC,kBAAkBN,kBAAkB;IACtC;IAEAO,UAAU;QACR,MAAMC,OAAO,CAAC,EAAEC,OAAO,EAAE;YACvBA,QAAQR,QAAQ;gBACdS,iBAAiB,IAAO,CAAA;wBAAEC,MAAM;4BAAEC,IAAI;wBAAI;oBAAE,CAAA;YAC9C;QACF;QAEAP,IAAIQ,SAAS,GAAG,IAAIX,cAAcM;QAElCH,IAAIS,GAAG,GAAG,IAAIf,SAASI,iBAAiBE,IAAIC,gBAAgB,EAAED,IAAIQ,SAAS;QAC3ER,IAAIS,GAAG,CAACC,MAAM,CAAC,KAAO;IACxB;IAEAC,SAAS;QACPX,IAAIS,GAAG,CAACG,GAAG;IACb;IAEAC,GAAG,wDAAwD;QACzD,MAAMC,aAAa,MAAMd,IAAIS,GAAG,CAACM,QAAQ;QAEzCC,OAAOF,YAAYG,OAAO,CAAC;IAC7B;IAEAJ,GAAG,8CAA8C;QAC/Cb,IAAIC,gBAAgB,CAACiB,GAAG,CAAC;QACzB,MAAMC,gBAAgB,MAAMnB,IAAIS,GAAG,CAACM,QAAQ;QAE5CC,OAAOG,eAAeF,OAAO,CAAC;IAChC;AACF"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { ReadableAtom } from 'nanostores';
|
|
2
|
-
import {
|
|
3
|
-
export declare const $user: ($userKey: ReadableAtom<string>, $userToken: ReadableAtom<string>, transport:
|
|
2
|
+
import { Transport } from '../transport';
|
|
3
|
+
export declare const $user: ($userKey: ReadableAtom<string>, $userToken: ReadableAtom<string>, transport: Transport) => import("@nanostores/query").FetcherStore<import("@streamlayer/sl-eslib/users/users_pb").BypassAuthResponse | {
|
|
4
4
|
meta: {
|
|
5
5
|
jwt: string;
|
|
6
6
|
};
|
|
7
7
|
data?: import("@streamlayer/sl-eslib/users/users_common_pb").User;
|
|
8
8
|
}, any>;
|
|
9
|
-
export declare const $userSettings: ($userToken: ReadableAtom<string>, transport:
|
|
9
|
+
export declare const $userSettings: ($userToken: ReadableAtom<string>, transport: Transport) => import("@nanostores/query").FetcherStore<import("@streamlayer/sl-eslib/sdkSettings/client/client_pb").ClientSettings, any>;
|
package/src/grpc/queries/user.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { nanoquery } from '@nanostores/query';
|
|
2
|
-
import { createPromiseClient } from '@bufbuild/connect';
|
|
3
2
|
import { Users } from '@streamlayer/sl-eslib/users/users_connect';
|
|
4
3
|
import { Client } from '@streamlayer/sl-eslib/sdkSettings/client/client_connect';
|
|
5
4
|
const [createFetcherStore] = nanoquery();
|
|
@@ -10,13 +9,12 @@ const [createFetcherStore] = nanoquery();
|
|
|
10
9
|
// save token
|
|
11
10
|
// called on update user key
|
|
12
11
|
export const $user = ($userKey, $userToken, transport)=>{
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
];
|
|
12
|
+
const { queryKey, client } = transport.createPromiseClient(Users, {
|
|
13
|
+
method: 'bypassAuth',
|
|
14
|
+
params: [
|
|
15
|
+
$userKey
|
|
16
|
+
]
|
|
17
|
+
});
|
|
20
18
|
return createFetcherStore(queryKey, {
|
|
21
19
|
fetcher: async (_, __, userKey)=>{
|
|
22
20
|
// if user token exist, try to validate and refresh user data
|
|
@@ -24,7 +22,7 @@ export const $user = ($userKey, $userToken, transport)=>{
|
|
|
24
22
|
// and relogin
|
|
25
23
|
if ($userToken.get()) {
|
|
26
24
|
try {
|
|
27
|
-
const response = await
|
|
25
|
+
const response = await client.me({});
|
|
28
26
|
return {
|
|
29
27
|
...response,
|
|
30
28
|
meta: {
|
|
@@ -35,7 +33,7 @@ export const $user = ($userKey, $userToken, transport)=>{
|
|
|
35
33
|
console.log('invalid token, relogin...');
|
|
36
34
|
}
|
|
37
35
|
}
|
|
38
|
-
return
|
|
36
|
+
return client.bypassAuth({
|
|
39
37
|
userKey,
|
|
40
38
|
schema: 'streamlayer'
|
|
41
39
|
});
|
|
@@ -43,16 +41,15 @@ export const $user = ($userKey, $userToken, transport)=>{
|
|
|
43
41
|
});
|
|
44
42
|
};
|
|
45
43
|
export const $userSettings = ($userToken, transport)=>{
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
];
|
|
44
|
+
const { client, queryKey } = transport.createPromiseClient(Client, {
|
|
45
|
+
method: 'get',
|
|
46
|
+
params: [
|
|
47
|
+
$userToken
|
|
48
|
+
]
|
|
49
|
+
});
|
|
53
50
|
return createFetcherStore(queryKey, {
|
|
54
51
|
fetcher: async ()=>{
|
|
55
|
-
const data = await
|
|
52
|
+
const data = await client.get({});
|
|
56
53
|
return data.data?.attributes;
|
|
57
54
|
}
|
|
58
55
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../packages/sdk-web-api/src/grpc/queries/user.ts"],"sourcesContent":["import { nanoquery } from '@nanostores/query'\nimport { ReadableAtom } from 'nanostores'\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../../../../packages/sdk-web-api/src/grpc/queries/user.ts"],"sourcesContent":["import { nanoquery } from '@nanostores/query'\nimport { ReadableAtom } from 'nanostores'\nimport { Users } from '@streamlayer/sl-eslib/users/users_connect'\nimport { Client } from '@streamlayer/sl-eslib/sdkSettings/client/client_connect'\n\nimport { Transport } from '../transport'\n\nconst [createFetcherStore] = nanoquery()\n\n// user query\n// cache user\n// invalidate token\n// login\n// save token\n// called on update user key\nexport const $user = (\n $userKey: ReadableAtom<string>, // user key from host\n $userToken: ReadableAtom<string>, // sl user token\n transport: Transport\n) => {\n const { queryKey, client } = transport.createPromiseClient(Users, { method: 'bypassAuth', params: [$userKey] })\n\n return createFetcherStore(queryKey, {\n fetcher: async (_, __, userKey: string) => {\n // if user token exist, try to validate and refresh user data\n // otherwise clear invalid login token\n // and relogin\n if ($userToken.get()) {\n try {\n const response = await client.me({})\n\n return {\n ...response,\n meta: {\n jwt: $userToken.get(),\n },\n }\n } catch (err) {\n console.log('invalid token, relogin...')\n }\n }\n\n return client.bypassAuth({\n userKey,\n schema: 'streamlayer',\n })\n },\n })\n}\n\nexport const $userSettings = (\n $userToken: ReadableAtom<string>, // sl user token\n transport: Transport\n) => {\n const { client, queryKey } = transport.createPromiseClient(Client, { method: 'get', params: [$userToken] })\n\n return createFetcherStore(queryKey, {\n fetcher: async () => {\n const data = await client.get({})\n\n return data.data?.attributes\n },\n })\n}\n"],"names":["nanoquery","Users","Client","createFetcherStore","$user","$userKey","$userToken","transport","queryKey","client","createPromiseClient","method","params","fetcher","_","__","userKey","get","response","me","meta","jwt","err","console","log","bypassAuth","schema","$userSettings","data","attributes"],"mappings":"AAAA,SAASA,SAAS,QAAQ,oBAAmB;AAE7C,SAASC,KAAK,QAAQ,4CAA2C;AACjE,SAASC,MAAM,QAAQ,0DAAyD;AAIhF,MAAM,CAACC,mBAAmB,GAAGH;AAE7B,aAAa;AACb,aAAa;AACb,mBAAmB;AACnB,QAAQ;AACR,aAAa;AACb,4BAA4B;AAC5B,OAAO,MAAMI,QAAQ,CACnBC,UACAC,YACAC;IAEA,MAAM,EAAEC,QAAQ,EAAEC,MAAM,EAAE,GAAGF,UAAUG,mBAAmB,CAACT,OAAO;QAAEU,QAAQ;QAAcC,QAAQ;YAACP;SAAS;IAAC;IAE7G,OAAOF,mBAAmBK,UAAU;QAClCK,SAAS,OAAOC,GAAGC,IAAIC;YACrB,6DAA6D;YAC7D,sCAAsC;YACtC,cAAc;YACd,IAAIV,WAAWW,GAAG,IAAI;gBACpB,IAAI;oBACF,MAAMC,WAAW,MAAMT,OAAOU,EAAE,CAAC,CAAC;oBAElC,OAAO;wBACL,GAAGD,QAAQ;wBACXE,MAAM;4BACJC,KAAKf,WAAWW,GAAG;wBACrB;oBACF;gBACF,EAAE,OAAOK,KAAK;oBACZC,QAAQC,GAAG,CAAC;gBACd;YACF;YAEA,OAAOf,OAAOgB,UAAU,CAAC;gBACvBT;gBACAU,QAAQ;YACV;QACF;IACF;AACF,EAAC;AAED,OAAO,MAAMC,gBAAgB,CAC3BrB,YACAC;IAEA,MAAM,EAAEE,MAAM,EAAED,QAAQ,EAAE,GAAGD,UAAUG,mBAAmB,CAACR,QAAQ;QAAES,QAAQ;QAAOC,QAAQ;YAACN;SAAW;IAAC;IAEzG,OAAOH,mBAAmBK,UAAU;QAClCK,SAAS;YACP,MAAMe,OAAO,MAAMnB,OAAOQ,GAAG,CAAC,CAAC;YAE/B,OAAOW,KAAKA,IAAI,EAAEC;QACpB;IACF;AACF,EAAC"}
|
package/src/grpc/transport.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createRouterTransport, ConnectRouter } from "@connectrpc/connect";
|
|
2
|
+
import { Interceptor, PromiseClient, UnaryRequest, StreamRequest } from '@bufbuild/connect';
|
|
3
|
+
import type { ServiceType } from '@bufbuild/protobuf';
|
|
2
4
|
import { createGrpcWebTransport } from '@bufbuild/connect-web';
|
|
5
|
+
import type { KeyInput } from '@nanostores/query';
|
|
3
6
|
type KnownHeaders = {
|
|
4
7
|
authorization?: string;
|
|
5
8
|
sdk?: string;
|
|
@@ -17,11 +20,20 @@ declare global {
|
|
|
17
20
|
*/
|
|
18
21
|
export declare class Transport {
|
|
19
22
|
readonly transport: ReturnType<typeof createGrpcWebTransport>;
|
|
20
|
-
|
|
23
|
+
protected interceptors: Interceptor[];
|
|
21
24
|
private readonly $headers;
|
|
25
|
+
private clients;
|
|
22
26
|
constructor();
|
|
23
27
|
registerInterceptor: (interceptor: Interceptor) => void;
|
|
24
28
|
removeInterceptor: (interceptor: Interceptor) => void;
|
|
29
|
+
getClient: <T extends ServiceType>(service: T) => PromiseClient<T>;
|
|
30
|
+
createPromiseClient: <T extends ServiceType>(service: T, { params, method }: {
|
|
31
|
+
params?: KeyInput;
|
|
32
|
+
method: keyof T["methods"];
|
|
33
|
+
}) => {
|
|
34
|
+
client: PromiseClient<T>;
|
|
35
|
+
queryKey: ((string | number) | import("nanostores").ReadableAtom<void | (string | number)>)[];
|
|
36
|
+
};
|
|
25
37
|
setSdkKey: (sdkKey: string) => void;
|
|
26
38
|
setAuth: (token: string) => void;
|
|
27
39
|
setHeader: <T extends string = string>(name: ExcludeReservedHeaders<T>, value: string) => void;
|
|
@@ -29,4 +41,9 @@ export declare class Transport {
|
|
|
29
41
|
getHeaders: () => KnownHeaders;
|
|
30
42
|
initInterceptors: () => void;
|
|
31
43
|
}
|
|
44
|
+
export declare class MockTransport extends Transport {
|
|
45
|
+
transport: ReturnType<typeof createRouterTransport>;
|
|
46
|
+
calls: Array<UnaryRequest | StreamRequest>;
|
|
47
|
+
constructor(transport: (router: ConnectRouter) => void);
|
|
48
|
+
}
|
|
32
49
|
export {};
|
package/src/grpc/transport.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { MapStore, createMapStore } from '@streamlayer/sdk-web-interfaces';
|
|
2
|
+
import { createRouterTransport } from "@connectrpc/connect";
|
|
3
|
+
import { createPromiseClient } from '@bufbuild/connect';
|
|
2
4
|
import { createGrpcWebTransport } from '@bufbuild/connect-web';
|
|
3
5
|
const initialStore = {
|
|
4
6
|
sdk: process.env.SDK_KEY
|
|
@@ -7,12 +9,36 @@ const initialStore = {
|
|
|
7
9
|
* transport wrapper, initialize grpc transport, store headers and connect interceptors
|
|
8
10
|
*/ export class Transport {
|
|
9
11
|
constructor(){
|
|
10
|
-
this.interceptors =
|
|
12
|
+
this.interceptors = [];
|
|
11
13
|
this.registerInterceptor = (interceptor)=>{
|
|
12
|
-
this.interceptors.
|
|
14
|
+
this.interceptors.push(interceptor);
|
|
13
15
|
};
|
|
14
16
|
this.removeInterceptor = (interceptor)=>{
|
|
15
|
-
this.interceptors.
|
|
17
|
+
this.interceptors = this.interceptors.filter((i)=>i !== interceptor);
|
|
18
|
+
};
|
|
19
|
+
this.getClient = (service)=>{
|
|
20
|
+
const serviceName = service.typeName;
|
|
21
|
+
if (this.clients.has(serviceName)) {
|
|
22
|
+
return this.clients.get(serviceName);
|
|
23
|
+
}
|
|
24
|
+
const client = createPromiseClient(service, this.transport);
|
|
25
|
+
this.clients.set(serviceName, client);
|
|
26
|
+
return client;
|
|
27
|
+
};
|
|
28
|
+
this.createPromiseClient = (service, { params = [], method })=>{
|
|
29
|
+
const client = this.getClient(service);
|
|
30
|
+
const methodName = service.methods[method].name;
|
|
31
|
+
const queryKey = [
|
|
32
|
+
service.typeName,
|
|
33
|
+
methodName.charAt(0).toLowerCase() + methodName.slice(1),
|
|
34
|
+
...Array.isArray(params) ? params : [
|
|
35
|
+
params
|
|
36
|
+
]
|
|
37
|
+
];
|
|
38
|
+
return {
|
|
39
|
+
client,
|
|
40
|
+
queryKey
|
|
41
|
+
};
|
|
16
42
|
};
|
|
17
43
|
this.setSdkKey = (sdkKey)=>{
|
|
18
44
|
this.$headers.setValue('sdk', sdkKey);
|
|
@@ -24,7 +50,7 @@ const initialStore = {
|
|
|
24
50
|
this.getHeader = (name)=>this.$headers.getValue(name);
|
|
25
51
|
this.getHeaders = ()=>this.$headers.getValues();
|
|
26
52
|
this.initInterceptors = ()=>{
|
|
27
|
-
if (this.interceptors.
|
|
53
|
+
if (this.interceptors.length !== 0) {
|
|
28
54
|
return;
|
|
29
55
|
}
|
|
30
56
|
const auth = (next)=>async (req)=>{
|
|
@@ -36,32 +62,48 @@ const initialStore = {
|
|
|
36
62
|
return await next(req);
|
|
37
63
|
} catch (err) {
|
|
38
64
|
// eslint-disable-next-line no-console
|
|
39
|
-
console.log(
|
|
65
|
+
console.log({
|
|
66
|
+
err
|
|
67
|
+
}, 'catch err') // logout and something like this
|
|
40
68
|
;
|
|
41
69
|
throw err;
|
|
42
70
|
}
|
|
43
71
|
};
|
|
44
|
-
this.interceptors.
|
|
72
|
+
this.interceptors.push(auth);
|
|
45
73
|
if (window.__GRPC_DEVTOOLS_EXTENSION__) {
|
|
46
|
-
this.interceptors.
|
|
74
|
+
this.interceptors.push(window.__GRPC_DEVTOOLS_EXTENSION__());
|
|
47
75
|
} else {
|
|
48
76
|
window.addEventListener('grpc_devtools_loaded', ()=>{
|
|
49
77
|
if (window.__GRPC_DEVTOOLS_EXTENSION__) {
|
|
50
|
-
this.interceptors.
|
|
78
|
+
this.interceptors.push(window.__GRPC_DEVTOOLS_EXTENSION__());
|
|
51
79
|
}
|
|
52
80
|
});
|
|
53
81
|
}
|
|
54
82
|
};
|
|
55
83
|
this.$headers = new MapStore(createMapStore(initialStore));
|
|
56
84
|
this.initInterceptors();
|
|
85
|
+
this.clients = new Map();
|
|
57
86
|
this.transport = createGrpcWebTransport({
|
|
58
87
|
baseUrl: process.env.GRPC_HOST,
|
|
59
|
-
interceptors:
|
|
60
|
-
...this.interceptors.values()
|
|
61
|
-
],
|
|
88
|
+
interceptors: this.interceptors,
|
|
62
89
|
useBinaryFormat: true
|
|
63
90
|
});
|
|
64
91
|
}
|
|
65
92
|
}
|
|
93
|
+
export class MockTransport extends Transport {
|
|
94
|
+
constructor(transport){
|
|
95
|
+
super();
|
|
96
|
+
this.calls = [];
|
|
97
|
+
this.interceptors.push((next)=>(req)=>{
|
|
98
|
+
this.calls.push(req);
|
|
99
|
+
return next(req);
|
|
100
|
+
});
|
|
101
|
+
this.transport = createRouterTransport(transport, {
|
|
102
|
+
transport: {
|
|
103
|
+
interceptors: this.interceptors
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
66
108
|
|
|
67
109
|
//# sourceMappingURL=transport.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../packages/sdk-web-api/src/grpc/transport.ts"],"sourcesContent":["import { MapStore, createMapStore } from '@streamlayer/sdk-web-interfaces'\n\nimport { Interceptor } from '@bufbuild/connect'\nimport { createGrpcWebTransport } from '@bufbuild/connect-web'\n\ntype KnownHeaders = {\n authorization?: string\n sdk?: string\n} & Record<string, string>\n\nconst initialStore: KnownHeaders = {\n sdk: process.env.SDK_KEY,\n}\n\nexport type GrpcTransport = Transport['transport']\n\ntype ReservedHeaders = 'sdk' | 'authorization'\ntype ExcludeReservedHeaders<T> = ReservedHeaders extends T\n ? never\n : T & T extends ReservedHeaders\n ? never\n : T\n\ndeclare global {\n interface Window {\n __GRPC_DEVTOOLS_EXTENSION__?: () => import('@bufbuild/connect').Interceptor\n }\n}\n\n/**\n * transport wrapper, initialize grpc transport, store headers and connect interceptors\n */\nexport class Transport {\n public readonly transport: ReturnType<typeof createGrpcWebTransport>\n
|
|
1
|
+
{"version":3,"sources":["../../../../../packages/sdk-web-api/src/grpc/transport.ts"],"sourcesContent":["import { MapStore, createMapStore } from '@streamlayer/sdk-web-interfaces'\n\nimport { createRouterTransport, ConnectRouter } from \"@connectrpc/connect\";\nimport { Interceptor, createPromiseClient, PromiseClient, UnaryRequest, StreamRequest } from '@bufbuild/connect'\nimport type { ServiceType } from '@bufbuild/protobuf'\nimport { createGrpcWebTransport } from '@bufbuild/connect-web'\nimport type { KeyInput } from '@nanostores/query'\n\ntype KnownHeaders = {\n authorization?: string\n sdk?: string\n} & Record<string, string>\n\nconst initialStore: KnownHeaders = {\n sdk: process.env.SDK_KEY,\n}\n\nexport type GrpcTransport = Transport['transport']\n\ntype ReservedHeaders = 'sdk' | 'authorization'\ntype ExcludeReservedHeaders<T> = ReservedHeaders extends T\n ? never\n : T & T extends ReservedHeaders\n ? never\n : T\n\ndeclare global {\n interface Window {\n __GRPC_DEVTOOLS_EXTENSION__?: () => import('@bufbuild/connect').Interceptor\n }\n}\n\n/**\n * transport wrapper, initialize grpc transport, store headers and connect interceptors\n */\nexport class Transport {\n public readonly transport: ReturnType<typeof createGrpcWebTransport>\n protected interceptors: Interceptor[] = []\n private readonly $headers: MapStore<KnownHeaders>\n private clients: Map<keyof ServiceType['methods'], PromiseClient<ServiceType>>\n\n constructor() {\n this.$headers = new MapStore<KnownHeaders>(createMapStore(initialStore))\n this.initInterceptors()\n this.clients = new Map()\n\n this.transport = createGrpcWebTransport({\n baseUrl: process.env.GRPC_HOST,\n interceptors: this.interceptors,\n useBinaryFormat: true,\n })\n }\n\n registerInterceptor = (interceptor: Interceptor) => {\n this.interceptors.push(interceptor)\n }\n\n removeInterceptor = (interceptor: Interceptor) => {\n this.interceptors = this.interceptors.filter(i => i !== interceptor)\n }\n\n getClient = <T extends ServiceType>(service: T): PromiseClient<T> => {\n const serviceName = service.typeName\n\n if (this.clients.has(serviceName)) {\n return this.clients.get(serviceName) as PromiseClient<T>\n }\n\n const client = createPromiseClient(service, this.transport)\n\n this.clients.set(serviceName, client)\n\n return client\n }\n\n createPromiseClient = <T extends ServiceType>(service: T, { params = [], method }: { params?: KeyInput, method: keyof T['methods'] }) => {\n const client = this.getClient(service)\n\n const methodName = service.methods[method].name\n const queryKey = [\n service.typeName,\n methodName.charAt(0).toLowerCase() + methodName.slice(1),\n ...(Array.isArray(params) ? params : [params])\n ]\n\n return { client, queryKey }\n }\n\n setSdkKey = (sdkKey: string) => {\n this.$headers.setValue('sdk', sdkKey)\n }\n\n setAuth = (token: string) => {\n this.$headers.setValue('authorization', token)\n }\n\n setHeader = <T extends keyof KnownHeaders = string>(\n name: ExcludeReservedHeaders<T>,\n value: string\n ) => this.$headers.setValue<string>(name, value)\n\n getHeader = (name: keyof KnownHeaders) => this.$headers.getValue(name)\n\n getHeaders = () => this.$headers.getValues()\n\n initInterceptors = () => {\n if (this.interceptors.length !== 0) {\n return\n }\n\n const auth: Interceptor = (next) => async (req) => {\n const headers = this.$headers.getValues()\n\n for (const header in headers) {\n req.header.set(header, headers[header])\n }\n try {\n return await next(req)\n } catch (err) {\n // eslint-disable-next-line no-console\n console.log({ err }, 'catch err') // logout and something like this\n\n throw err\n }\n }\n\n this.interceptors.push(auth)\n\n if (window.__GRPC_DEVTOOLS_EXTENSION__) {\n this.interceptors.push(window.__GRPC_DEVTOOLS_EXTENSION__())\n } else {\n window.addEventListener('grpc_devtools_loaded', () => {\n if (window.__GRPC_DEVTOOLS_EXTENSION__) {\n this.interceptors.push(window.__GRPC_DEVTOOLS_EXTENSION__())\n }\n })\n }\n }\n}\n\nexport class MockTransport extends Transport {\n declare public transport: ReturnType<typeof createRouterTransport>\n public calls: Array<UnaryRequest | StreamRequest>\n\n constructor(transport: (router: ConnectRouter) => void) {\n super()\n\n this.calls = []\n this.interceptors.push((next) => (req) => {\n this.calls.push(req)\n\n return next(req)\n })\n this.transport = createRouterTransport(transport, {\n transport: {\n interceptors: this.interceptors,\n }\n })\n }\n}\n"],"names":["MapStore","createMapStore","createRouterTransport","createPromiseClient","createGrpcWebTransport","initialStore","sdk","process","env","SDK_KEY","Transport","constructor","interceptors","registerInterceptor","interceptor","push","removeInterceptor","filter","i","getClient","service","serviceName","typeName","clients","has","get","client","transport","set","params","method","methodName","methods","name","queryKey","charAt","toLowerCase","slice","Array","isArray","setSdkKey","sdkKey","$headers","setValue","setAuth","token","setHeader","value","getHeader","getValue","getHeaders","getValues","initInterceptors","length","auth","next","req","headers","header","err","console","log","window","__GRPC_DEVTOOLS_EXTENSION__","addEventListener","Map","baseUrl","GRPC_HOST","useBinaryFormat","MockTransport","calls"],"mappings":"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"}
|
|
@@ -1,9 +1,80 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { Health } from '@streamlayer/sl-eslib/grpc/health/v1/health_connect';
|
|
2
|
+
import { MockTransport } from './transport';
|
|
3
|
+
describe.skip('Transport', ()=>{
|
|
4
|
+
let transport;
|
|
5
|
+
beforeAll(()=>{
|
|
6
|
+
const mock = ({ service })=>{
|
|
7
|
+
service(Health, {
|
|
8
|
+
check: ()=>({
|
|
9
|
+
status: 1
|
|
10
|
+
})
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
|
+
transport = new MockTransport(mock);
|
|
14
|
+
});
|
|
15
|
+
it('should initialize with default values', ()=>{
|
|
16
|
+
expect(transport).toBeDefined();
|
|
17
|
+
expect(transport.transport).toBeDefined();
|
|
18
|
+
});
|
|
19
|
+
it('should set SDK key', ()=>{
|
|
20
|
+
const sdkKey = 'new-sdk-key';
|
|
21
|
+
transport.setSdkKey(sdkKey);
|
|
22
|
+
const headers = transport.getHeaders();
|
|
23
|
+
expect(headers.sdk).toEqual(sdkKey);
|
|
24
|
+
});
|
|
25
|
+
it('should set authorization token', ()=>{
|
|
26
|
+
const authToken = 'my-auth-token';
|
|
27
|
+
transport.setAuth(authToken);
|
|
28
|
+
const headers = transport.getHeaders();
|
|
29
|
+
expect(headers.authorization).toEqual(authToken);
|
|
30
|
+
});
|
|
31
|
+
it('should set custom header', ()=>{
|
|
32
|
+
const headerName = 'custom-header';
|
|
33
|
+
const headerValue = 'custom-value';
|
|
34
|
+
transport.setHeader(headerName, headerValue);
|
|
35
|
+
const headers = transport.getHeaders();
|
|
36
|
+
expect(headers[headerName]).toEqual(headerValue);
|
|
37
|
+
});
|
|
38
|
+
it('should get a specific header', ()=>{
|
|
39
|
+
const headerName = 'custom-header';
|
|
40
|
+
const headerValue = 'custom-value';
|
|
41
|
+
transport.setHeader(headerName, headerValue);
|
|
42
|
+
const retrievedValue = transport.getHeader(headerName);
|
|
43
|
+
expect(retrievedValue).toEqual(headerValue);
|
|
44
|
+
});
|
|
45
|
+
it('should add/remove an interceptor', ()=>{
|
|
46
|
+
const interceptor = (req)=>req;
|
|
47
|
+
transport.registerInterceptor(interceptor);
|
|
48
|
+
expect(transport['interceptors']).toContain(interceptor);
|
|
49
|
+
transport.removeInterceptor(interceptor);
|
|
50
|
+
expect(transport['interceptors']).not.toContain(interceptor);
|
|
51
|
+
});
|
|
52
|
+
it('should create and cache promise client', ()=>{
|
|
53
|
+
const { client, queryKey } = transport.createPromiseClient(Health, {
|
|
54
|
+
method: 'check'
|
|
55
|
+
});
|
|
56
|
+
expect(client).toBeDefined();
|
|
57
|
+
expect(client.check).toBeDefined();
|
|
58
|
+
expect(queryKey).toBeDefined();
|
|
59
|
+
const { client: newClient, queryKey: newQueryKey } = transport.createPromiseClient(Health, {
|
|
60
|
+
method: 'check'
|
|
61
|
+
});
|
|
62
|
+
expect(client === newClient);
|
|
63
|
+
expect(queryKey !== newQueryKey);
|
|
64
|
+
});
|
|
65
|
+
it('should use all headers from store', async ()=>{
|
|
66
|
+
const { client } = transport.createPromiseClient(Health, {
|
|
67
|
+
method: 'check'
|
|
68
|
+
});
|
|
69
|
+
const res = await client.check({});
|
|
70
|
+
expect(res?.status);
|
|
71
|
+
expect(res.status).toEqual(1);
|
|
72
|
+
const lastCall = transport.calls.pop();
|
|
73
|
+
const headers = transport.getHeaders();
|
|
74
|
+
expect(lastCall);
|
|
75
|
+
for(const header in headers){
|
|
76
|
+
expect(lastCall.header.get(header)).toEqual(headers[header]);
|
|
77
|
+
}
|
|
7
78
|
});
|
|
8
79
|
});
|
|
9
80
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../packages/sdk-web-api/src/grpc/transport.test.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../../../../../packages/sdk-web-api/src/grpc/transport.test.ts"],"sourcesContent":["import { Health } from '@streamlayer/sl-eslib/grpc/health/v1/health_connect'\n\nimport { MockTransport } from './transport';\n\ndescribe.skip('Transport', () => {\n let transport: MockTransport;\n\n beforeAll(() => {\n const mock = ({ service }) => {\n service(Health, {\n check: () => ({ status: 1 })\n });\n }\n\n transport = new MockTransport(mock);\n });\n\n it('should initialize with default values', () => {\n expect(transport).toBeDefined();\n expect(transport.transport).toBeDefined();\n });\n\n it('should set SDK key', () => {\n const sdkKey = 'new-sdk-key';\n\n transport.setSdkKey(sdkKey);\n const headers = transport.getHeaders();\n\n expect(headers.sdk).toEqual(sdkKey);\n });\n\n it('should set authorization token', () => {\n const authToken = 'my-auth-token';\n\n transport.setAuth(authToken);\n const headers = transport.getHeaders();\n\n expect(headers.authorization).toEqual(authToken);\n });\n\n it('should set custom header', () => {\n const headerName = 'custom-header';\n const headerValue = 'custom-value';\n\n transport.setHeader(headerName, headerValue);\n const headers = transport.getHeaders();\n\n expect(headers[headerName]).toEqual(headerValue);\n });\n\n it('should get a specific header', () => {\n const headerName = 'custom-header';\n const headerValue = 'custom-value';\n\n transport.setHeader(headerName, headerValue);\n const retrievedValue = transport.getHeader(headerName);\n\n expect(retrievedValue).toEqual(headerValue);\n });\n\n it('should add/remove an interceptor', () => {\n const interceptor = (req) => req;\n\n transport.registerInterceptor(interceptor);\n expect(transport['interceptors']).toContain(interceptor)\n\n transport.removeInterceptor(interceptor);\n expect(transport['interceptors']).not.toContain(interceptor);\n });\n\n it('should create and cache promise client', () => {\n const { client, queryKey } = transport.createPromiseClient(Health, { method: 'check' })\n\n expect(client).toBeDefined()\n expect(client.check).toBeDefined()\n expect(queryKey).toBeDefined()\n\n const { client: newClient, queryKey: newQueryKey } = transport.createPromiseClient(Health, { method: 'check' })\n\n expect(client === newClient)\n expect(queryKey !== newQueryKey)\n })\n\n it('should use all headers from store', async () => {\n const { client } = transport.createPromiseClient(Health, { method: 'check' })\n\n const res = await client.check({})\n\n expect(res?.status)\n expect(res.status).toEqual(1)\n\n const lastCall = transport.calls.pop();\n const headers = transport.getHeaders();\n\n expect(lastCall)\n\n for (const header in headers) {\n expect(lastCall.header.get(header)).toEqual(headers[header])\n }\n });\n});\n"],"names":["Health","MockTransport","describe","skip","transport","beforeAll","mock","service","check","status","it","expect","toBeDefined","sdkKey","setSdkKey","headers","getHeaders","sdk","toEqual","authToken","setAuth","authorization","headerName","headerValue","setHeader","retrievedValue","getHeader","interceptor","req","registerInterceptor","toContain","removeInterceptor","not","client","queryKey","createPromiseClient","method","newClient","newQueryKey","res","lastCall","calls","pop","header","get"],"mappings":"AAAA,SAASA,MAAM,QAAQ,sDAAqD;AAE5E,SAASC,aAAa,QAAQ,cAAc;AAE5CC,SAASC,IAAI,CAAC,aAAa;IACzB,IAAIC;IAEJC,UAAU;QACR,MAAMC,OAAO,CAAC,EAAEC,OAAO,EAAE;YACvBA,QAAQP,QAAQ;gBACdQ,OAAO,IAAO,CAAA;wBAAEC,QAAQ;oBAAE,CAAA;YAC5B;QACF;QAEAL,YAAY,IAAIH,cAAcK;IAChC;IAEAI,GAAG,yCAAyC;QAC1CC,OAAOP,WAAWQ,WAAW;QAC7BD,OAAOP,UAAUA,SAAS,EAAEQ,WAAW;IACzC;IAEAF,GAAG,sBAAsB;QACvB,MAAMG,SAAS;QAEfT,UAAUU,SAAS,CAACD;QACpB,MAAME,UAAUX,UAAUY,UAAU;QAEpCL,OAAOI,QAAQE,GAAG,EAAEC,OAAO,CAACL;IAC9B;IAEAH,GAAG,kCAAkC;QACnC,MAAMS,YAAY;QAElBf,UAAUgB,OAAO,CAACD;QAClB,MAAMJ,UAAUX,UAAUY,UAAU;QAEpCL,OAAOI,QAAQM,aAAa,EAAEH,OAAO,CAACC;IACxC;IAEAT,GAAG,4BAA4B;QAC7B,MAAMY,aAAa;QACnB,MAAMC,cAAc;QAEpBnB,UAAUoB,SAAS,CAACF,YAAYC;QAChC,MAAMR,UAAUX,UAAUY,UAAU;QAEpCL,OAAOI,OAAO,CAACO,WAAW,EAAEJ,OAAO,CAACK;IACtC;IAEAb,GAAG,gCAAgC;QACjC,MAAMY,aAAa;QACnB,MAAMC,cAAc;QAEpBnB,UAAUoB,SAAS,CAACF,YAAYC;QAChC,MAAME,iBAAiBrB,UAAUsB,SAAS,CAACJ;QAE3CX,OAAOc,gBAAgBP,OAAO,CAACK;IACjC;IAEAb,GAAG,oCAAoC;QACrC,MAAMiB,cAAc,CAACC,MAAQA;QAE7BxB,UAAUyB,mBAAmB,CAACF;QAC9BhB,OAAOP,SAAS,CAAC,eAAe,EAAE0B,SAAS,CAACH;QAE5CvB,UAAU2B,iBAAiB,CAACJ;QAC5BhB,OAAOP,SAAS,CAAC,eAAe,EAAE4B,GAAG,CAACF,SAAS,CAACH;IAClD;IAEAjB,GAAG,0CAA0C;QAC3C,MAAM,EAAEuB,MAAM,EAAEC,QAAQ,EAAE,GAAG9B,UAAU+B,mBAAmB,CAACnC,QAAQ;YAAEoC,QAAQ;QAAQ;QAErFzB,OAAOsB,QAAQrB,WAAW;QAC1BD,OAAOsB,OAAOzB,KAAK,EAAEI,WAAW;QAChCD,OAAOuB,UAAUtB,WAAW;QAE5B,MAAM,EAAEqB,QAAQI,SAAS,EAAEH,UAAUI,WAAW,EAAE,GAAGlC,UAAU+B,mBAAmB,CAACnC,QAAQ;YAAEoC,QAAQ;QAAQ;QAE7GzB,OAAOsB,WAAWI;QAClB1B,OAAOuB,aAAaI;IACtB;IAEA5B,GAAG,qCAAqC;QACtC,MAAM,EAAEuB,MAAM,EAAE,GAAG7B,UAAU+B,mBAAmB,CAACnC,QAAQ;YAAEoC,QAAQ;QAAQ;QAE3E,MAAMG,MAAM,MAAMN,OAAOzB,KAAK,CAAC,CAAC;QAEhCG,OAAO4B,KAAK9B;QACZE,OAAO4B,IAAI9B,MAAM,EAAES,OAAO,CAAC;QAE3B,MAAMsB,WAAWpC,UAAUqC,KAAK,CAACC,GAAG;QACpC,MAAM3B,UAAUX,UAAUY,UAAU;QAEpCL,OAAO6B;QAEP,IAAK,MAAMG,UAAU5B,QAAS;YAC5BJ,OAAO6B,SAASG,MAAM,CAACC,GAAG,CAACD,SAASzB,OAAO,CAACH,OAAO,CAAC4B,OAAO;QAC7D;IACF;AACF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Transport } from '..';
|
|
2
|
+
export class GrpcStub {
|
|
3
|
+
constructor(){
|
|
4
|
+
this.stub = (method, response)=>{
|
|
5
|
+
this.stubs.set(method.toLowerCase(), response);
|
|
6
|
+
};
|
|
7
|
+
this.transport = new Transport();
|
|
8
|
+
this.stubs = new Map();
|
|
9
|
+
const stubbedUnary = (service, method, signal, timeoutMs, header, input)=>{
|
|
10
|
+
const key = `${service.typeName}${method.name}`.toLowerCase();
|
|
11
|
+
console.log('grpc unary', {
|
|
12
|
+
key,
|
|
13
|
+
input
|
|
14
|
+
});
|
|
15
|
+
for (const [stubKey, stubValue] of this.stubs){
|
|
16
|
+
if (stubKey === key) {
|
|
17
|
+
return {
|
|
18
|
+
message: stubValue
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
throw new Error(JSON.stringify({
|
|
23
|
+
message: 'not stubbed correctly',
|
|
24
|
+
service,
|
|
25
|
+
method,
|
|
26
|
+
signal,
|
|
27
|
+
timeoutMs,
|
|
28
|
+
header,
|
|
29
|
+
input
|
|
30
|
+
}));
|
|
31
|
+
};
|
|
32
|
+
this.transport.transport.unary = stubbedUnary;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
//# sourceMappingURL=grpc-stub.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../packages/sdk-web-api/src/utils/grpc-stub.ts"],"sourcesContent":["import { Transport as BufTransport, UnaryResponse } from '@bufbuild/connect'\nimport type { AnyMessage, Message } from \"@bufbuild/protobuf\"\n\nimport { Transport } from '..'\n\ntype Unary = BufTransport['unary']\n\nexport class GrpcStub {\n public readonly transport: Transport\n private stubs: Map<string, Record<string, unknown>>\n\n constructor() {\n this.transport = new Transport()\n this.stubs = new Map()\n\n const stubbedUnary: Unary = <I extends Message<I> = AnyMessage, O extends Message<O> = AnyMessage>(\n service,\n method,\n signal,\n timeoutMs,\n header,\n input,\n ) => {\n const key = `${service.typeName}${method.name}`.toLowerCase()\n\n console.log('grpc unary', { key, input })\n\n for (const [stubKey, stubValue] of this.stubs) {\n if (stubKey === key) {\n return { message: stubValue } as unknown as Promise<UnaryResponse<I, O>>\n }\n }\n\n throw new Error(JSON.stringify({ message: 'not stubbed correctly', service, method, signal, timeoutMs, header, input }))\n }\n\n this.transport.transport.unary = stubbedUnary\n }\n\n stub = (method: string, response: Record<string, unknown>) => {\n this.stubs.set(method.toLowerCase(), response)\n }\n}\n"],"names":["Transport","GrpcStub","constructor","stub","method","response","stubs","set","toLowerCase","transport","Map","stubbedUnary","service","signal","timeoutMs","header","input","key","typeName","name","console","log","stubKey","stubValue","message","Error","JSON","stringify","unary"],"mappings":"AAGA,SAASA,SAAS,QAAQ,KAAI;AAI9B,OAAO,MAAMC;IAIXC,aAAc;aA4BdC,OAAO,CAACC,QAAgBC;YACtB,IAAI,CAACC,KAAK,CAACC,GAAG,CAACH,OAAOI,WAAW,IAAIH;QACvC;QA7BE,IAAI,CAACI,SAAS,GAAG,IAAIT;QACrB,IAAI,CAACM,KAAK,GAAG,IAAII;QAEjB,MAAMC,eAAsB,CAC1BC,SACAR,QACAS,QACAC,WACAC,QACAC;YAEA,MAAMC,MAAM,CAAC,EAAEL,QAAQM,QAAQ,CAAC,EAAEd,OAAOe,IAAI,CAAC,CAAC,CAACX,WAAW;YAE3DY,QAAQC,GAAG,CAAC,cAAc;gBAAEJ;gBAAKD;YAAM;YAEvC,KAAK,MAAM,CAACM,SAASC,UAAU,IAAI,IAAI,CAACjB,KAAK,CAAE;gBAC7C,IAAIgB,YAAYL,KAAK;oBACnB,OAAO;wBAAEO,SAASD;oBAAU;gBAC9B;YACF;YAEA,MAAM,IAAIE,MAAMC,KAAKC,SAAS,CAAC;gBAAEH,SAAS;gBAAyBZ;gBAASR;gBAAQS;gBAAQC;gBAAWC;gBAAQC;YAAM;QACvH;QAEA,IAAI,CAACP,SAAS,CAACA,SAAS,CAACmB,KAAK,GAAGjB;IACnC;AAKF"}
|