@genesislcap/foundation-broadcast-channel 14.172.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.
Files changed (52) hide show
  1. package/README.md +87 -0
  2. package/dist/dts/__test__/config.d.ts +12 -0
  3. package/dist/dts/__test__/config.d.ts.map +1 -0
  4. package/dist/dts/__test__/elements.d.ts +59 -0
  5. package/dist/dts/__test__/elements.d.ts.map +1 -0
  6. package/dist/dts/__test__/index.d.ts +4 -0
  7. package/dist/dts/__test__/index.d.ts.map +1 -0
  8. package/dist/dts/__test__/types.d.ts +28 -0
  9. package/dist/dts/__test__/types.d.ts.map +1 -0
  10. package/dist/dts/broadcast-channel/broadcast-channel.d.ts +123 -0
  11. package/dist/dts/broadcast-channel/broadcast-channel.d.ts.map +1 -0
  12. package/dist/dts/broadcast-channel/index.d.ts +2 -0
  13. package/dist/dts/broadcast-channel/index.d.ts.map +1 -0
  14. package/dist/dts/index.d.ts +3 -0
  15. package/dist/dts/index.d.ts.map +1 -0
  16. package/dist/dts/index.federated.d.ts +1 -0
  17. package/dist/dts/index.federated.d.ts.map +1 -0
  18. package/dist/dts/tsdoc-metadata.json +11 -0
  19. package/dist/dts/utils/index.d.ts +2 -0
  20. package/dist/dts/utils/index.d.ts.map +1 -0
  21. package/dist/dts/utils/logger.d.ts +5 -0
  22. package/dist/dts/utils/logger.d.ts.map +1 -0
  23. package/dist/esm/__test__/config.js +7 -0
  24. package/dist/esm/__test__/elements.js +108 -0
  25. package/dist/esm/__test__/index.js +3 -0
  26. package/dist/esm/__test__/types.js +24 -0
  27. package/dist/esm/broadcast-channel/broadcast-channel.js +61 -0
  28. package/dist/esm/broadcast-channel/index.js +1 -0
  29. package/dist/esm/index.federated.js +1 -0
  30. package/dist/esm/index.js +2 -0
  31. package/dist/esm/utils/index.js +1 -0
  32. package/dist/esm/utils/logger.js +5 -0
  33. package/dist/foundation-broadcast-channel.api.json +797 -0
  34. package/dist/foundation-broadcast-channel.d.ts +138 -0
  35. package/docs/.gitattributes +2 -0
  36. package/docs/api/foundation-broadcast-channel.createtypedbroadcastchannel.md +25 -0
  37. package/docs/api/foundation-broadcast-channel.defaulttypedbroadcastchannel.ismessagetype.md +13 -0
  38. package/docs/api/foundation-broadcast-channel.defaulttypedbroadcastchannel.md +24 -0
  39. package/docs/api/foundation-broadcast-channel.defaulttypedbroadcastchannel.postmessage.md +13 -0
  40. package/docs/api/foundation-broadcast-channel.logger.md +12 -0
  41. package/docs/api/foundation-broadcast-channel.md +32 -0
  42. package/docs/api/foundation-broadcast-channel.registertypedbroadcastchannel.md +24 -0
  43. package/docs/api/foundation-broadcast-channel.typedbroadcastchannel.ismessagetype.md +25 -0
  44. package/docs/api/foundation-broadcast-channel.typedbroadcastchannel.md +42 -0
  45. package/docs/api/foundation-broadcast-channel.typedbroadcastchannel.onmessage.md +34 -0
  46. package/docs/api/foundation-broadcast-channel.typedbroadcastchannel.onmessageerror.md +11 -0
  47. package/docs/api/foundation-broadcast-channel.typedbroadcastchannel.postmessage.md +29 -0
  48. package/docs/api/foundation-broadcast-channel.typedmessageevent.md +16 -0
  49. package/docs/api/index.md +12 -0
  50. package/docs/api-report.md +47 -0
  51. package/license.txt +46 -0
  52. package/package.json +43 -0
