spwmini-shitless
Version:
Shitless SPWorlds Miniapp creation toolkit
138 lines (136 loc) • 4.12 kB
JavaScript
// src/emitter/index.js
function Emitter(obj) {
if (obj) return mixin(obj);
}
function mixin(obj) {
for (var key in Emitter.prototype) {
obj[key] = Emitter.prototype[key];
}
return obj;
}
Emitter.prototype.on = Emitter.prototype.addEventListener = function(event, fn) {
this._callbacks = this._callbacks || {};
(this._callbacks["$" + event] = this._callbacks["$" + event] || []).push(fn);
return this;
};
Emitter.prototype.once = function(event, fn) {
function on() {
this.off(event, on);
fn.apply(this, arguments);
}
on.fn = fn;
this.on(event, on);
return this;
};
Emitter.prototype.off = Emitter.prototype.removeListener = Emitter.prototype.removeAllListeners = Emitter.prototype.removeEventListener = function(event, fn) {
this._callbacks = this._callbacks || {};
if (0 == arguments.length) {
this._callbacks = {};
return this;
}
var callbacks = this._callbacks["$" + event];
if (!callbacks) return this;
if (1 == arguments.length) {
delete this._callbacks["$" + event];
return this;
}
var cb;
for (var i = 0; i < callbacks.length; i++) {
cb = callbacks[i];
if (cb === fn || cb.fn === fn) {
callbacks.splice(i, 1);
break;
}
}
if (callbacks.length === 0) {
delete this._callbacks["$" + event];
}
return this;
};
Emitter.prototype.emit = function(event) {
this._callbacks = this._callbacks || {};
var args = new Array(arguments.length - 1), callbacks = this._callbacks["$" + event];
for (var i = 1; i < arguments.length; i++) {
args[i - 1] = arguments[i];
}
if (callbacks) {
callbacks = callbacks.slice(0);
for (var i = 0, len = callbacks.length; i < len; ++i) {
callbacks[i].apply(this, args);
}
}
return this;
};
Emitter.prototype.emitReserved = Emitter.prototype.emit;
Emitter.prototype.listeners = function(event) {
this._callbacks = this._callbacks || {};
return this._callbacks["$" + event] || [];
};
Emitter.prototype.hasListeners = function(event) {
return !!this.listeners(event).length;
};
// src/client.ts
var SPWMini = class extends Emitter {
appId;
isReady = false;
user = null;
customFetch = null;
#send(type, payload) {
if (payload) return window.parent.postMessage({ type, payload }, "*");
return window.parent.postMessage({ type }, "*");
}
#handleMessage({ data }) {
if (!data || typeof data !== "object") return;
if (!data.type) return;
this.emit(data.type, data.payload);
}
constructor(appId, options) {
super();
this.appId = appId;
if (options?.customFetch)
this.customFetch = options.customFetch;
const doAutoInit = !options || options.autoinit !== false;
if (doAutoInit) this.initialize();
this.once("initResponse", (user) => {
this.isReady = true;
this.user = user;
if (this.isReady) this.emit("ready");
});
}
initialize() {
window.addEventListener("message", this.#handleMessage.bind(this));
this.#send("init", this.appId);
}
validateUser(url, init = {}) {
return new Promise((resolve, reject) => {
if (!init.method) init.method = "POST";
if (!init.headers) init.headers = {};
init.headers["Content-Type"] = "application/json";
const fetchFunction = this.customFetch || window.fetch;
fetchFunction(url, {
...init,
body: JSON.stringify(this.user)
}).then((r) => r.text()).then((v) => resolve(v === "1")).catch(reject);
});
}
dispose() {
window.removeEventListener("message", this.#handleMessage.bind(this));
}
openURL(url) {
let parsedUrl;
try {
parsedUrl = new URL(url);
} catch (e) {
throw "\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u043D\u044B\u0439 URL";
}
if (parsedUrl.protocol !== "https:") throw "\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u043F\u0440\u043E\u0442\u043E\u043A\u043E\u043B";
this.#send("openURL", url);
}
openPayment(code) {
if (!code) throw "\u041D\u0435 \u0443\u043A\u0430\u0437\u0430\u043D \u043A\u043E\u0434";
this.#send("openPayment", code);
}
};
export {
SPWMini as default
};