Skip to content

Commit 73ecab2

Browse files
authored
Move init to promise (#152)
1 parent e133968 commit 73ecab2

17 files changed

+258
-56
lines changed

src/embed/app.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -761,7 +761,8 @@ export class AppEmbed extends V1Embed {
761761
* to be embedded.
762762
*/
763763
public async render(): Promise<AppEmbed> {
764-
super.render();
764+
await super.render();
765+
765766
const src = this.getIFrameSrc();
766767
await this.renderV1Embed(src);
767768

src/embed/base.ts

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,10 @@ import {
3030
AuthEventEmitter,
3131
postLoginService,
3232
} from '../auth';
33+
import '../utils/with-resolvers-polyfill';
3334
import { uploadMixpanelEvent, MIXPANEL_EVENT } from '../mixpanel-service';
3435
import { getEmbedConfig, setEmbedConfig } from './embedConfig';
35-
import { getQueryParamString } from '../utils';
36+
import { getQueryParamString, getValueFromWindow, storeValueInWindow } from '../utils';
3637
import { resetAllCachedServices } from '../utils/resetServices';
3738

3839
const CONFIG_DEFAULTS: Partial<EmbedConfig> = {
@@ -171,6 +172,40 @@ function backwardCompat(embedConfig: EmbedConfig): EmbedConfig {
171172
return newConfig;
172173
}
173174

175+
type InitFlagStore = {
176+
initPromise: Promise<ReturnType<typeof init>>;
177+
isInitCalled: boolean;
178+
initPromiseResolve: (value: ReturnType<typeof init>) => void;
179+
}
180+
const initFlagKey = 'initFlagKey';
181+
182+
export const createAndSetInitPromise = (): void => {
183+
const {
184+
promise: initPromise,
185+
resolve: initPromiseResolve,
186+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
187+
// @ts-ignore
188+
} = Promise.withResolvers<AuthEventEmitter>();
189+
const initFlagStore: InitFlagStore = {
190+
initPromise,
191+
isInitCalled: false,
192+
initPromiseResolve,
193+
};
194+
storeValueInWindow(initFlagKey, initFlagStore, {
195+
// In case of diff imports the promise might be already set
196+
ignoreIfAlreadyExists: true,
197+
});
198+
};
199+
200+
createAndSetInitPromise();
201+
202+
export const getInitPromise = ():
203+
Promise<
204+
ReturnType<typeof init>
205+
> => getValueFromWindow<InitFlagStore>(initFlagKey)?.initPromise;
206+
207+
export const getIsInitCalled = (): boolean => !!getValueFromWindow(initFlagKey)?.isInitCalled;
208+
174209
/**
175210
* Initializes the Visual Embed SDK globally and perform
176211
* authentication if applicable. This function needs to be called before any ThoughtSpot
@@ -223,6 +258,11 @@ export const init = (embedConfig: EmbedConfig): AuthEventEmitter => {
223258
if (getEmbedConfig().callPrefetch) {
224259
prefetch(getEmbedConfig().thoughtSpotHost);
225260
}
261+
262+
// Resolves the promise created in the initPromiseKey
263+
getValueFromWindow<InitFlagStore>(initFlagKey).initPromiseResolve(authEE);
264+
getValueFromWindow<InitFlagStore>(initFlagKey).isInitCalled = true;
265+
226266
return authEE as AuthEventEmitter;
227267
};
228268

src/embed/bodyless-conversation.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ class ConversationMessage extends TsEmbed {
5555
}
5656

5757
public async render(): Promise<ConversationMessage> {
58-
super.render();
58+
await super.render();
59+
5960
const src = this.getIframeSrc();
6061
await this.renderIFrame(src);
6162
return this;

src/embed/conversation.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,8 @@ export class ConversationEmbed extends TsEmbed {
164164
}
165165

166166
public async render(): Promise<ConversationEmbed> {
167-
super.render();
167+
await super.render();
168+
168169
const src = this.getIframeSrc();
169170
await this.renderIFrame(src);
170171
return this;

src/embed/embedConfig.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ const configKey = 'embedConfig';
99
* @version SDK: 1.19.0 | ThoughtSpot: *
1010
* @group Global methods
1111
*/
12-
export const getEmbedConfig = (): EmbedConfig => getValueFromWindow(configKey) || {};
12+
export const getEmbedConfig = (): EmbedConfig => getValueFromWindow(configKey) || ({} as any);
1313

1414
/**
1515
* Sets the configuration embed was initialized with.

src/embed/liveboard.spec.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -553,13 +553,13 @@ describe('Liveboard/viz embed tests', () => {
553553
});
554554
});
555555

556-
test('navigateToLiveboard should trigger the navigate event with the correct path', (done) => {
556+
test('navigateToLiveboard should trigger the navigate event with the correct path', async (done) => {
557557
mockMessageChannel();
558558
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
559559
...defaultViewConfig,
560560
} as LiveboardViewConfig);
561561
const onSpy = jest.spyOn(liveboardEmbed, 'trigger');
562-
liveboardEmbed.prerenderGeneric();
562+
await liveboardEmbed.prerenderGeneric();
563563
executeAfterWait(() => {
564564
const iframe = getIFrameEl();
565565
postMessageToParent(iframe.contentWindow, {
@@ -573,14 +573,14 @@ describe('Liveboard/viz embed tests', () => {
573573
});
574574
});
575575

576-
test('navigateToLiveboard with preRender', (done) => {
576+
test('navigateToLiveboard with preRender', async (done) => {
577577
mockMessageChannel();
578578
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
579579
...defaultViewConfig,
580580
preRenderId: 'test',
581581
} as LiveboardViewConfig);
582582
const onSpy = jest.spyOn(liveboardEmbed, 'trigger');
583-
liveboardEmbed.prerenderGeneric();
583+
await liveboardEmbed.prerenderGeneric();
584584
executeAfterWait(() => {
585585
const iframe = getIFrameEl();
586586
postMessageToParent(iframe.contentWindow, {
@@ -604,7 +604,7 @@ describe('Liveboard/viz embed tests', () => {
604604
},
605605
],
606606
} as LiveboardViewConfig);
607-
liveboardEmbed.render();
607+
await liveboardEmbed.render();
608608
await executeAfterWait(() => {
609609
expectUrlMatchesWithParams(
610610
getIFrameSrc(),
@@ -637,7 +637,7 @@ describe('Liveboard/viz embed tests', () => {
637637
...defaultViewConfig,
638638
liveboardId,
639639
} as LiveboardViewConfig);
640-
liveboardEmbed.render();
640+
await liveboardEmbed.render();
641641
await executeAfterWait(() => {
642642
const result = liveboardEmbed.trigger(HostEvent.SetActiveTab, {
643643
tabId: newActiveTabId,
@@ -650,13 +650,13 @@ describe('Liveboard/viz embed tests', () => {
650650
});
651651

652652
describe('PreRender flow for liveboard embed', () => {
653-
test('it should preRender generic with liveboard id is not passed', (done) => {
653+
test('it should preRender generic with liveboard id is not passed', async (done) => {
654654
const consoleSpy = jest.spyOn(console, 'error');
655655
const libEmbed = new LiveboardEmbed(getRootEl(), {
656656
preRenderId: 'testPreRender',
657657
});
658658
const prerenderGenericSpy = jest.spyOn(libEmbed, 'prerenderGeneric');
659-
libEmbed.preRender();
659+
await libEmbed.preRender();
660660
executeAfterWait(() => {
661661
const iFrame = document.getElementById(
662662
libEmbed.getPreRenderIds().child,
@@ -735,7 +735,7 @@ describe('Liveboard/viz embed tests', () => {
735735
};
736736
});
737737

738-
libEmbed.preRender();
738+
await libEmbed.preRender();
739739

740740
await waitFor(() => !!getIFrameEl());
741741

@@ -750,7 +750,7 @@ describe('Liveboard/viz embed tests', () => {
750750
liveboardId: testLiveboardId,
751751
});
752752
const navigateToLiveboardSpy = jest.spyOn(newLibEmbed, 'navigateToLiveboard');
753-
newLibEmbed.showPreRender();
753+
await newLibEmbed.showPreRender();
754754

755755
executeAfterWait(() => {
756756
const iFrame = document.getElementById(
@@ -776,7 +776,7 @@ describe('Liveboard/viz embed tests', () => {
776776
...defaultViewConfig,
777777
vizId: 'testViz',
778778
});
779-
liveboardEmbed.render();
779+
await liveboardEmbed.render();
780780
mockProcessTrigger.mockResolvedValue({ session: 'test' });
781781
await executeAfterWait(async () => {
782782
await liveboardEmbed.trigger(

src/embed/liveboard.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import {
2121
} from '../types';
2222
import { getQueryParamString, isUndefined } from '../utils';
2323
import { getAuthPromise } from './base';
24-
import { V1Embed } from './ts-embed';
24+
import { TsEmbed, V1Embed } from './ts-embed';
2525
import { addPreviewStylesIfNotPresent } from '../utils/global-styles';
2626
import { TriggerPayload, TriggerResponse } from './hostEventClient/contracts';
2727

@@ -635,12 +635,11 @@ export class LiveboardEmbed extends V1Embed {
635635
}
636636
}
637637

638-
protected handleRenderForPrerender(): void {
638+
protected async handleRenderForPrerender(): Promise<TsEmbed> {
639639
if (isUndefined(this.viewConfig.liveboardId)) {
640-
this.prerenderGeneric();
641-
return;
640+
return this.prerenderGeneric();
642641
}
643-
super.handleRenderForPrerender();
642+
return super.handleRenderForPrerender();
644643
}
645644

646645
/**
@@ -670,7 +669,7 @@ export class LiveboardEmbed extends V1Embed {
670669
* visualization ID and the runtime filters.
671670
*/
672671
public async render(): Promise<LiveboardEmbed> {
673-
super.render();
672+
await super.render();
674673

675674
const src = this.getIFrameSrc();
676675
await this.renderV1Embed(src);

src/embed/sage.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -206,8 +206,7 @@ export class SageEmbed extends V1Embed {
206206
* @returns {SageEmbed} Eureka/Sage embed
207207
*/
208208
public async render(): Promise<SageEmbed> {
209-
super.render();
210-
209+
await super.render();
211210
const src = this.getIFrameSrc();
212211
await this.renderV1Embed(src);
213212

src/embed/search-bar.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,8 +174,7 @@ export class SearchBarEmbed extends TsEmbed {
174174
* Render the embedded ThoughtSpot search
175175
*/
176176
public async render(): Promise<SearchBarEmbed> {
177-
super.render();
178-
177+
await super.render();
179178
const src = this.getIFrameSrc();
180179
await this.renderIFrame(src);
181180
return this;

src/embed/search.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -482,9 +482,8 @@ export class SearchEmbed extends TsEmbed {
482482
* Render the embedded ThoughtSpot search
483483
*/
484484
public async render(): Promise<SearchEmbed> {
485-
super.render();
485+
await super.render();
486486
const { answerId } = this.viewConfig;
487-
488487
const src = this.getIFrameSrc();
489488
await this.renderIFrame(src);
490489
getAuthPromise().then(() => {

0 commit comments

Comments
 (0)