(function (window) { "use strict"; window.ls.container.set('appwrite', function (window, env) { let config = { endpoint: 'https://appwrite.io/v1', }; let http = function (document, env) { let globalParams = [], globalHeaders = []; let addParam = function (url, param, value) { let a = document.createElement('a'), regex = /(?:\?|&|&)+([^=]+)(?:=([^&]*))*/g; let match, str = []; a.href = url; param = encodeURIComponent(param); while (match = regex.exec(a.search)) if (param !== match[1]) str.push(match[1] + (match[2] ? "=" + match[2] : "")); str.push(param + (value ? "=" + encodeURIComponent(value) : "")); a.search = str.join("&"); return a.href; }; /** * @param {Object} params * @returns {string} */ let buildQuery = function (params) { let str = []; for (let p in params) { if (params.hasOwnProperty(p)) { str.push(encodeURIComponent(p) + "=" + encodeURIComponent(params[p])); } } return str.join("&"); }; let addGlobalHeader = function (key, value) { globalHeaders[key] = { key: key.toLowerCase(), value: value.toLowerCase() }; }; let addGlobalParam = function (key, value) { globalParams.push({ key: key, value: value }); }; addGlobalHeader('content-type', ''); /** * @param {string} method * @param {string} path string * @param {Object} headers * @param {Object} params * @param {function} progress * @returns {Promise} */ let call = function (method, path, headers = {}, params = {}, progress = null) { let i; path = config.endpoint + path; if (-1 === ['GET', 'POST', 'PUT', 'DELETE', 'TRACE', 'HEAD', 'OPTIONS', 'CONNECT', 'PATCH'].indexOf(method)) { throw new Error('var method must contain a valid HTTP method name'); } if (typeof path !== 'string') { throw new Error('var path must be of type string'); } if (typeof headers !== 'object') { throw new Error('var headers must be of type object'); } for (i = 0; i < globalParams.length; i++) { // Add global params to URL path = addParam(path, globalParams[i].key, globalParams[i].value); } for (let key in globalHeaders) { // Add Global Headers if (globalHeaders.hasOwnProperty(key)) { if (!headers[globalHeaders[key].key]) { headers[globalHeaders[key].key] = globalHeaders[key].value; } } } if (method === 'GET') { for (let param in params) { if (param.hasOwnProperty(key)) { path = addParam(path, key, params[key]); } } } switch (headers['content-type']) { // Parse request by content type case 'application/json': params = JSON.stringify(params); break; case 'multipart/form-data': let formData = new FormData(); for (let param in params) { if (param.hasOwnProperty(key)) { formData.append(key, param[key]); } } params = formData; break; } return new Promise(function (resolve, reject) { let request = new XMLHttpRequest(), key; request.withCredentials = true; request.open(method, path, true); for (key in headers) { // Set Headers if (headers.hasOwnProperty(key)) { request.setRequestHeader(key, headers[key]); } } request.onload = function () { if (4 === request.readyState && 399 >= request.status) { let data = request.response; let contentType = this.getResponseHeader('content-type'); contentType = contentType.substring(0, contentType.indexOf(';')); switch (contentType) { case 'application/json': data = JSON.parse(data); break; } resolve(data); } else { reject(new Error(request.statusText)); } }; if (progress) { request.addEventListener('progress', progress); request.upload.addEventListener('progress', progress, false); } // Handle network errors request.onerror = function () { reject(new Error("Network Error")); }; request.send(params); }) }; return { 'get': function (path, headers = {}, params = {}) { return call('GET', path + ((params.length > 0) ? '?' + buildQuery(params) : ''), headers, {}); }, 'post': function (path, headers = {}, params = {}, progress = null) { return call('POST', path, headers, params, progress); }, 'put': function (path, headers = {}, params = {}, progress = null) { return call('PUT', headers, params, progress); }, 'patch': function (path, headers = {}, params = {}, progress = null) { return call('PATCH', path, headers, params, progress); }, 'delete': function (path, headers = {}, params = {}, progress = null) { return call('DELETE', path, headers, params, progress); }, 'addGlobalParam': addGlobalParam, 'addGlobalHeader': addGlobalHeader } }(window.document); let analytics = { create: function (id, source, activity, url) { return http.post('/analytics', { 'content-type': 'application/json' }, { id: id, source: source, activity: activity, url: url, version: env.VERSION, setup: env.SETUP }); }, }; return { analytics: analytics, }; }, true); })(window);