onesignal-web-sdk
Version:
Web push notifications from OneSignal.
90 lines (78 loc) • 3.22 kB
text/typescript
import Environment from './Environment';
import SdkEnvironment from './managers/SdkEnvironment';
import { Utils } from "./utils/Utils";
import { OneSignalApiError, OneSignalApiErrorKind } from './errors/OneSignalApiError';
type Headers = any[] & {[key: string]: any};
type SupportedMethods = "GET" | "POST" | "PUT" | "DELETE";
export class OneSignalApiBase {
static get(action: string, data?: any, headers?: Headers | undefined) {
return OneSignalApiBase.call('GET', action, data, headers);
}
static post(action: string, data?: any, headers?: Headers | undefined) {
return OneSignalApiBase.call('POST', action, data, headers);
}
static put(action: string, data?: any, headers?: Headers | undefined) {
return OneSignalApiBase.call('PUT', action, data, headers);
}
static delete(action: string, data?: any, headers?: Headers | undefined) {
return OneSignalApiBase.call('DELETE', action, data, headers);
}
private static call(method: SupportedMethods, action: string, data: any, headers: Headers | undefined): Promise<any> {
if (method === "GET") {
if (action.indexOf("players") > -1 && action.indexOf("app_id=") === -1) {
console.error("Calls to player api are not permitted without app_id");
return Promise.reject(new OneSignalApiError(OneSignalApiErrorKind.MissingAppId));
}
} else {
if (action.indexOf("players") > -1 && (!data || !data["app_id"])) {
console.error("Calls to player api are not permitted without app_id");
return Promise.reject(new OneSignalApiError(OneSignalApiErrorKind.MissingAppId));
}
}
let callHeaders: any = new Headers();
callHeaders.append('SDK-Version', `onesignal/web/${Environment.version()}`);
callHeaders.append('Content-Type', 'application/json;charset=UTF-8');
if (headers) {
for (let key of Object.keys(headers)) {
callHeaders.append(key, headers[key]);
}
}
let contents = {
method: method || 'NO_METHOD_SPECIFIED',
headers: callHeaders,
cache: 'no-cache'
};
if (data)
(contents as any).body = JSON.stringify(data);
let status: number;
return fetch(SdkEnvironment.getOneSignalApiUrl().toString() + '/' + action, contents)
.then(response => {
status = response.status;
return response.json();
})
.then(json => {
if (status >= 200 && status < 300)
return json;
else {
let error = OneSignalApiBase.identifyError(json);
if (error === 'no-user-id-error') {
// TODO: This returns undefined
} else {
return Promise.reject(json);
}
}
});
}
private static identifyError(error: any) {
if (!error || !error.errors) {
return 'no-error';
}
let errors = error.errors;
if (Utils.contains(errors, 'No user with this id found') ||
Utils.contains(errors, 'Could not find app_id for given player id.')) {
return 'no-user-id-error';
}
return 'unknown-error';
}
}
export default OneSignalApiBase;