@streamlayer/sdk-web-api 0.4.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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@streamlayer/sdk-web-api",
3
- "version": "0.4.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 { GrpcTransport } from '../transport';
2
+ import { Transport } from '../transport';
3
3
  export { $user } from './user';
4
- export declare const $retrieveEventId: ($providerStreamId: ReadableAtom<string>, transport: GrpcTransport) => import("@nanostores/query").FetcherStore<string, any>;
5
- export declare const $streamSettings: (slStreamId: string, transport: GrpcTransport) => import("@nanostores/query").FetcherStore<import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").StreamSettings, any>;
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 eventsClient = createPromiseClient(Events, transport);
9
- const methodName = Events.methods.retrieveEventId.name;
10
- const queryKey = [
11
- Events.typeName,
12
- methodName.charAt(0).toLowerCase() + methodName.slice(1),
13
- $providerStreamId
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 eventsClient.retrieveEventId({
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 sdkSettingsClient = createPromiseClient(Client, transport);
29
- const methodName = Client.methods.getStream.name;
30
- const queryKey = [
31
- Client.typeName,
32
- methodName.charAt(0).toLowerCase() + methodName.slice(1),
33
- slStreamId
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 sdkSettingsClient.getStream({
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 { createPromiseClient } from '@bufbuild/connect'\nimport { Events } from '@streamlayer/sl-eslib/sports/events/events_connect'\nimport { Client } from '@streamlayer/sl-eslib/sdkSettings/client/client_connect'\n\nimport { GrpcTransport } from '../transport'\n\nexport { $user } from './user'\n\nconst [createFetcherStore] = nanoquery()\n\nexport const $retrieveEventId = (\n $providerStreamId: ReadableAtom<string>,\n transport: GrpcTransport\n) => {\n const eventsClient = createPromiseClient(Events, transport)\n\n const methodName = Events.methods.retrieveEventId.name\n const queryKey = [\n Events.typeName,\n methodName.charAt(0).toLowerCase() + methodName.slice(1),\n $providerStreamId,\n ]\n\n return createFetcherStore(queryKey, {\n fetcher: async (_: string, __: string, id: string) => {\n if (!id) {\n return ''\n }\n\n const res = await eventsClient.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: GrpcTransport\n) => {\n const sdkSettingsClient = createPromiseClient(Client, transport)\n\n const methodName = Client.methods.getStream.name\n const queryKey = [\n Client.typeName,\n methodName.charAt(0).toLowerCase() + methodName.slice(1),\n slStreamId,\n ]\n\n return createFetcherStore(queryKey, {\n fetcher: async (_: string, __: string, id: string) => {\n const res = await sdkSettingsClient.getStream({\n id,\n })\n\n return res.data?.attributes\n },\n })\n}\n"],"names":["nanoquery","createPromiseClient","Events","Client","$user","createFetcherStore","$retrieveEventId","$providerStreamId","transport","eventsClient","methodName","methods","retrieveEventId","name","queryKey","typeName","charAt","toLowerCase","slice","fetcher","_","__","id","res","data","$streamSettings","slStreamId","sdkSettingsClient","getStream","attributes"],"mappings":"AAAA,SAASA,SAAS,QAAQ,oBAAmB;AAE7C,SAASC,mBAAmB,QAAQ,oBAAmB;AACvD,SAASC,MAAM,QAAQ,qDAAoD;AAC3E,SAASC,MAAM,QAAQ,0DAAyD;AAIhF,SAASC,KAAK,QAAQ,SAAQ;AAE9B,MAAM,CAACC,mBAAmB,GAAGL;AAE7B,OAAO,MAAMM,mBAAmB,CAC9BC,mBACAC;IAEA,MAAMC,eAAeR,oBAAoBC,QAAQM;IAEjD,MAAME,aAAaR,OAAOS,OAAO,CAACC,eAAe,CAACC,IAAI;IACtD,MAAMC,WAAW;QACfZ,OAAOa,QAAQ;QACfL,WAAWM,MAAM,CAAC,GAAGC,WAAW,KAAKP,WAAWQ,KAAK,CAAC;QACtDX;KACD;IAED,OAAOF,mBAAmBS,UAAU;QAClCK,SAAS,OAAOC,GAAWC,IAAYC;YACrC,IAAI,CAACA,IAAI;gBACP,OAAO;YACT;YAEA,MAAMC,MAAM,MAAMd,aAAaG,eAAe,CAAC;gBAC7CU;YACF;YAEA,OAAOC,IAAIC,IAAI,EAAEF,MAA2B;QAC9C;IACF;AACF,EAAC;AAED,OAAO,MAAMG,kBAAkB,CAC7BC,YACAlB;IAEA,MAAMmB,oBAAoB1B,oBAAoBE,QAAQK;IAEtD,MAAME,aAAaP,OAAOQ,OAAO,CAACiB,SAAS,CAACf,IAAI;IAChD,MAAMC,WAAW;QACfX,OAAOY,QAAQ;QACfL,WAAWM,MAAM,CAAC,GAAGC,WAAW,KAAKP,WAAWQ,KAAK,CAAC;QACtDQ;KACD;IAED,OAAOrB,mBAAmBS,UAAU;QAClCK,SAAS,OAAOC,GAAWC,IAAYC;YACrC,MAAMC,MAAM,MAAMI,kBAAkBC,SAAS,CAAC;gBAC5CN;YACF;YAEA,OAAOC,IAAIC,IAAI,EAAEK;QACnB;IACF;AACF,EAAC"}
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 { GrpcTransport } from '../transport';
1
+ import { Transport } from '../transport';
2
2
  export { $user } from './user';
3
- export declare const $organizationSettings: (transport: GrpcTransport) => import("@nanostores/query").FetcherStore<import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").OrganizationSettings, any>;
4
- export declare const $organizationAdvertising: (transport: GrpcTransport) => import("@nanostores/query").FetcherStore<import("@streamlayer/sl-eslib/sdkSettings/sdkSettings.common_pb").Advertising, any>;
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 sdkSettingsClient = createPromiseClient(Client, transport);
8
- const methodName = Client.methods.getOrganization.name;
9
- const queryKey = [
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 sdkSettingsClient.getOrganization({});
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 sdkSettingsClient = createPromiseClient(Client, transport);
22
- const methodName = Client.methods.getOrganizationAdvertising.name;
23
- const queryKey = [
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 sdkSettingsClient.getOrganizationAdvertising({});
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 { createPromiseClient } from '@bufbuild/connect'\nimport { Client } from '@streamlayer/sl-eslib/sdkSettings/client/client_connect'\n\nimport { GrpcTransport } from '../transport'\n\nexport { $user } from './user'\n\nconst [createFetcherStore] = nanoquery()\n\nexport const $organizationSettings = (transport: GrpcTransport) => {\n const sdkSettingsClient = createPromiseClient(Client, transport)\n\n const methodName = Client.methods.getOrganization.name\n const queryKey = [\n Client.typeName,\n methodName.charAt(0).toLowerCase() + methodName.slice(1),\n ]\n\n return createFetcherStore(queryKey, {\n fetcher: async () => {\n const res = await sdkSettingsClient.getOrganization({})\n\n return res.data?.attributes\n },\n })\n}\n\nexport const $organizationAdvertising = (transport: GrpcTransport) => {\n const sdkSettingsClient = createPromiseClient(Client, transport)\n\n const methodName = Client.methods.getOrganizationAdvertising.name\n const queryKey = [\n Client.typeName,\n methodName.charAt(0).toLowerCase() + methodName.slice(1),\n ]\n\n return createFetcherStore(queryKey, {\n fetcher: async () => {\n const res = await sdkSettingsClient.getOrganizationAdvertising({})\n\n return res.data?.attributes\n },\n })\n}\n"],"names":["nanoquery","createPromiseClient","Client","$user","createFetcherStore","$organizationSettings","transport","sdkSettingsClient","methodName","methods","getOrganization","name","queryKey","typeName","charAt","toLowerCase","slice","fetcher","res","data","attributes","$organizationAdvertising","getOrganizationAdvertising"],"mappings":"AAAA,SAASA,SAAS,QAAQ,oBAAmB;AAC7C,SAASC,mBAAmB,QAAQ,oBAAmB;AACvD,SAASC,MAAM,QAAQ,0DAAyD;AAIhF,SAASC,KAAK,QAAQ,SAAQ;AAE9B,MAAM,CAACC,mBAAmB,GAAGJ;AAE7B,OAAO,MAAMK,wBAAwB,CAACC;IACpC,MAAMC,oBAAoBN,oBAAoBC,QAAQI;IAEtD,MAAME,aAAaN,OAAOO,OAAO,CAACC,eAAe,CAACC,IAAI;IACtD,MAAMC,WAAW;QACfV,OAAOW,QAAQ;QACfL,WAAWM,MAAM,CAAC,GAAGC,WAAW,KAAKP,WAAWQ,KAAK,CAAC;KACvD;IAED,OAAOZ,mBAAmBQ,UAAU;QAClCK,SAAS;YACP,MAAMC,MAAM,MAAMX,kBAAkBG,eAAe,CAAC,CAAC;YAErD,OAAOQ,IAAIC,IAAI,EAAEC;QACnB;IACF;AACF,EAAC;AAED,OAAO,MAAMC,2BAA2B,CAACf;IACvC,MAAMC,oBAAoBN,oBAAoBC,QAAQI;IAEtD,MAAME,aAAaN,OAAOO,OAAO,CAACa,0BAA0B,CAACX,IAAI;IACjE,MAAMC,WAAW;QACfV,OAAOW,QAAQ;QACfL,WAAWM,MAAM,CAAC,GAAGC,WAAW,KAAKP,WAAWQ,KAAK,CAAC;KACvD;IAED,OAAOZ,mBAAmBQ,UAAU;QAClCK,SAAS;YACP,MAAMC,MAAM,MAAMX,kBAAkBe,0BAA0B,CAAC,CAAC;YAEhE,OAAOJ,IAAIC,IAAI,EAAEC;QACnB;IACF;AACF,EAAC"}
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 { GrpcTransport } from '../transport';
3
- export declare const $user: ($userKey: ReadableAtom<string>, $userToken: ReadableAtom<string>, transport: GrpcTransport) => import("@nanostores/query").FetcherStore<import("@streamlayer/sl-eslib/users/users_pb").BypassAuthResponse | {
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: GrpcTransport) => import("@nanostores/query").FetcherStore<import("@streamlayer/sl-eslib/sdkSettings/client/client_pb").ClientSettings, any>;
9
+ export declare const $userSettings: ($userToken: ReadableAtom<string>, transport: Transport) => import("@nanostores/query").FetcherStore<import("@streamlayer/sl-eslib/sdkSettings/client/client_pb").ClientSettings, any>;
@@ -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 usersClient = createPromiseClient(Users, transport);
14
- const methodName = Users.methods.bypassAuth.name;
15
- const queryKey = [
16
- Users.typeName,
17
- methodName.charAt(0).toLowerCase() + methodName.slice(1),
18
- $userKey
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 usersClient.me({});
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 usersClient.bypassAuth({
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 sdkSettingsClient = createPromiseClient(Client, transport);
47
- const methodName = Client.methods.get.name;
48
- const queryKey = [
49
- Client.typeName,
50
- methodName.charAt(0).toLowerCase() + methodName.slice(1),
51
- $userToken
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 sdkSettingsClient.get({});
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 { createPromiseClient } from '@bufbuild/connect'\nimport { Users } from '@streamlayer/sl-eslib/users/users_connect'\nimport { Client } from '@streamlayer/sl-eslib/sdkSettings/client/client_connect'\n\nimport { GrpcTransport } 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: GrpcTransport\n) => {\n const usersClient = createPromiseClient(Users, transport)\n\n const methodName = Users.methods.bypassAuth.name\n const queryKey = [\n Users.typeName,\n methodName.charAt(0).toLowerCase() + methodName.slice(1),\n $userKey,\n ]\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 usersClient.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 usersClient.bypassAuth({\n userKey,\n schema: 'streamlayer',\n })\n },\n })\n}\n\nexport const $userSettings = (\n $userToken: ReadableAtom<string>, // sl user token\n transport: GrpcTransport\n) => {\n const sdkSettingsClient = createPromiseClient(Client, transport)\n\n const methodName = Client.methods.get.name\n const queryKey = [\n Client.typeName,\n methodName.charAt(0).toLowerCase() + methodName.slice(1),\n $userToken,\n ]\n\n return createFetcherStore(queryKey, {\n fetcher: async () => {\n const data = await sdkSettingsClient.get({})\n\n return data.data?.attributes\n },\n })\n}\n"],"names":["nanoquery","createPromiseClient","Users","Client","createFetcherStore","$user","$userKey","$userToken","transport","usersClient","methodName","methods","bypassAuth","name","queryKey","typeName","charAt","toLowerCase","slice","fetcher","_","__","userKey","get","response","me","meta","jwt","err","console","log","schema","$userSettings","sdkSettingsClient","data","attributes"],"mappings":"AAAA,SAASA,SAAS,QAAQ,oBAAmB;AAE7C,SAASC,mBAAmB,QAAQ,oBAAmB;AACvD,SAASC,KAAK,QAAQ,4CAA2C;AACjE,SAASC,MAAM,QAAQ,0DAAyD;AAIhF,MAAM,CAACC,mBAAmB,GAAGJ;AAE7B,aAAa;AACb,aAAa;AACb,mBAAmB;AACnB,QAAQ;AACR,aAAa;AACb,4BAA4B;AAC5B,OAAO,MAAMK,QAAQ,CACnBC,UACAC,YACAC;IAEA,MAAMC,cAAcR,oBAAoBC,OAAOM;IAE/C,MAAME,aAAaR,MAAMS,OAAO,CAACC,UAAU,CAACC,IAAI;IAChD,MAAMC,WAAW;QACfZ,MAAMa,QAAQ;QACdL,WAAWM,MAAM,CAAC,GAAGC,WAAW,KAAKP,WAAWQ,KAAK,CAAC;QACtDZ;KACD;IAED,OAAOF,mBAAmBU,UAAU;QAClCK,SAAS,OAAOC,GAAGC,IAAIC;YACrB,6DAA6D;YAC7D,sCAAsC;YACtC,cAAc;YACd,IAAIf,WAAWgB,GAAG,IAAI;gBACpB,IAAI;oBACF,MAAMC,WAAW,MAAMf,YAAYgB,EAAE,CAAC,CAAC;oBAEvC,OAAO;wBACL,GAAGD,QAAQ;wBACXE,MAAM;4BACJC,KAAKpB,WAAWgB,GAAG;wBACrB;oBACF;gBACF,EAAE,OAAOK,KAAK;oBACZC,QAAQC,GAAG,CAAC;gBACd;YACF;YAEA,OAAOrB,YAAYG,UAAU,CAAC;gBAC5BU;gBACAS,QAAQ;YACV;QACF;IACF;AACF,EAAC;AAED,OAAO,MAAMC,gBAAgB,CAC3BzB,YACAC;IAEA,MAAMyB,oBAAoBhC,oBAAoBE,QAAQK;IAEtD,MAAME,aAAaP,OAAOQ,OAAO,CAACY,GAAG,CAACV,IAAI;IAC1C,MAAMC,WAAW;QACfX,OAAOY,QAAQ;QACfL,WAAWM,MAAM,CAAC,GAAGC,WAAW,KAAKP,WAAWQ,KAAK,CAAC;QACtDX;KACD;IAED,OAAOH,mBAAmBU,UAAU;QAClCK,SAAS;YACP,MAAMe,OAAO,MAAMD,kBAAkBV,GAAG,CAAC,CAAC;YAE1C,OAAOW,KAAKA,IAAI,EAAEC;QACpB;IACF;AACF,EAAC"}
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"}
@@ -1,5 +1,8 @@
1
- import { Interceptor } from '@bufbuild/connect';
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
- private interceptors;
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 {};
@@ -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 = new Set();
12
+ this.interceptors = [];
11
13
  this.registerInterceptor = (interceptor)=>{
12
- this.interceptors.add(interceptor);
14
+ this.interceptors.push(interceptor);
13
15
  };
14
16
  this.removeInterceptor = (interceptor)=>{
15
- this.interceptors.delete(interceptor);
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.size !== 0) {
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('catch err') // logout and something like this
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.add(auth);
72
+ this.interceptors.push(auth);
45
73
  if (window.__GRPC_DEVTOOLS_EXTENSION__) {
46
- this.interceptors.add(window.__GRPC_DEVTOOLS_EXTENSION__());
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.add(window.__GRPC_DEVTOOLS_EXTENSION__());
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 private interceptors: Set<Interceptor> = new Set()\n private readonly $headers: MapStore<KnownHeaders>\n\n constructor() {\n this.$headers = new MapStore<KnownHeaders>(createMapStore(initialStore))\n this.initInterceptors()\n\n this.transport = createGrpcWebTransport({\n baseUrl:\n process.env.GRPC_HOST,\n interceptors: [...this.interceptors.values()],\n useBinaryFormat: true,\n })\n }\n\n registerInterceptor = (interceptor: Interceptor) => {\n this.interceptors.add(interceptor)\n }\n\n removeInterceptor = (interceptor: Interceptor) => {\n this.interceptors.delete(interceptor)\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.size !== 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\n try {\n return await next(req)\n } catch (err) {\n // eslint-disable-next-line no-console\n console.log('catch err') // logout and something like this\n\n throw err\n }\n }\n\n this.interceptors.add(auth)\n\n if (window.__GRPC_DEVTOOLS_EXTENSION__) {\n this.interceptors.add(window.__GRPC_DEVTOOLS_EXTENSION__())\n } else {\n window.addEventListener('grpc_devtools_loaded', () => {\n if (window.__GRPC_DEVTOOLS_EXTENSION__) {\n this.interceptors.add(window.__GRPC_DEVTOOLS_EXTENSION__())\n }\n })\n }\n }\n}\n"],"names":["MapStore","createMapStore","createGrpcWebTransport","initialStore","sdk","process","env","SDK_KEY","Transport","constructor","interceptors","Set","registerInterceptor","interceptor","add","removeInterceptor","delete","setSdkKey","sdkKey","$headers","setValue","setAuth","token","setHeader","name","value","getHeader","getValue","getHeaders","getValues","initInterceptors","size","auth","next","req","headers","header","set","err","console","log","window","__GRPC_DEVTOOLS_EXTENSION__","addEventListener","transport","baseUrl","GRPC_HOST","values","useBinaryFormat"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,cAAc,QAAQ,kCAAiC;AAG1E,SAASC,sBAAsB,QAAQ,wBAAuB;AAO9D,MAAMC,eAA6B;IACjCC,KAAKC,QAAQC,GAAG,CAACC,OAAO;AAC1B;AAiBA;;CAEC,GACD,OAAO,MAAMC;IAKXC,aAAc;aAHNC,eAAiC,IAAIC;aAe7CC,sBAAsB,CAACC;YACrB,IAAI,CAACH,YAAY,CAACI,GAAG,CAACD;QACxB;aAEAE,oBAAoB,CAACF;YACnB,IAAI,CAACH,YAAY,CAACM,MAAM,CAACH;QAC3B;aAEAI,YAAY,CAACC;YACX,IAAI,CAACC,QAAQ,CAACC,QAAQ,CAAC,OAAOF;QAChC;aAEAG,UAAU,CAACC;YACT,IAAI,CAACH,QAAQ,CAACC,QAAQ,CAAC,iBAAiBE;QAC1C;aAEAC,YAAY,CACVC,MACAC,QACG,IAAI,CAACN,QAAQ,CAACC,QAAQ,CAASI,MAAMC;aAE1CC,YAAY,CAACF,OAA6B,IAAI,CAACL,QAAQ,CAACQ,QAAQ,CAACH;aAEjEI,aAAa,IAAM,IAAI,CAACT,QAAQ,CAACU,SAAS;aAE1CC,mBAAmB;YACjB,IAAI,IAAI,CAACpB,YAAY,CAACqB,IAAI,KAAK,GAAG;gBAChC;YACF;YAEA,MAAMC,OAAoB,CAACC,OAAS,OAAOC;oBACzC,MAAMC,UAAU,IAAI,CAAChB,QAAQ,CAACU,SAAS;oBAEvC,IAAK,MAAMO,UAAUD,QAAS;wBAC5BD,IAAIE,MAAM,CAACC,GAAG,CAACD,QAAQD,OAAO,CAACC,OAAO;oBACxC;oBAEA,IAAI;wBACF,OAAO,MAAMH,KAAKC;oBACpB,EAAE,OAAOI,KAAK;wBACZ,sCAAsC;wBACtCC,QAAQC,GAAG,CAAC,aAAa,iCAAiC;;wBAE1D,MAAMF;oBACR;gBACF;YAEA,IAAI,CAAC5B,YAAY,CAACI,GAAG,CAACkB;YAEtB,IAAIS,OAAOC,2BAA2B,EAAE;gBACtC,IAAI,CAAChC,YAAY,CAACI,GAAG,CAAC2B,OAAOC,2BAA2B;YAC1D,OAAO;gBACLD,OAAOE,gBAAgB,CAAC,wBAAwB;oBAC9C,IAAIF,OAAOC,2BAA2B,EAAE;wBACtC,IAAI,CAAChC,YAAY,CAACI,GAAG,CAAC2B,OAAOC,2BAA2B;oBAC1D;gBACF;YACF;QACF;QArEE,IAAI,CAACvB,QAAQ,GAAG,IAAInB,SAAuBC,eAAeE;QAC1D,IAAI,CAAC2B,gBAAgB;QAErB,IAAI,CAACc,SAAS,GAAG1C,uBAAuB;YACtC2C,SACExC,QAAQC,GAAG,CAACwC,SAAS;YACvBpC,cAAc;mBAAI,IAAI,CAACA,YAAY,CAACqC,MAAM;aAAG;YAC7CC,iBAAiB;QACnB;IACF;AA6DF"}
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,8 +1,16 @@
1
- import { Transport } from './transport';
2
- describe('Transport', ()=>{
1
+ import { Health } from '@streamlayer/sl-eslib/grpc/health/v1/health_connect';
2
+ import { MockTransport } from './transport';
3
+ describe.skip('Transport', ()=>{
3
4
  let transport;
4
5
  beforeAll(()=>{
5
- transport = new Transport();
6
+ const mock = ({ service })=>{
7
+ service(Health, {
8
+ check: ()=>({
9
+ status: 1
10
+ })
11
+ });
12
+ };
13
+ transport = new MockTransport(mock);
6
14
  });
7
15
  it('should initialize with default values', ()=>{
8
16
  expect(transport).toBeDefined();
@@ -34,12 +42,39 @@ describe('Transport', ()=>{
34
42
  const retrievedValue = transport.getHeader(headerName);
35
43
  expect(retrievedValue).toEqual(headerValue);
36
44
  });
37
- it('should remove an interceptor', ()=>{
45
+ it('should add/remove an interceptor', ()=>{
38
46
  const interceptor = (req)=>req;
39
47
  transport.registerInterceptor(interceptor);
48
+ expect(transport['interceptors']).toContain(interceptor);
40
49
  transport.removeInterceptor(interceptor);
41
- const interceptors = Array.from(transport['interceptors']);
42
- expect(interceptors).not.toContain(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
+ }
43
78
  });
44
79
  });
45
80
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../packages/sdk-web-api/src/grpc/transport.test.ts"],"sourcesContent":["import { Transport } from './transport';\n\ndescribe('Transport', () => {\n let transport: Transport;\n\n beforeAll(() => {\n transport = new Transport();\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 remove an interceptor', () => {\n const interceptor = (req) => req;\n\n transport.registerInterceptor(interceptor);\n transport.removeInterceptor(interceptor);\n const interceptors = Array.from(transport['interceptors']);\n\n expect(interceptors).not.toContain(interceptor);\n });\n});\n"],"names":["Transport","describe","transport","beforeAll","it","expect","toBeDefined","sdkKey","setSdkKey","headers","getHeaders","sdk","toEqual","authToken","setAuth","authorization","headerName","headerValue","setHeader","retrievedValue","getHeader","interceptor","req","registerInterceptor","removeInterceptor","interceptors","Array","from","not","toContain"],"mappings":"AAAA,SAASA,SAAS,QAAQ,cAAc;AAExCC,SAAS,aAAa;IACpB,IAAIC;IAEJC,UAAU;QACRD,YAAY,IAAIF;IAClB;IAEAI,GAAG,yCAAyC;QAC1CC,OAAOH,WAAWI,WAAW;QAC7BD,OAAOH,UAAUA,SAAS,EAAEI,WAAW;IACzC;IAEAF,GAAG,sBAAsB;QACvB,MAAMG,SAAS;QAEfL,UAAUM,SAAS,CAACD;QACpB,MAAME,UAAUP,UAAUQ,UAAU;QAEpCL,OAAOI,QAAQE,GAAG,EAAEC,OAAO,CAACL;IAC9B;IAEAH,GAAG,kCAAkC;QACnC,MAAMS,YAAY;QAElBX,UAAUY,OAAO,CAACD;QAClB,MAAMJ,UAAUP,UAAUQ,UAAU;QAEpCL,OAAOI,QAAQM,aAAa,EAAEH,OAAO,CAACC;IACxC;IAEAT,GAAG,4BAA4B;QAC7B,MAAMY,aAAa;QACnB,MAAMC,cAAc;QAEpBf,UAAUgB,SAAS,CAACF,YAAYC;QAChC,MAAMR,UAAUP,UAAUQ,UAAU;QAEpCL,OAAOI,OAAO,CAACO,WAAW,EAAEJ,OAAO,CAACK;IACtC;IAEAb,GAAG,gCAAgC;QACjC,MAAMY,aAAa;QACnB,MAAMC,cAAc;QAEpBf,UAAUgB,SAAS,CAACF,YAAYC;QAChC,MAAME,iBAAiBjB,UAAUkB,SAAS,CAACJ;QAE3CX,OAAOc,gBAAgBP,OAAO,CAACK;IACjC;IAEAb,GAAG,gCAAgC;QACjC,MAAMiB,cAAc,CAACC,MAAQA;QAE7BpB,UAAUqB,mBAAmB,CAACF;QAC9BnB,UAAUsB,iBAAiB,CAACH;QAC5B,MAAMI,eAAeC,MAAMC,IAAI,CAACzB,SAAS,CAAC,eAAe;QAEzDG,OAAOoB,cAAcG,GAAG,CAACC,SAAS,CAACR;IACrC;AACF"}
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,7 @@
1
+ import { Transport } from '..';
2
+ export declare class GrpcStub {
3
+ readonly transport: Transport;
4
+ private stubs;
5
+ constructor();
6
+ stub: (method: string, response: Record<string, unknown>) => void;
7
+ }
@@ -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"}