@streambird/streambird-js
Version:
60 lines (46 loc) • 1.56 kB
text/typescript
import { StreambirdFactory } from './types';
import { STREAMBIRD_JS_URL } from './constants';
const findOrCreateScript = (): HTMLScriptElement => {
const scripts = document.querySelectorAll<HTMLScriptElement>(`script[src="${STREAMBIRD_JS_URL}"]`);
if (scripts[0]) {
return scripts[0];
}
const script = document.createElement('script');
script.src = STREAMBIRD_JS_URL;
document.head.appendChild(script);
return script;
};
const loadScript = (): Promise<StreambirdFactory | null> => {
const isBrowser = typeof window !== 'undefined' && typeof window.document !== 'undefined';
if (!isBrowser) {
return Promise.resolve(null);
}
return new Promise((resolve, reject) => {
if (window.Streambird) {
console.warn('Streambird.js has already been loaded');
resolve(window.Streambird);
}
const script = findOrCreateScript();
script.addEventListener('load', () => {
if (window.Streambird) {
resolve(window.Streambird);
} else {
reject(new Error('Streambird.js could not be loaded'));
}
});
script.addEventListener('error', () => {
reject(new Error('Streambird.js could not be loaded'));
});
});
};
const streambirdPromise: Promise<StreambirdFactory | null> = Promise.resolve().then(() => loadScript());
let loadCalled = false;
streambirdPromise.catch((err: Error) => {
if (!loadCalled) {
console.warn(err);
}
});
export const loadStreambird = (): Promise<StreambirdFactory | null> => {
loadCalled = true;
return streambirdPromise;
};