Skip to content

Commit e609a39

Browse files
author
Matt Mazzola
committed
Refactor to use single instance of HPM in service instead of instance for each embed. This means calls to hpm can be provided target window
1 parent 7161c01 commit e609a39

6 files changed

Lines changed: 61 additions & 62 deletions

File tree

src/embed.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ export abstract class Embed {
5555

5656
allowedEvents = [];
5757
eventHandlers: IInternalEventHandler<any>[];
58-
hpm: hpm.HttpPostMessage;
5958
service: service.Service;
6059
element: HTMLElement;
6160
iframe: HTMLIFrameElement;
@@ -65,7 +64,7 @@ export abstract class Embed {
6564
* Note: there is circular reference between embeds and service
6665
* The service has list of all embeds on the host page, and each embed has reference to the service that created it.
6766
*/
68-
constructor(service: service.Service, hpmFactory: service.IHpmFactory, element: HTMLElement, config: IEmbedConfiguration) {
67+
constructor(service: service.Service, element: HTMLElement, config: IEmbedConfiguration) {
6968
Array.prototype.push.apply(this.allowedEvents, Embed.allowedEvents);
7069
this.eventHandlers = [];
7170
this.service = service;
@@ -84,8 +83,6 @@ export abstract class Embed {
8483
this.element.innerHTML = iframeHtml;
8584
this.iframe = <HTMLIFrameElement>this.element.childNodes[0];
8685
this.iframe.addEventListener('load', () => this.load(this.config), false);
87-
88-
this.hpm = hpmFactory(this.iframe.contentWindow, this.service.wpmp);
8986
}
9087

9188
/**
@@ -111,7 +108,7 @@ export abstract class Embed {
111108
throw errors;
112109
}
113110

114-
return this.hpm.post<void>('/report/load', config, { uid: this.config.uniqueId })
111+
return this.service.hpm.post<void>('/report/load', config, { uid: this.config.uniqueId }, this.iframe.contentWindow)
115112
.catch(response => {
116113
throw response.body;
117114
});

src/factories.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ export {
1515
/**
1616
* TODO: Need to get sdk version and settings from package.json, Generate config file via gulp task?
1717
*/
18-
export const hpmFactory: IHpmFactory = (targetWindow, wpmp, sdkVersion = '2.0.0', sdkType = 'js', origin = 'sdk') => {
19-
return new hpm.HttpPostMessage(targetWindow, wpmp, {
18+
export const hpmFactory: IHpmFactory = (wpmp, defaultTargetWindow, sdkVersion = '2.0.0', sdkType = 'js', origin = 'sdk') => {
19+
return new hpm.HttpPostMessage(wpmp, {
2020
'origin': origin,
2121
'x-sdk-type': sdkType,
2222
'x-sdk-version': sdkVersion
23-
});
23+
}, defaultTargetWindow);
2424
};
2525

2626
export const wpmpFactory: IWpmpFactory = (name?: string, logMessages?: boolean, eventSourceOverrideWindow?: Window) => {

src/report.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ export class Report extends embed.Embed {
99
static reportIdAttribute = 'powerbi-report-id';
1010
static type = "Report";
1111

12-
constructor(service: service.Service, hpmFactory: service.IHpmFactory, element: HTMLElement, config: embed.IEmbedConfiguration) {
13-
super(service, hpmFactory, element, config);
12+
constructor(service: service.Service, element: HTMLElement, config: embed.IEmbedConfiguration) {
13+
super(service, element, config);
1414
Array.prototype.push.apply(this.allowedEvents, Report.allowedEvents);
1515
}
1616

@@ -49,7 +49,7 @@ export class Report extends embed.Embed {
4949
*/
5050
addFilter(filter: models.IFilter, target?: models.IPageTarget | models.IVisualTarget): Promise<void> {
5151
const targetUrl = this.getTargetUrl(target);
52-
return this.hpm.post<void>(`${targetUrl}/filters`, filter, { uid: this.config.uniqueId })
52+
return this.service.hpm.post<void>(`${targetUrl}/filters`, filter, { uid: this.config.uniqueId }, this.iframe.contentWindow)
5353
.catch(response => {
5454
throw response.body;
5555
});
@@ -79,7 +79,7 @@ export class Report extends embed.Embed {
7979
*/
8080
getFilters(target?: models.IPageTarget | models.IVisualTarget): Promise<models.IFilter[]> {
8181
const targetUrl = this.getTargetUrl(target);
82-
return this.hpm.get<models.IFilter[]>(`${targetUrl}/filters`, { uid: this.config.uniqueId })
82+
return this.service.hpm.get<models.IFilter[]>(`${targetUrl}/filters`, { uid: this.config.uniqueId }, this.iframe.contentWindow)
8383
.then(response => response.body,
8484
response => {
8585
throw response.body;
@@ -110,7 +110,7 @@ export class Report extends embed.Embed {
110110
* ```
111111
*/
112112
getPages(): Promise<models.IPage[]> {
113-
return this.hpm.get<models.IPage[]>('/report/pages', { uid: this.config.uniqueId })
113+
return this.service.hpm.get<models.IPage[]>('/report/pages', { uid: this.config.uniqueId }, this.iframe.contentWindow)
114114
.then(response => response.body,
115115
response => {
116116
throw response.body;
@@ -131,7 +131,7 @@ export class Report extends embed.Embed {
131131
displayName: null
132132
};
133133

134-
return this.hpm.put<models.IError[]>('/report/pages/active', page, { uid: this.config.uniqueId })
134+
return this.service.hpm.put<models.IError[]>('/report/pages/active', page, { uid: this.config.uniqueId }, this.iframe.contentWindow)
135135
.catch(response => {
136136
throw response.body;
137137
});
@@ -149,7 +149,7 @@ export class Report extends embed.Embed {
149149
*/
150150
removeFilter(filter: models.IFilter, target?: models.IPageTarget | models.IVisualTarget): Promise<void> {
151151
const targetUrl = this.getTargetUrl(target);
152-
return this.hpm.delete<models.IError[]>(`${targetUrl}/filters`, filter, { uid: this.config.uniqueId })
152+
return this.service.hpm.delete<models.IError[]>(`${targetUrl}/filters`, filter, { uid: this.config.uniqueId }, this.iframe.contentWindow)
153153
.catch(response => {
154154
throw response.body;
155155
});
@@ -163,7 +163,7 @@ export class Report extends embed.Embed {
163163
* ```
164164
*/
165165
removeAllFilters(): Promise<void> {
166-
return this.hpm.delete<models.IError[]>('/report/allfilters', null, { uid: this.config.uniqueId })
166+
return this.service.hpm.delete<models.IError[]>('/report/allfilters', null, { uid: this.config.uniqueId }, this.iframe.contentWindow)
167167
.catch(response => {
168168
throw response.body;
169169
});
@@ -186,7 +186,7 @@ export class Report extends embed.Embed {
186186
*/
187187
updateFilter(filter: models.IFilter, target?: models.IPageTarget | models.IVisualTarget): Promise<void> {
188188
const targetUrl = this.getTargetUrl(target);
189-
return this.hpm.put<models.IError[]>(`${targetUrl}/filters`, filter, { uid: this.config.uniqueId })
189+
return this.service.hpm.put<models.IError[]>(`${targetUrl}/filters`, filter, { uid: this.config.uniqueId }, this.iframe.contentWindow)
190190
.catch(response => {
191191
throw response.body;
192192
});
@@ -206,7 +206,7 @@ export class Report extends embed.Embed {
206206
* ```
207207
*/
208208
updateSettings(settings: models.ISettings): Promise<void> {
209-
return this.hpm.patch<models.IError[]>('/report/settings', settings, { uid: this.config.uniqueId })
209+
return this.service.hpm.patch<models.IError[]>('/report/settings', settings, { uid: this.config.uniqueId }, this.iframe.contentWindow)
210210
.catch(response => {
211211
throw response.body;
212212
});

src/service.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export interface IEventHandler<T> {
1919
}
2020

2121
export interface IHpmFactory {
22-
(targetWindow: Window, wpmp: wpmp.WindowPostMessageProxy, version?: string, type?: string, origin?: string): hpm.HttpPostMessage;
22+
(wpmp: wpmp.WindowPostMessageProxy, targetWindow?: Window, version?: string, type?: string, origin?: string): hpm.HttpPostMessage;
2323
}
2424

2525
export interface IWpmpFactory {
@@ -42,6 +42,8 @@ export interface IDebugOptions {
4242
export interface IServiceConfiguration extends IDebugOptions {
4343
autoEmbedOnContentLoaded?: boolean;
4444
onError?: (error: any) => any;
45+
version?: string;
46+
type?: string;
4547
}
4648

4749
export class Service {
@@ -70,14 +72,14 @@ export class Service {
7072

7173
/** List of components (Reports/Tiles) that have been embedded using this service instance. */
7274
private embeds: embed.Embed[];
73-
private hpmFactory: IHpmFactory;
74-
/** TODO: Look for way to make this private. This should be private but in embed constructor needs to pass the wpmp instance to the hpm factory. */
75+
/** TODO: Look for way to make this private without sacraficing ease of maitenance. This should be private but in embed needs to call methods. */
76+
public hpm: hpm.HttpPostMessage;
7577
public wpmp: wpmp.WindowPostMessageProxy;
7678
private router: router.Router;
7779

7880
constructor(hpmFactory: IHpmFactory, wpmpFactory: IWpmpFactory, routerFactory: IRouterFactory, config: IServiceConfiguration = {}) {
79-
this.hpmFactory = hpmFactory;
8081
this.wpmp = wpmpFactory(config.wpmpName, config.logMessages);
82+
this.hpm = hpmFactory(this.wpmp, null, config.version, config.type);
8183
this.router = routerFactory(this.wpmp);
8284

8385
/**
@@ -174,7 +176,7 @@ export class Service {
174176
throw new Error(`Attempted to embed component of type: ${componentType} but did not find any matching component. Please verify the type you specified is intended.`);
175177
}
176178

177-
const component = new Component(this, this.hpmFactory, element, config);
179+
const component = new Component(this, element, config);
178180
element.powerBiEmbed = component;
179181
this.embeds.push(component);
180182

0 commit comments

Comments
 (0)