chemicaljs 1.7.4 → 1.8.0

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,354 +1,416 @@
1
1
  window.chemical = {
2
- loaded: false,
3
- transport: document.currentScript.dataset.transport || "libcurl",
4
- wisp: document.currentScript.dataset.wisp || (location.protocol === "https:" ? "wss" : "ws") + "://" + location.host + "/wisp/"
5
- }
2
+ loaded: false,
3
+ transport: document.currentScript.dataset.transport || "libcurl",
4
+ wisp:
5
+ document.currentScript.dataset.wisp ||
6
+ (location.protocol === "https:" ? "wss" : "ws") +
7
+ "://" +
8
+ location.host +
9
+ "/wisp/",
10
+ };
6
11
 
7
12
  function rammerheadEncode(baseUrl, decode = false) {
8
- const mod = (n, m) => ((n % m) + m) % m;
9
- const baseDictionary =
10
- "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz~-";
11
- const shuffledIndicator = "_rhs";
12
-
13
- const generateDictionary = function () {
14
- let str = "";
15
- const split = baseDictionary.split("");
16
- while (split.length > 0) {
17
- str += split.splice(Math.floor(Math.random() * split.length), 1)[0];
18
- }
19
- return str;
20
- };
13
+ const mod = (n, m) => ((n % m) + m) % m;
14
+ const baseDictionary =
15
+ "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz~-";
16
+ const shuffledIndicator = "_rhs";
21
17
 
22
- class StrShuffler {
23
- constructor(dictionary = generateDictionary()) {
24
- this.dictionary = dictionary;
25
- }
18
+ const generateDictionary = function () {
19
+ let str = "";
20
+ const split = baseDictionary.split("");
21
+ while (split.length > 0) {
22
+ str += split.splice(Math.floor(Math.random() * split.length), 1)[0];
23
+ }
24
+ return str;
25
+ };
26
26
 
27
- shuffle(str) {
28
- if (str.startsWith(shuffledIndicator)) {
29
- return str;
30
- }
31
- let shuffledStr = "";
32
- for (let i = 0; i < str.length; i++) {
33
- const char = str.charAt(i);
34
- const idx = baseDictionary.indexOf(char);
35
- if (char === "%" && str.length - i >= 3) {
36
- shuffledStr += char;
37
- shuffledStr += str.charAt(++i);
38
- shuffledStr += str.charAt(++i);
39
- } else if (idx === -1) {
40
- shuffledStr += char;
41
- } else {
42
- shuffledStr += this.dictionary.charAt(
43
- mod(idx + i, baseDictionary.length)
44
- );
45
- }
46
- }
47
- return shuffledIndicator + shuffledStr;
48
- }
27
+ class StrShuffler {
28
+ constructor(dictionary = generateDictionary()) {
29
+ this.dictionary = dictionary;
30
+ }
49
31
 
50
- unshuffle(str) {
51
- if (!str.startsWith(shuffledIndicator)) {
52
- return str;
53
- }
54
-
55
- str = str.slice(shuffledIndicator.length);
56
-
57
- let unshuffledStr = "";
58
- for (let i = 0; i < str.length; i++) {
59
- const char = str.charAt(i);
60
- const idx = this.dictionary.indexOf(char);
61
- if (char === "%" && str.length - i >= 3) {
62
- unshuffledStr += char;
63
- unshuffledStr += str.charAt(++i);
64
- unshuffledStr += str.charAt(++i);
65
- } else if (idx === -1) {
66
- unshuffledStr += char;
67
- } else {
68
- unshuffledStr += baseDictionary.charAt(
69
- mod(idx - i, baseDictionary.length)
70
- );
71
- }
72
- }
73
- return unshuffledStr;
32
+ shuffle(str) {
33
+ if (str.startsWith(shuffledIndicator)) {
34
+ return str;
35
+ }
36
+ let shuffledStr = "";
37
+ for (let i = 0; i < str.length; i++) {
38
+ const char = str.charAt(i);
39
+ const idx = baseDictionary.indexOf(char);
40
+ if (char === "%" && str.length - i >= 3) {
41
+ shuffledStr += char;
42
+ shuffledStr += str.charAt(++i);
43
+ shuffledStr += str.charAt(++i);
44
+ } else if (idx === -1) {
45
+ shuffledStr += char;
46
+ } else {
47
+ shuffledStr += this.dictionary.charAt(
48
+ mod(idx + i, baseDictionary.length)
49
+ );
74
50
  }
51
+ }
52
+ return shuffledIndicator + shuffledStr;
75
53
  }
76
54
 
77
- function get(url, callback, shush = false) {
78
- var request = new XMLHttpRequest();
79
- request.open("GET", url, true);
80
- request.send();
55
+ unshuffle(str) {
56
+ if (!str.startsWith(shuffledIndicator)) {
57
+ return str;
58
+ }
81
59
 
82
- request.onerror = function () {
83
- if (!shush) console.log("Cannot communicate with the server");
84
- };
85
- request.onload = function () {
86
- if (request.status === 200) {
87
- callback(request.responseText);
88
- } else {
89
- if (!shush)
90
- console.log(
91
- 'unexpected server response to not match "200". Server says "' +
92
- request.responseText +
93
- '"'
94
- );
95
- }
96
- };
97
- }
60
+ str = str.slice(shuffledIndicator.length);
98
61
 
99
- var api = {
100
- newsession(callback) {
101
- get("/newsession", callback);
102
- },
103
- sessionexists(id, callback) {
104
- get("/sessionexists?id=" + encodeURIComponent(id), function (res) {
105
- if (res === "exists") return callback(true);
106
- if (res === "not found") return callback(false);
107
- console.log("unexpected response from server. received" + res);
108
- });
109
- },
110
- shuffleDict(id, callback) {
111
- console.log("Shuffling", id);
112
- get("/api/shuffleDict?id=" + encodeURIComponent(id), function (res) {
113
- callback(JSON.parse(res));
114
- });
62
+ let unshuffledStr = "";
63
+ for (let i = 0; i < str.length; i++) {
64
+ const char = str.charAt(i);
65
+ const idx = this.dictionary.indexOf(char);
66
+ if (char === "%" && str.length - i >= 3) {
67
+ unshuffledStr += char;
68
+ unshuffledStr += str.charAt(++i);
69
+ unshuffledStr += str.charAt(++i);
70
+ } else if (idx === -1) {
71
+ unshuffledStr += char;
72
+ } else {
73
+ unshuffledStr += baseDictionary.charAt(
74
+ mod(idx - i, baseDictionary.length)
75
+ );
115
76
  }
116
- };
77
+ }
78
+ return unshuffledStr;
79
+ }
80
+ }
117
81
 
118
- var localStorageKey = "rammerhead_sessionids";
119
- var localStorageKeyDefault = "rammerhead_default_sessionid";
120
- var sessionIdsStore = {
121
- get() {
122
- var rawData = localStorage.getItem(localStorageKey);
123
- if (!rawData) return [];
124
- try {
125
- var data = JSON.parse(rawData);
126
- if (!Array.isArray(data)) throw "getout";
127
- return data;
128
- } catch (e) {
129
- return [];
130
- }
131
- },
132
- set(data) {
133
- if (!data || !Array.isArray(data)) throw new TypeError("must be array");
134
- localStorage.setItem(localStorageKey, JSON.stringify(data));
135
- },
136
- getDefault() {
137
- var sessionId = localStorage.getItem(localStorageKeyDefault);
138
- if (sessionId) {
139
- var data = sessionIdsStore.get();
140
- data.filter(function (e) {
141
- return e.id === sessionId;
142
- });
143
- if (data.length) return data[0];
144
- }
145
- return null;
146
- },
147
- setDefault(id) {
148
- localStorage.setItem(localStorageKeyDefault, id);
149
- }
82
+ function get(url, callback, shush = false) {
83
+ var request = new XMLHttpRequest();
84
+ request.open("GET", url, true);
85
+ request.send();
86
+
87
+ request.onerror = function () {
88
+ if (!shush) console.log("Cannot communicate with the server");
150
89
  };
90
+ request.onload = function () {
91
+ if (request.status === 200) {
92
+ callback(request.responseText);
93
+ } else {
94
+ if (!shush)
95
+ console.log(
96
+ 'unexpected server response to not match "200". Server says "' +
97
+ request.responseText +
98
+ '"'
99
+ );
100
+ }
101
+ };
102
+ }
151
103
 
152
- function addSession(id) {
153
- var data = sessionIdsStore.get();
154
- data.unshift({ id: id, createdOn: new Date().toLocaleString() });
155
- sessionIdsStore.set(data);
156
- }
104
+ var api = {
105
+ newsession(callback) {
106
+ get("/newsession", callback);
107
+ },
108
+ sessionexists(id, callback) {
109
+ get("/sessionexists?id=" + encodeURIComponent(id), function (res) {
110
+ if (res === "exists") return callback(true);
111
+ if (res === "not found") return callback(false);
112
+ console.log("unexpected response from server. received" + res);
113
+ });
114
+ },
115
+ shuffleDict(id, callback) {
116
+ console.log("Shuffling", id);
117
+ get("/api/shuffleDict?id=" + encodeURIComponent(id), function (res) {
118
+ callback(JSON.parse(res));
119
+ });
120
+ },
121
+ };
157
122
 
158
- function getSessionId() {
159
- return new Promise(resolve => {
160
- var id = localStorage.getItem("session-string");
161
- api.sessionexists(id, function (value) {
162
- if (!value) {
163
- console.log("Session validation failed");
164
- api.newsession(function (id) {
165
- addSession(id);
166
- localStorage.setItem("session-string", id);
167
- console.log(id);
168
- console.log("^ new id");
169
- resolve(id);
170
- });
171
- } else {
172
- resolve(id);
173
- }
174
- });
123
+ var localStorageKey = "rammerhead_sessionids";
124
+ var localStorageKeyDefault = "rammerhead_default_sessionid";
125
+ var sessionIdsStore = {
126
+ get() {
127
+ var rawData = localStorage.getItem(localStorageKey);
128
+ if (!rawData) return [];
129
+ try {
130
+ var data = JSON.parse(rawData);
131
+ if (!Array.isArray(data)) throw "getout";
132
+ return data;
133
+ } catch (e) {
134
+ return [];
135
+ }
136
+ },
137
+ set(data) {
138
+ if (!data || !Array.isArray(data)) throw new TypeError("must be array");
139
+ localStorage.setItem(localStorageKey, JSON.stringify(data));
140
+ },
141
+ getDefault() {
142
+ var sessionId = localStorage.getItem(localStorageKeyDefault);
143
+ if (sessionId) {
144
+ var data = sessionIdsStore.get();
145
+ data.filter(function (e) {
146
+ return e.id === sessionId;
175
147
  });
176
- }
148
+ if (data.length) return data[0];
149
+ }
150
+ return null;
151
+ },
152
+ setDefault(id) {
153
+ localStorage.setItem(localStorageKeyDefault, id);
154
+ },
155
+ };
177
156
 
178
- var ProxyHref;
179
-
180
- return getSessionId().then(id => {
181
- return new Promise(resolve => {
182
- api.shuffleDict(id, function (shuffleDict) {
183
- var shuffler = new StrShuffler(shuffleDict);
184
- if (decode) {
185
- ProxyHref = shuffler.unshuffle(baseUrl.split(id + "/")[1]);
186
- } else {
187
- ProxyHref = "/" + id + "/" + shuffler.shuffle(baseUrl);
188
- }
189
- resolve(ProxyHref);
190
- });
191
- });
157
+ function addSession(id) {
158
+ var data = sessionIdsStore.get();
159
+ data.unshift({ id: id, createdOn: new Date().toLocaleString() });
160
+ sessionIdsStore.set(data);
161
+ }
162
+
163
+ function getSessionId() {
164
+ return new Promise((resolve) => {
165
+ var id = localStorage.getItem("session-string");
166
+ api.sessionexists(id, function (value) {
167
+ if (!value) {
168
+ console.log("Session validation failed");
169
+ api.newsession(function (id) {
170
+ addSession(id);
171
+ localStorage.setItem("session-string", id);
172
+ console.log(id);
173
+ console.log("^ new id");
174
+ resolve(id);
175
+ });
176
+ } else {
177
+ resolve(id);
178
+ }
179
+ });
192
180
  });
181
+ }
182
+
183
+ var ProxyHref;
184
+
185
+ return getSessionId().then((id) => {
186
+ return new Promise((resolve) => {
187
+ api.shuffleDict(id, function (shuffleDict) {
188
+ var shuffler = new StrShuffler(shuffleDict);
189
+ if (decode) {
190
+ ProxyHref = shuffler.unshuffle(baseUrl.split(id + "/")[1]);
191
+ } else {
192
+ ProxyHref = "/" + id + "/" + shuffler.shuffle(baseUrl);
193
+ }
194
+ resolve(ProxyHref);
195
+ });
196
+ });
197
+ });
193
198
  }
194
199
 
195
200
  async function encodeService(url, service) {
196
- switch (service) {
197
- case "uv":
198
- if (uvEnabled) {
199
- return (
200
- window.location.origin +
201
- window.__uv$config.prefix +
202
- window.__uv$config.encodeUrl(url)
203
- );
204
- }
205
- break;
206
- case "rammerhead":
207
- if (rammerheadEnabled) {
208
- return window.location.origin + (await rammerheadEncode(url));
209
- }
210
- break;
211
- case "scramjet":
212
- if (scramjetEnabled) {
213
- return (
214
- window.location.origin +
215
- window.__scramjet$config.prefix +
216
- window.__scramjet$config.codec.encode(url)
217
- );
218
- }
219
- break;
220
- }
201
+ switch (service) {
202
+ case "uv":
203
+ if (uvEnabled) {
204
+ return (
205
+ window.location.origin +
206
+ __uv$config.prefix +
207
+ __uv$config.encodeUrl(url)
208
+ );
209
+ }
210
+ break;
211
+ case "rammerhead":
212
+ if (rammerheadEnabled) {
213
+ return window.location.origin + (await rammerheadEncode(url));
214
+ }
215
+ break;
216
+ case "scramjet":
217
+ if (scramjetEnabled) {
218
+ return (
219
+ window.location.origin +
220
+ __scramjet$config.prefix +
221
+ __scramjet$config.codec.encode(url)
222
+ );
223
+ }
224
+ break;
225
+ case "meteor":
226
+ if (meteorEnabled) {
227
+ return (
228
+ window.location.origin +
229
+ $meteor_config.prefix +
230
+ $meteor_config.codec.encode(url)
231
+ );
232
+ }
233
+ break;
234
+ }
221
235
  }
222
236
 
223
237
  window.chemical.encode = async function (url, config) {
224
- if (!config || typeof config !== "object" || Array.isArray(config)) {
225
- config = {
226
- service: defaultService,
227
- autoHttps: false
228
- }
229
- }
238
+ if (!config || typeof config !== "object" || Array.isArray(config)) {
239
+ config = {
240
+ service: defaultService,
241
+ autoHttps: false,
242
+ };
243
+ }
230
244
 
231
- if (config.service == undefined) {
232
- config.service = defaultService;
233
- }
245
+ if (config.service == undefined) {
246
+ config.service = defaultService;
247
+ }
234
248
 
235
- if (config.autoHttps == undefined) {
236
- config.autoHttps = false;
237
- }
249
+ if (config.autoHttps == undefined) {
250
+ config.autoHttps = false;
251
+ }
238
252
 
239
- if (url.match(/^https?:\/\//)) {
240
- return await encodeService(url, config.service);
241
- } else if (config.autoHttps == true && (url.includes(".") && !url.includes(" "))) {
242
- return await encodeService("https://" + url, config.service);
243
- } else if (config.searchEngine) {
244
- return await encodeService(config.searchEngine.replace("%s", encodeURIComponent(url)), config.service);
245
- } else {
246
- return await encodeService(url, config.service);
247
- }
248
- }
253
+ if (url.match(/^https?:\/\//)) {
254
+ return await encodeService(url, config.service);
255
+ } else if (
256
+ config.autoHttps == true &&
257
+ url.includes(".") &&
258
+ !url.includes(" ")
259
+ ) {
260
+ return await encodeService("https://" + url, config.service);
261
+ } else if (config.searchEngine) {
262
+ return await encodeService(
263
+ config.searchEngine.replace("%s", encodeURIComponent(url)),
264
+ config.service
265
+ );
266
+ } else {
267
+ return await encodeService(url, config.service);
268
+ }
269
+ };
249
270
 
250
271
  window.chemical.decode = async function (url, config) {
251
- if (!config || typeof config !== "object" || Array.isArray(config)) {
252
- config = {
253
- service: defaultService,
254
- }
255
- }
272
+ if (!config || typeof config !== "object" || Array.isArray(config)) {
273
+ config = {
274
+ service: defaultService,
275
+ };
276
+ }
256
277
 
257
- switch (config.service) {
258
- case "uv":
259
- if (uvEnabled) {
260
- return __uv$config.decodeUrl(url.split(__uv$config.prefix)[1]);
261
- }
262
- break;
263
- case "rammerhead":
264
- if (rammerheadEnabled) {
265
- return await rammerheadEncode(url.split(window.location.origin)[1], true);
266
- }
267
- break;
268
- case "scramjet":
269
- if (scramjetEnabled) {
270
- return __scramjet$config.codec.decode(url.split(__scramjet$config.prefix)[1]);
271
- }
272
- break;
273
- }
274
- }
278
+ switch (config.service) {
279
+ case "uv":
280
+ if (uvEnabled) {
281
+ return __uv$config.decodeUrl(url.split(__uv$config.prefix)[1]);
282
+ }
283
+ break;
284
+ case "rammerhead":
285
+ if (rammerheadEnabled) {
286
+ return await rammerheadEncode(
287
+ url.split(window.location.origin)[1],
288
+ true
289
+ );
290
+ }
291
+ break;
292
+ case "scramjet":
293
+ if (scramjetEnabled) {
294
+ return __scramjet$config.codec.decode(
295
+ url.split(__scramjet$config.prefix)[1]
296
+ );
297
+ }
298
+ break;
299
+ case "meteor":
300
+ if (meteorEnabled) {
301
+ return $meteor_config.codec.decode(url.split($meteor_config.prefix)[1]);
302
+ }
303
+ break;
304
+ }
305
+ };
275
306
 
276
307
  function getTransport(transport) {
277
- switch (transport) {
278
- default:
279
- case "libcurl":
280
- return "/libcurl/index.mjs"
281
- break;
282
- case "epoxy":
283
- return "/epoxy/index.mjs"
284
- break;
285
- }
308
+ switch (transport) {
309
+ default:
310
+ case "libcurl":
311
+ return "/libcurl/index.mjs";
312
+ break;
313
+ case "epoxy":
314
+ return "/epoxy/index.mjs";
315
+ break;
316
+ }
286
317
  }
287
318
 
288
- window.chemical.setTransport = async function (newTransport = window.chemical.transport) {
289
- await window.chemical.connection.setTransport(getTransport(newTransport), [{ wisp: window.chemical.wisp }]);
290
- window.chemical.transport = newTransport;
291
- }
319
+ window.chemical.setTransport = async function (
320
+ newTransport = window.chemical.transport
321
+ ) {
322
+ await window.chemical.connection.setTransport(getTransport(newTransport), [
323
+ { wisp: window.chemical.wisp },
324
+ ]);
325
+ window.chemical.transport = newTransport;
326
+ };
292
327
 
293
328
  window.chemical.setWisp = async function (wisp = window.chemical.wisp) {
294
- await window.chemical.connection.setTransport(getTransport(window.chemical.transport), [{ wisp: wisp }]);
295
- window.chemical.wisp = wisp;
296
- }
329
+ await window.chemical.connection.setTransport(
330
+ getTransport(window.chemical.transport),
331
+ [{ wisp: wisp }]
332
+ );
333
+ window.chemical.wisp = wisp;
334
+ };
297
335
 
298
336
  async function registerSW() {
299
- if ("serviceWorker" in navigator) {
300
- await navigator.serviceWorker.register("/chemical.sw.js");
301
- } else {
302
- console.error("Service worker failed to register.")
303
- }
337
+ if ("serviceWorker" in navigator) {
338
+ await navigator.serviceWorker.register("/chemical.sw.js");
339
+ } else {
340
+ console.error("Service worker failed to register.");
341
+ }
304
342
  }
305
343
 
306
344
  async function loadScript(src) {
307
- await new Promise((resolve, reject) => {
308
- const script = document.createElement("script");
309
- script.src = src;
310
- script.onload = () => {
311
- resolve();
312
- };
313
- script.onerror = () => {
314
- reject();
315
- };
316
- document.head.appendChild(script);
317
- });
345
+ await new Promise((resolve, reject) => {
346
+ const script = document.createElement("script");
347
+ script.src = src;
348
+ script.onload = () => {
349
+ resolve();
350
+ };
351
+ script.onerror = () => {
352
+ reject();
353
+ };
354
+ document.head.appendChild(script);
355
+ });
318
356
  }
319
357
 
320
358
  function setupFetch() {
321
- const client = new window.BareMux.BareClient();
322
- window.chemical.fetch = client.fetch.bind(client);
359
+ const client = new window.BareMux.BareClient();
360
+ window.chemical.fetch = client.fetch.bind(client);
323
361
 
324
- window.chemical.getSuggestions = async function (query) {
325
- if (!query) {
326
- return [];
327
- }
362
+ window.chemical.getSuggestions = async function (query) {
363
+ if (!query) {
364
+ return [];
365
+ }
328
366
 
329
- try {
330
- const DDGSuggestions = await window.chemical.fetch(
331
- "https://duckduckgo.com/ac/?q=" + query + "&type=list"
332
- );
333
- const suggestions = await DDGSuggestions.json();
334
- return suggestions[1].slice(0, 9);
335
- } catch (err) {
336
- console.error(err);
337
- return [];
338
- }
367
+ try {
368
+ const DDGSuggestions = await window.chemical.fetch(
369
+ "https://duckduckgo.com/ac/?q=" + query + "&type=list"
370
+ );
371
+ const suggestions = await DDGSuggestions.json();
372
+ return suggestions[1].slice(0, 9);
373
+ } catch (err) {
374
+ console.error(err);
375
+ return [];
339
376
  }
377
+ };
378
+
379
+ window.chemical.createDataURL = async function (url) {
380
+ return new Promise(async (resolve, reject) => {
381
+ try {
382
+ const response = await window.chemical.fetch(url);
383
+ const blob = await response.blob();
384
+ const reader = new FileReader();
385
+
386
+ reader.onloadend = function () {
387
+ resolve(reader.result);
388
+ };
389
+
390
+ reader.readAsDataURL(blob);
391
+ } catch {
392
+ resolve(undefined);
393
+ }
394
+ });
395
+ };
340
396
  }
341
397
 
342
398
  await loadScript("/baremux/index.js");
343
399
  if (uvEnabled) {
344
- await loadScript("/uv/uv.bundle.js");
345
- await loadScript("/uv/uv.config.js");
400
+ await loadScript("/uv/uv.bundle.js");
401
+ await loadScript("/uv/uv.config.js");
346
402
  }
347
403
  if (scramjetEnabled) {
348
- await loadScript("/scramjet/scramjet.codecs.js");
349
- await loadScript("/scramjet/scramjet.config.js");
404
+ await loadScript("/scramjet/scramjet.codecs.js");
405
+ await loadScript("/scramjet/scramjet.config.js");
406
+ }
407
+ if (meteorEnabled) {
408
+ await loadScript("/meteor/meteor.codecs.js");
409
+ await loadScript("/meteor/meteor.config.js");
350
410
  }
351
- window.chemical.connection = new window.BareMux.BareMuxConnection("/baremux/worker.js");
411
+ window.chemical.connection = new window.BareMux.BareMuxConnection(
412
+ "/baremux/worker.js"
413
+ );
352
414
  await window.chemical.setTransport();
353
415
  setupFetch();
354
416
  await registerSW();