@schematichq/schematic-js 0.1.7 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";(()=>{var p,
|
|
1
|
+
"use strict";(()=>{var p,f=new Uint8Array(16);function u(){if(!p&&(p=typeof crypto<"u"&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!p))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return p(f)}var s=[];for(let n=0;n<256;++n)s.push((n+256).toString(16).slice(1));function v(n,e=0){return s[n[e+0]]+s[n[e+1]]+s[n[e+2]]+s[n[e+3]]+"-"+s[n[e+4]]+s[n[e+5]]+"-"+s[n[e+6]]+s[n[e+7]]+"-"+s[n[e+8]]+s[n[e+9]]+"-"+s[n[e+10]]+s[n[e+11]]+s[n[e+12]]+s[n[e+13]]+s[n[e+14]]+s[n[e+15]]}var m=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),y={randomUUID:m};function k(n,e,t){if(y.randomUUID&&!e&&!n)return y.randomUUID();n=n||{};let r=n.random||(n.rng||u)();if(r[6]=r[6]&15|64,r[8]=r[8]&63|128,e){t=t||0;for(let o=0;o<16;++o)e[t+o]=r[o];return e}return v(r)}var h=k;var g="schematicId";var l=class{apiKey;apiUrl="https://api.schematichq.com";webSocketUrl="wss://api.schematichq.com";eventUrl="https://c.schematichq.com";conn=null;context={};eventQueue;storage;useWebSocket=!1;values={};flagListener;constructor(e,t){this.apiKey=e,this.eventQueue=[],this.useWebSocket=t?.useWebSocket??!1,this.flagListener=t?.flagListener,t?.storage?this.storage=t.storage:typeof localStorage<"u"&&(this.storage=localStorage),t?.apiUrl!==void 0&&(this.apiUrl=t.apiUrl),t?.eventUrl!==void 0&&(this.eventUrl=t.eventUrl),t?.webSocketUrl!==void 0&&(this.webSocketUrl=t.webSocketUrl),window?.addEventListener&&window.addEventListener("beforeunload",()=>{this.flushEventQueue()})}async checkFlag(e){let{fallback:t=!1,key:r}=e,o=e.context||this.context;if(this.useWebSocket){let i=this.values[c(o)]??{};return typeof i[r]>"u"?t:i[r]}let a=`${this.apiUrl}/flags/${r}/check`;return fetch(a,{method:"POST",headers:{"X-Schematic-Api-Key":this.apiKey,"Content-Type":"application/json;charset=UTF-8"},body:JSON.stringify(o)}).then(i=>{if(!i.ok)throw new Error("Network response was not ok");return i.json()}).then(i=>i.data.value).catch(i=>(console.error("There was a problem with the fetch operation:",i),t))}checkFlags=async e=>{e=e||this.context;let t=`${this.apiUrl}/flags/check`,r=JSON.stringify(e);return fetch(t,{method:"POST",headers:{"Content-Type":"application/json;charset=UTF-8","X-Schematic-Api-Key":this.apiKey},body:r}).then(o=>{if(!o.ok)throw new Error("Network response was not ok");return o.json()}).then(o=>(o?.data?.flags??[]).reduce((a,i)=>(a[i.flag]=i.value,a),{})).catch(o=>(console.error("There was a problem with the fetch operation:",o),!1))};cleanup=()=>{this.conn&&this.conn.close()};identify=e=>{this.handleEvent("identify",e)};setContext=e=>this.useWebSocket?new Promise(t=>{this.wsConnect().then(()=>{this.wsSendMessage(e),t()})}):(this.context=e,Promise.resolve());track=e=>{this.handleEvent("track",e)};flushEventQueue=()=>{for(;this.eventQueue.length>0;){let e=this.eventQueue.shift();e&&this.sendEvent(e)}};getAnonymousId=()=>{if(!this.storage)return h();let e=this.storage.getItem(g);if(typeof e<"u")return e;let t=h();return this.storage.setItem(g,t),t};handleEvent=(e,t)=>{let r={api_key:this.apiKey,body:t,sent_at:new Date().toISOString(),tracker_event_id:h(),tracker_user_id:this.getAnonymousId(),type:e};document?.hidden?this.storeEvent(r):this.sendEvent(r)};sendEvent=e=>{let t=`${this.eventUrl}/e`,r=JSON.stringify(e);fetch(t,{method:"POST",headers:{"Content-Type":"application/json;charset=UTF-8"},body:r}).then(o=>{if(!o.ok)throw new Error(`Network response was not ok: ${o.statusText}`)}).catch(o=>{console.error("There was a problem with the fetch operation:",o)})};storeEvent=e=>{this.eventQueue.push(e)};wsConnect=()=>new Promise(e=>{this.conn&&e();let t=`${this.webSocketUrl}/flags/bootstrap`,r=new WebSocket(t);this.conn=r,r.onopen=()=>{e()},r.onclose=()=>{this.conn=null}});wsSendMessage=e=>new Promise((t,r)=>{if(c(e)==c(this.context)&&t(),this.context=e,!this.conn){r("Not connected");return}if(this.conn.readyState===WebSocket.OPEN){let o=!1;this.conn.onmessage=a=>{let i=JSON.parse(a.data);this.values[c(e)]||={},(i.flags??[]).forEach(d=>{this.values[c(e)][d.flag]=d.value}),this.flagListener&&this.flagListener(this.values[c(e)]),o||(o=!0,t())},this.conn.onerror=a=>{console.error("Schematic websocket error: ",a)},this.conn.send(JSON.stringify({apiKey:this.apiKey,data:e}))}else this.conn.readyState===WebSocket.CONNECTING?this.conn.onopen=()=>{this.wsSendMessage(e)}:r("Not connected")})};function c(n){let e=Object.keys(n).reduce((t,r)=>{let a=Object.keys(n[r]||{}).sort().reduce((i,d)=>(i[d]=n[r][d],i),{});return t[r]=a,t},{});return JSON.stringify(e)}window.Schematic=l;})();
|
|
2
2
|
/* @preserve */
|
package/dist/schematic.cjs.js
CHANGED
|
@@ -111,7 +111,7 @@ var Schematic = class {
|
|
|
111
111
|
});
|
|
112
112
|
}
|
|
113
113
|
}
|
|
114
|
-
|
|
114
|
+
async checkFlag(options) {
|
|
115
115
|
const { fallback = false, key } = options;
|
|
116
116
|
const context = options.context || this.context;
|
|
117
117
|
if (this.useWebSocket) {
|
|
@@ -137,7 +137,7 @@ var Schematic = class {
|
|
|
137
137
|
console.error("There was a problem with the fetch operation:", error);
|
|
138
138
|
return fallback;
|
|
139
139
|
});
|
|
140
|
-
}
|
|
140
|
+
}
|
|
141
141
|
// Make a REST API call to fetch all flag values for a given context
|
|
142
142
|
checkFlags = async (context) => {
|
|
143
143
|
context = context || this.context;
|
|
@@ -285,13 +285,10 @@ var Schematic = class {
|
|
|
285
285
|
let resolved = false;
|
|
286
286
|
this.conn.onmessage = (event) => {
|
|
287
287
|
const message = JSON.parse(event.data);
|
|
288
|
-
this.values[contextString(context)]
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
},
|
|
293
|
-
{}
|
|
294
|
-
);
|
|
288
|
+
this.values[contextString(context)] ||= {};
|
|
289
|
+
(message.flags ?? []).forEach((flag) => {
|
|
290
|
+
this.values[contextString(context)][flag.flag] = flag.value;
|
|
291
|
+
});
|
|
295
292
|
if (this.flagListener) {
|
|
296
293
|
this.flagListener(this.values[contextString(context)]);
|
|
297
294
|
}
|
package/dist/schematic.d.ts
CHANGED
|
@@ -64,7 +64,7 @@ export declare class Schematic {
|
|
|
64
64
|
private values;
|
|
65
65
|
private flagListener?;
|
|
66
66
|
constructor(apiKey: string, options?: SchematicOptions);
|
|
67
|
-
checkFlag
|
|
67
|
+
checkFlag(options: CheckOptions): Promise<boolean>;
|
|
68
68
|
checkFlags: (context?: SchematicContext) => Promise<Record<string, boolean>>;
|
|
69
69
|
cleanup: () => void;
|
|
70
70
|
identify: (body: EventBodyIdentify) => void;
|
package/dist/schematic.esm.js
CHANGED
|
@@ -85,7 +85,7 @@ var Schematic = class {
|
|
|
85
85
|
});
|
|
86
86
|
}
|
|
87
87
|
}
|
|
88
|
-
|
|
88
|
+
async checkFlag(options) {
|
|
89
89
|
const { fallback = false, key } = options;
|
|
90
90
|
const context = options.context || this.context;
|
|
91
91
|
if (this.useWebSocket) {
|
|
@@ -111,7 +111,7 @@ var Schematic = class {
|
|
|
111
111
|
console.error("There was a problem with the fetch operation:", error);
|
|
112
112
|
return fallback;
|
|
113
113
|
});
|
|
114
|
-
}
|
|
114
|
+
}
|
|
115
115
|
// Make a REST API call to fetch all flag values for a given context
|
|
116
116
|
checkFlags = async (context) => {
|
|
117
117
|
context = context || this.context;
|
|
@@ -259,13 +259,10 @@ var Schematic = class {
|
|
|
259
259
|
let resolved = false;
|
|
260
260
|
this.conn.onmessage = (event) => {
|
|
261
261
|
const message = JSON.parse(event.data);
|
|
262
|
-
this.values[contextString(context)]
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
},
|
|
267
|
-
{}
|
|
268
|
-
);
|
|
262
|
+
this.values[contextString(context)] ||= {};
|
|
263
|
+
(message.flags ?? []).forEach((flag) => {
|
|
264
|
+
this.values[contextString(context)][flag.flag] = flag.value;
|
|
265
|
+
});
|
|
269
266
|
if (this.flagListener) {
|
|
270
267
|
this.flagListener(this.values[contextString(context)]);
|
|
271
268
|
}
|
package/package.json
CHANGED