package/README.md ADDED
@@ -0,0 +1,87 @@
1
+ # Foundation Broadcast Channel
2
+
3
+ [![lerna](https://img.shields.io/badge/maintained%20with-lerna-cc00ff.svg)](https://lerna.js.org/)
4
+ [![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-%230074c1.svg)](https://www.typescriptlang.org/)
5
+
6
+ `foundation-broadcast-channel` provides a strongly typed [Broadcast_Channel](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API) API and related utilities.
7
+ The system uses the same event typing we use in our stores, where the key is the event, and the value is the details or payload if any.
8
+
9
+ ## Installation
10
+
11
+ To enable this module in your application, follow the steps below.
12
+
13
+ 1. Add `@genesislcap/foundation-broadcast-channel` as a dependency in your `package.json` file.
14
+
15
+ _Note whenever you change the dependencies of your project, ensure you run the `$ npm run bootstrap` command again, or npm i, depending on your setup. You can find more information in the [package.json basics](https://learn.genesis.global/secure/web/basics/package-json-basics/) page._
16
+
17
+ ```json
18
+ {
19
+ "dependencies": {
20
+ "@genesislcap/foundation-broadcast-channel": "latest",
21
+ ...
22
+ }
23
+ }
24
+ ```
25
+
26
+ ## Usage
27
+
28
+ Create a typed channel for your application or package, likely in a config.ts file.
29
+
30
+ ```ts
31
+ import { registerTypedBroadcastChannel, TypedBroadcastChannel } from '@genesislcap/foundation-broadcast-channel';
32
+
33
+ // Define or import the channel event / message map
34
+ export type GenesisResourcesEvents = {
35
+ 'resources-loaded': ResourceItem[];
36
+ 'resources-unloaded': void;
37
+ };
38
+
39
+ // Define the interface
40
+ export interface GenesisResourcesChannel extends TypedBroadcastChannel<GenesisResourcesEvents> {}
41
+
42
+ // Define the DI key
43
+ export const GenesisResourcesChannel = registerTypedBroadcastChannel<GenesisResourcesEvents>(GenesisResourcesChannelId);
44
+ ```
45
+
46
+ Inject the channel into the actors you wish to post broadcast messages from.
47
+
48
+ ```ts
49
+ import { GenesisResourcesChannel } from '@genesislcap/foundation-comms';
50
+
51
+ constructor(@GenesisResourcesChannel protected channel: GenesisResourcesChannel) {}
52
+
53
+ // Broadcast strongly typed messages
54
+ this.channel.postMessage('resources-loaded', this.resources);
55
+ ```
56
+
57
+ Inject the channel into the actors you wish to recieve broadcast messages from.
58
+
59
+ ```ts
60
+ import { GenesisResourcesChannel } from '@genesislcap/foundation-comms';
61
+
62
+ @GenesisResourcesChannel protected channel: GenesisResourcesChannel;
63
+
64
+ // Handle broadcasted messages and use the provided type narrowing API
65
+ this.channel.onmessage = (ev) => {
66
+ if (this.channel.isMessageType('resources-loaded', ev)) {
67
+ // Typescript now knows what detail is
68
+ if (!ev.data.detail.length) {
69
+ throw Error('No backend resources available');
70
+ }
71
+ }
72
+ };
73
+
74
+ // Close the channel when finished, perhaps on disconnectedCallback
75
+ this.channel.close();
76
+ ```
77
+
78
+ Note that injected channels are `transient` by design.
79
+
80
+ ## [API Docs](./docs/api/index.md)
81
+
82
+ ## License
83
+
84
+ Note: this project provides front-end dependencies and uses licensed components listed in the next section; thus, licenses for those components are required during development. Contact [Genesis Global](https://genesis.global/contact-us/) for more details.
85
+
86
+ ### Licensed components
87
+ Genesis low-code platform
@@ -0,0 +1,12 @@
1
+ import { TypedBroadcastChannel } from '../broadcast-channel';
2
+ import { TestEvents } from './types';
3
+ /**
4
+ * @internal
5
+ */
6
+ export interface TestChannel extends TypedBroadcastChannel<TestEvents> {
7
+ }
8
+ /**
9
+ * @internal
10
+ */
11
+ export declare const TestChannel: import("@microsoft/fast-foundation").InterfaceSymbol<TypedBroadcastChannel<TestEvents>>;
12
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/__test__/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiC,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC5F,OAAO,EAAiB,UAAU,EAAE,MAAM,SAAS,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,qBAAqB,CAAC,UAAU,CAAC;CAAG;AAEzE;;GAEG;AAEH,eAAO,MAAM,WAAW,yFAA2D,CAAC"}
@@ -0,0 +1,59 @@
1
+ import { FASTElement } from '@microsoft/fast-element';
2
+ import { TestChannel } from './config';
3
+ import { TestEntity } from './types';
4
+ /**
5
+ * @internal
6
+ */
7
+ export declare class SubscriberTestElement extends FASTElement {
8
+ /**
9
+ * @public
10
+ */
11
+ channel: TestChannel;
12
+ /**
13
+ * @public
14
+ */
15
+ entities: TestEntity[];
16
+ /**
17
+ * @public
18
+ */
19
+ connectedCallback(): void;
20
+ /**
21
+ * @public
22
+ */
23
+ disconnectedCallback(): void;
24
+ }
25
+ /**
26
+ * @internal
27
+ */
28
+ export declare class BroadcasterTestElement extends FASTElement {
29
+ /**
30
+ * @public
31
+ */
32
+ channel: TestChannel;
33
+ /**
34
+ * @public
35
+ */
36
+ postLoadedMessage(detail: TestEntity[]): void;
37
+ /**
38
+ * @public
39
+ */
40
+ postUnloadedMessage(): void;
41
+ /**
42
+ * @public
43
+ */
44
+ disconnectedCallback(): void;
45
+ }
46
+ /**
47
+ * @internal
48
+ */
49
+ export declare class TestElement extends FASTElement {
50
+ /**
51
+ * @public
52
+ */
53
+ broadcaster: BroadcasterTestElement;
54
+ /**
55
+ * @public
56
+ */
57
+ subscriber: SubscriberTestElement;
58
+ }
59
+ //# sourceMappingURL=elements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elements.d.ts","sourceRoot":"","sources":["../../../src/__test__/elements.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,WAAW,EAAyB,MAAM,yBAAyB,CAAC;AAC5F,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC;;GAEG;AACH,qBAMa,qBAAsB,SAAQ,WAAW;IACpD;;OAEG;IACU,OAAO,EAAE,WAAW,CAAC;IAElC;;OAEG;IACS,QAAQ,EAAE,UAAU,EAAE,CAAC;IAEnC;;OAEG;IACH,iBAAiB;IAkBjB;;OAEG;IACH,oBAAoB;CAIrB;AAED;;GAEG;AACH,qBAMa,sBAAuB,SAAQ,WAAW;IACrD;;OAEG;IACU,OAAO,EAAE,WAAW,CAAC;IAElC;;OAEG;IACH,iBAAiB,CAAC,MAAM,EAAE,UAAU,EAAE;IAItC;;OAEG;IACH,mBAAmB;IAInB;;OAEG;IACH,oBAAoB;CAIrB;AAED;;GAEG;AACH,qBASa,WAAY,SAAQ,WAAW;IAC1C;;OAEG;IACS,WAAW,EAAE,sBAAsB,CAAC;IAChD;;OAEG;IACS,UAAU,EAAE,qBAAqB,CAAC;CAC/C"}
@@ -0,0 +1,4 @@
1
+ export * from './config';
2
+ export * from './elements';
3
+ export * from './types';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/__test__/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { TypedMessageEvent } from '../broadcast-channel';
2
+ /**
3
+ * @internal
4
+ */
5
+ export declare const TestChannelId = "test-channel";
6
+ /**
7
+ * @internal
8
+ */
9
+ export type TestEntity = {
10
+ label: string;
11
+ quantity?: number;
12
+ };
13
+ /**
14
+ * @internal
15
+ */
16
+ export type TestEvents = {
17
+ loaded: TestEntity[];
18
+ unloaded: void;
19
+ };
20
+ /**
21
+ * @internal
22
+ */
23
+ export declare const mockLoadedEvent: (detail?: TestEntity[]) => TypedMessageEvent<TestEvents, "loaded">;
24
+ /**
25
+ * @internal
26
+ */
27
+ export declare const mockUnloadedEvent: () => TypedMessageEvent<TestEvents, "unloaded">;
28
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/__test__/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD;;GAEG;AACH,eAAO,MAAM,aAAa,iBAAiB,CAAC;AAE5C;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,QAAQ,EAAE,IAAI,CAAC;CAChB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,YAAY,UAAU,EAAE,4CAOP,CAAC;AAG9C;;GAEG;AACH,eAAO,MAAM,iBAAiB,iDAKiB,CAAC"}
@@ -0,0 +1,123 @@
1
+ import { EventDetailMap } from '@genesislcap/foundation-events';
2
+ /**
3
+ * A TypedMessageEvent for BroadcastChannel transmission.
4
+ * @public
5
+ */
6
+ export type TypedMessageEvent<TEventDetailMap extends EventDetailMap, T extends keyof TEventDetailMap> = MessageEvent<{
7
+ type: T;
8
+ detail: TEventDetailMap[T];
9
+ }>;
10
+ /**
11
+ * @internal
12
+ */
13
+ type PostMessage<TEventDetailMap extends EventDetailMap> = <K extends keyof TEventDetailMap>(...args: TEventDetailMap[K] extends void ? [type: K] : [type: K, detail: TEventDetailMap[K]]) => void;
14
+ /**
15
+ * @internal
16
+ */
17
+ type OnMessage<TEventDetailMap extends EventDetailMap> = ((this: BroadcastChannel, ev: TypedMessageEvent<TEventDetailMap, keyof TEventDetailMap>) => any) | null;
18
+ /**
19
+ * @internal
20
+ */
21
+ type OnMessageError<TEventDetailMap extends EventDetailMap> = OnMessage<TEventDetailMap>;
22
+ /**
23
+ * A TypedBroadcastChannel for sending and receiving typed messages based on {@link @genesislcap/foundation-events#EventDetailMap} input.
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * export type GenesisResourcesEvents = {
28
+ * 'resources-loaded': ResourceItem[];
29
+ * 'resources-unloaded': void;
30
+ * };
31
+ * ...
32
+ * protected channel: TypedBroadcastChannel<GenesisResourcesEvents>;
33
+ * ```
34
+ *
35
+ * See the {@link registerTypedBroadcastChannel} and {@link createTypedBroadcastChannel} APIs below.
36
+ *
37
+ * @public
38
+ */
39
+ export interface TypedBroadcastChannel<TEventDetailMap extends EventDetailMap> extends Omit<BroadcastChannel, 'postMessage' | 'onmessage' | 'onmessageerror'> {
40
+ /**
41
+ * Post strongly typed messages.
42
+ * @example
43
+ * The event detail map provided to the channel on creation will provide `postMessage` typing.
44
+ * ```ts
45
+ * type GenesisResourcesEvents = {
46
+ * 'resources-loaded': ResourceItem[];
47
+ * 'resources-unloaded': void;
48
+ * };
49
+ * ...
50
+ * channel.postMessage('resources-loaded', this.resources); // ok, as this.resources is an array of ResourceItems.
51
+ * channel.postMessage('resources-loaded'); // not ok, as an array is expected for this message type.
52
+ * channel.postMessage('resources-unloaded'); // ok, as this message type maps to void for its detail.
53
+ * ```
54
+ */
55
+ postMessage: PostMessage<TEventDetailMap>;
56
+ /**
57
+ * On message handler.
58
+ * @example Use the `channel.isMessageType` method to narrow based on message types.
59
+ * ```ts
60
+ * import { GenesisResourcesChannel } from '@genesislcap/foundation-comms';
61
+ * ...
62
+ * @GenesisResourcesChannel protected channel: GenesisResourcesChannel;
63
+ * ...
64
+ * this.channel.onmessage = (ev) => {
65
+ * if (this.channel.isMessageType('resources-loaded', ev)) {
66
+ * if (!ev.data.detail.length) {
67
+ * throw Error('No backend resources available');
68
+ * }
69
+ * }
70
+ * };
71
+ * ...
72
+ * this.channel.close();
73
+ * ```
74
+ */
75
+ onmessage: OnMessage<TEventDetailMap>;
76
+ onmessageerror: OnMessageError<TEventDetailMap>;
77
+ /**
78
+ * A type predicate function to narrow down message events based on their 'type' property.
79
+ * @param type - The message type.
80
+ * @param event - The message event.
81
+ */
82
+ isMessageType<T extends keyof TEventDetailMap>(type: T, event: TypedMessageEvent<TEventDetailMap, keyof TEventDetailMap>): event is TypedMessageEvent<TEventDetailMap, T>;
83
+ }
84
+ /**
85
+ * Default TypedBroadcastChannel implementation.
86
+ * @public
87
+ */
88
+ export declare class DefaultTypedBroadcastChannel<TEventDetailMap extends EventDetailMap> extends BroadcastChannel implements TypedBroadcastChannel<TEventDetailMap> {
89
+ /** {@inheritDoc TypedBroadcastChannel.postMessage} */
90
+ postMessage: PostMessage<TEventDetailMap>;
91
+ /** {@inheritDoc TypedBroadcastChannel.isMessageType} */
92
+ isMessageType: <T extends keyof TEventDetailMap>(type: T, event: TypedMessageEvent<TEventDetailMap, keyof TEventDetailMap>) => event is TypedMessageEvent<TEventDetailMap, T>;
93
+ }
94
+ /**
95
+ * Creates a dependency injection key for the broadcast channel being registered which is lazily created when injected.
96
+ * @example In a package's config.ts
97
+ * ```ts
98
+ * export interface GenesisResourcesChannel extends TypedBroadcastChannel<GenesisResourcesEvents> {}
99
+ * ...
100
+ * export const GenesisResourcesChannel = registerTypedBroadcastChannel<GenesisResourcesEvents>(GenesisResourcesChannelId);
101
+ * ```
102
+ * @param name - The channel name.
103
+ * @returns The created key.
104
+ * @public
105
+ */
106
+ export declare const registerTypedBroadcastChannel: <TEventDetailMap extends EventDetailMap>(name: string) => import("@microsoft/fast-foundation").InterfaceSymbol<TypedBroadcastChannel<TEventDetailMap>>;
107
+ /**
108
+ * Creates a strongly typed broadcast channel.
109
+ *
110
+ * @remarks
111
+ * `registerTypedBroadcastChannel` may be preferred, as it will create and register the channel in the DI.
112
+ *
113
+ * @example
114
+ * ```ts
115
+ * const channel = createTypedBroadcastChannel<GenesisResourcesEvents>(GenesisResourcesChannelId);
116
+ * ```
117
+ * @param name - The channel name.
118
+ * @returns The created TypedBroadcastChannel.
119
+ * @public
120
+ */
121
+ export declare const createTypedBroadcastChannel: <TEventDetailMap extends EventDetailMap>(name: string) => DefaultTypedBroadcastChannel<TEventDetailMap>;
122
+ export {};
123
+ //# sourceMappingURL=broadcast-channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broadcast-channel.d.ts","sourceRoot":"","sources":["../../../src/broadcast-channel/broadcast-channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAGhE;;;GAGG;AACH,MAAM,MAAM,iBAAiB,CAC3B,eAAe,SAAS,cAAc,EACtC,CAAC,SAAS,MAAM,eAAe,IAC7B,YAAY,CAAC;IACf,IAAI,EAAE,CAAC,CAAC;IACR,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;CAC5B,CAAC,CAAC;AAEH;;GAEG;AACH,KAAK,WAAW,CAAC,eAAe,SAAS,cAAc,IAAI,CAAC,CAAC,SAAS,MAAM,eAAe,EACzF,GAAG,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,KACzF,IAAI,CAAC;AAEV;;GAEG;AACH,KAAK,SAAS,CAAC,eAAe,SAAS,cAAc,IACjD,CAAC,CAAC,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,iBAAiB,CAAC,eAAe,EAAE,MAAM,eAAe,CAAC,KAAK,GAAG,CAAC,GAChG,IAAI,CAAC;AAET;;GAEG;AACH,KAAK,cAAc,CAAC,eAAe,SAAS,cAAc,IAAI,SAAS,CAAC,eAAe,CAAC,CAAC;AAEzF;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,qBAAqB,CAAC,eAAe,SAAS,cAAc,CAC3E,SAAQ,IAAI,CAAC,gBAAgB,EAAE,aAAa,GAAG,WAAW,GAAG,gBAAgB,CAAC;IAC9E;;;;;;;;;;;;;;OAcG;IACH,WAAW,EAAE,WAAW,CAAC,eAAe,CAAC,CAAC;IAC1C;;;;;;;;;;;;;;;;;;OAkBG;IACH,SAAS,EAAE,SAAS,CAAC,eAAe,CAAC,CAAC;IACtC,cAAc,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC;IAChD;;;;OAIG;IACH,aAAa,CAAC,CAAC,SAAS,MAAM,eAAe,EAC3C,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,iBAAiB,CAAC,eAAe,EAAE,MAAM,eAAe,CAAC,GAC/D,KAAK,IAAI,iBAAiB,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;CACnD;AAED;;;GAGG;AACH,qBAAa,4BAA4B,CAAC,eAAe,SAAS,cAAc,CAC9E,SAAQ,gBACR,YAAW,qBAAqB,CAAC,eAAe,CAAC;IAEjD,sDAAsD;IAEtD,WAAW,EAAE,WAAW,CAAC,eAAe,CAAC,CAMvC;IACF,wDAAwD;IACxD,aAAa,oDAEJ,kBAAkB,eAAe,EAAE,MAAM,eAAe,CAAC,oDAGhE;CACH;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,6BAA6B,iDAClC,MAAM,iGAQb,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,2BAA2B,iDAChC,MAAM,kDAGb,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './broadcast-channel';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/broadcast-channel/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './broadcast-channel';
2
+ export * from './utils';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,SAAS,CAAC"}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=index.federated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.federated.d.ts","sourceRoot":"","sources":["../../src/index.federated.ts"],"names":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ // This file is read by tools that parse documentation comments conforming to the TSDoc standard.
2
+ // It should be published with your NPM package. It should not be tracked by Git.
3
+ {
4
+ "tsdocVersion": "0.12",
5
+ "toolPackages": [
6
+ {
7
+ "packageName": "@microsoft/api-extractor",
8
+ "packageVersion": "7.34.9"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,2 @@
1
+ export * from './logger';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @public
3
+ */
4
+ export declare const logger: import("@genesislcap/foundation-logger").Logger;
5
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,eAAO,MAAM,MAAM,iDAA+C,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { registerTypedBroadcastChannel } from '../broadcast-channel';
2
+ import { TestChannelId } from './types';
3
+ /**
4
+ * @internal
5
+ */
6
+ // Define the DI key
7
+ export const TestChannel = registerTypedBroadcastChannel(TestChannelId);
@@ -0,0 +1,108 @@
1
+ import { __decorate } from "tslib";
2
+ import { customElement, FASTElement, html, observable, ref } from '@microsoft/fast-element';
3
+ import { TestChannel } from './config';
4
+ /**
5
+ * @internal
6
+ */
7
+ let SubscriberTestElement = class SubscriberTestElement extends FASTElement {
8
+ /**
9
+ * @public
10
+ */
11
+ connectedCallback() {
12
+ super.connectedCallback();
13
+ this.channel.onmessage = (ev) => {
14
+ if (this.channel.isMessageType('loaded', ev)) {
15
+ const entities = ev.data.detail;
16
+ if (!entities.length) {
17
+ throw Error('No test entities available');
18
+ }
19
+ this.entities = entities;
20
+ return;
21
+ }
22
+ if (this.channel.isMessageType('unloaded', ev)) {
23
+ this.entities = undefined;
24
+ }
25
+ };
26
+ }
27
+ /**
28
+ * @public
29
+ */
30
+ disconnectedCallback() {
31
+ super.disconnectedCallback();
32
+ this.channel.close();
33
+ }
34
+ };
35
+ __decorate([
36
+ TestChannel
37
+ ], SubscriberTestElement.prototype, "channel", void 0);
38
+ __decorate([
39
+ observable
40
+ ], SubscriberTestElement.prototype, "entities", void 0);
41
+ SubscriberTestElement = __decorate([
42
+ customElement({
43
+ name: 'subscriber-test-element',
44
+ template: html `
45
+ <template></template>
46
+ `,
47
+ })
48
+ ], SubscriberTestElement);
49
+ export { SubscriberTestElement };
50
+ /**
51
+ * @internal
52
+ */
53
+ let BroadcasterTestElement = class BroadcasterTestElement extends FASTElement {
54
+ /**
55
+ * @public
56
+ */
57
+ postLoadedMessage(detail) {
58
+ this.channel.postMessage('loaded', detail);
59
+ }
60
+ /**
61
+ * @public
62
+ */
63
+ postUnloadedMessage() {
64
+ this.channel.postMessage('unloaded');
65
+ }
66
+ /**
67
+ * @public
68
+ */
69
+ disconnectedCallback() {
70
+ super.disconnectedCallback();
71
+ this.channel.close();
72
+ }
73
+ };
74
+ __decorate([
75
+ TestChannel
76
+ ], BroadcasterTestElement.prototype, "channel", void 0);
77
+ BroadcasterTestElement = __decorate([
78
+ customElement({
79
+ name: 'broadcaster-test-element',
80
+ template: html `
81
+ <template></template>
82
+ `,
83
+ })
84
+ ], BroadcasterTestElement);
85
+ export { BroadcasterTestElement };
86
+ /**
87
+ * @internal
88
+ */
89
+ let TestElement = class TestElement extends FASTElement {
90
+ };
91
+ __decorate([
92
+ observable
93
+ ], TestElement.prototype, "broadcaster", void 0);
94
+ __decorate([
95
+ observable
96
+ ], TestElement.prototype, "subscriber", void 0);
97
+ TestElement = __decorate([
98
+ customElement({
99
+ name: 'broadcast-channel-test-element',
100
+ template: html `
101
+ <template>
102
+ <broadcaster-test-element ${ref('broadcaster')}></broadcaster-test-element>
103
+ <subscriber-test-element ${ref('subscriber')}></subscriber-test-element>
104
+ </template>
105
+ `,
106
+ })
107
+ ], TestElement);
108
+ export { TestElement };
@@ -0,0 +1,3 @@
1
+ export * from './config';
2
+ export * from './elements';
3
+ export * from './types';
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @internal
3
+ */
4
+ export const TestChannelId = 'test-channel';
5
+ /**
6
+ * @internal
7
+ */
8
+ export const mockLoadedEvent = (detail = [{
9
+ label: 'foo'
10
+ }]) => ({
11
+ data: {
12
+ type: 'loaded',
13
+ detail,
14
+ }
15
+ });
16
+ /**
17
+ * @internal
18
+ */
19
+ export const mockUnloadedEvent = () => ({
20
+ data: {
21
+ type: 'unloaded',
22
+ detail: undefined,
23
+ }
24
+ });
@@ -0,0 +1,61 @@
1
+ import { DI } from '@microsoft/fast-foundation';
2
+ /**
3
+ * Default TypedBroadcastChannel implementation.
4
+ * @public
5
+ */
6
+ export class DefaultTypedBroadcastChannel extends BroadcastChannel {
7
+ constructor() {
8
+ super(...arguments);
9
+ /** {@inheritDoc TypedBroadcastChannel.postMessage} */
10
+ // @ts-ignore
11
+ this.postMessage = (...args) => {
12
+ const [type, detail] = args;
13
+ super.postMessage({
14
+ type,
15
+ detail,
16
+ });
17
+ };
18
+ /** {@inheritDoc TypedBroadcastChannel.isMessageType} */
19
+ this.isMessageType = (type, event) => {
20
+ var _a;
21
+ return ((_a = event.data) === null || _a === void 0 ? void 0 : _a.type) === type;
22
+ };
23
+ }
24
+ }
25
+ /**
26
+ * Creates a dependency injection key for the broadcast channel being registered which is lazily created when injected.
27
+ * @example In a package's config.ts
28
+ * ```ts
29
+ * export interface GenesisResourcesChannel extends TypedBroadcastChannel<GenesisResourcesEvents> {}
30
+ * ...
31
+ * export const GenesisResourcesChannel = registerTypedBroadcastChannel<GenesisResourcesEvents>(GenesisResourcesChannelId);
32
+ * ```
33
+ * @param name - The channel name.
34
+ * @returns The created key.
35
+ * @public
36
+ */
37
+ export const registerTypedBroadcastChannel = (name) => {
38
+ class Value extends DefaultTypedBroadcastChannel {
39
+ constructor() {
40
+ super(name);
41
+ }
42
+ }
43
+ return DI.createInterface((x) => x.transient(Value));
44
+ };
45
+ /**
46
+ * Creates a strongly typed broadcast channel.
47
+ *
48
+ * @remarks
49
+ * `registerTypedBroadcastChannel` may be preferred, as it will create and register the channel in the DI.
50
+ *
51
+ * @example
52
+ * ```ts
53
+ * const channel = createTypedBroadcastChannel<GenesisResourcesEvents>(GenesisResourcesChannelId);
54
+ * ```
55
+ * @param name - The channel name.
56
+ * @returns The created TypedBroadcastChannel.
57
+ * @public
58
+ */
59
+ export const createTypedBroadcastChannel = (name) => {
60
+ return new DefaultTypedBroadcastChannel(name);
61
+ };
@@ -0,0 +1 @@
1
+ export * from './broadcast-channel';
@@ -0,0 +1 @@
1
+ import('./index');
@@ -0,0 +1,2 @@
1
+ export * from './broadcast-channel';
2
+ export * from './utils';
@@ -0,0 +1 @@
1
+ export * from './logger';
@@ -0,0 +1,5 @@
1
+ import { createLogger } from '@genesislcap/foundation-logger';
2
+ /**
3
+ * @public
4
+ */
5
+ export const logger = createLogger('foundation-broadcast-channel');