convert client over to the new REST API

This commit is contained in:
Jesse D. McDonald 2020-04-27 20:49:31 -05:00
parent 0512501993
commit a598e287df
6 changed files with 395 additions and 508 deletions

View File

@ -361,10 +361,6 @@ button:disabled .silhouette {
z-index: 1; z-index: 1;
} }
#cb_peers {
color: #cccccc;
}
.badges { .badges {
position: fixed; position: fixed;
bottom: 12px; bottom: 12px;

View File

@ -242,7 +242,6 @@
and the joined piece from the capturing side moves to a new location from its original position as with any other capture.</p> and the joined piece from the capturing side moves to a new location from its original position as with any other capture.</p>
<p>Pawns are promoted when they reach the final row on the opposite side of the board, even if they were moved there by the other player as part of a joined pair.</p> <p>Pawns are promoted when they reach the final row on the opposite side of the board, even if they were moved there by the other player as part of a joined pair.</p>
</details> </details>
<p id="cb_peers"></p>
</div> </div>
</div> </div>
</div> </div>

310
js/pacosako_io.js Normal file
View File

@ -0,0 +1,310 @@
'use strict';
const API_BASE = `https://jessemcdonald.info/pacosako/api`;
const SHORT_TIMEOUT = 5000/*ms*/;
const LONG_TIMEOUT = 90000/*ms*/;
const RETRIES = 3;
const RETRY_DELAY = 1000/*ms*/;
const games = {};
const meta = {
games: {},
lastModified: 0,
listeners: {},
nextId: 1,
currentRequest: null,
};
/* One-time request, no caching or polling */
function getGameState(gameId, retries) {
if (arguments.length < 2) {
retries = RETRIES;
}
return new Promise((resolve, reject) => {
$.ajax({
dataType: 'json',
contentType: 'application/json',
url: `${API_BASE}/game/${gameId}`,
cache: false,
timeout: SHORT_TIMEOUT,
}).done((data, textStatus, jqXHR) => {
resolve(data);
}).fail((jqXHR, textStatus, errorThrown) => {
if ((!jqXHR.status || jqXHR.status < 400 || jqXHR.status > 499) && retries > 0) {
setTimeout(() => {
getGameState(gameId, retries - 1).then(resolve, reject);
}, RETRY_DELAY);
} else {
reject({ status: jqXHR.status, textStatus, errorThrown });
}
});
});
}
/* One-time request, no caching or polling */
function getGameMeta(gameId, retries) {
if (arguments.length < 2) {
retries = RETRIES;
}
return new Promise((resolve, reject) => {
$.ajax({
dataType: 'json',
contentType: 'application/json',
url: `${API_BASE}/meta/${gameId}`,
cache: false,
timeout: SHORT_TIMEOUT,
}).done((data, textStatus, jqXHR) => {
resolve(data);
}).fail((jqXHR, textStatus, errorThrown) => {
if ((!jqXHR.status || jqXHR.status < 400 || jqXHR.status > 499) && retries > 0) {
setTimeout(() => {
getGameState(gameId, retries - 1).then(resolve, reject);
}, RETRY_DELAY);
} else {
reject({ status: jqXHR.status, textStatus, errorThrown });
}
});
});
}
function onGameUpdate(gameId, callback) {
const game = gamePollState(gameId);
if (Object.keys(game.listeners).length === 0) {
startGamePoll(gameId, game.data.modified);
}
const cbId = game.nextId;
game.nextId += 1;
game.listeners[cbId] = callback;
/* delay the initial run of the callback to the microtask queue */
(Promise.resolve()).then(() => {
if (cbId in game.listeners) {
try {
callback(game.data, gameId);
} catch(err) {
console.error('uncaught exception in callback', err);
}
}
});
return function clearGameUpdate(keepPolling) {
if (cbId in game.listeners) {
delete game.listeners[cbId];
if (!keepPolling && Object.keys(game.listeners).length === 0) {
stopGamePoll(gameId);
}
}
}
}
function onMetaUpdate(callback) {
if (Object.keys(meta.listeners).length === 0) {
startMetaPoll(meta.lastModified);
}
const cbId = meta.nextId;
meta.nextId += 1;
meta.listeners[cbId] = callback;
/* delay the initial run of the callback to the microtask queue */
(Promise.resolve()).then(() => {
if (cbId in meta.listeners) {
for (const gameId in meta.games) {
try {
callback(meta.games[gameId], gameId);
} catch(err) {
console.error('uncaught exception in callback', err);
}
}
}
});
return function clearMetaUpdate(keepPolling) {
if (cbId in meta.listeners) {
delete meta.listeners[cbId];
if (!keepPolling && Object.keys(meta.listeners).length === 0) {
stopMetaPoll();
}
}
}
}
function sendUpdate(gameId, data, retries) {
if (arguments.length < 3) {
retries = RETRIES;
}
return new Promise((resolve, reject) => {
$.ajax({
dataType: 'json',
contentType: 'application/json',
url: `${API_BASE}/game/${gameId}`,
method: 'POST',
cache: false,
data: JSON.stringify(data),
timeout: SHORT_TIMEOUT,
}).done((responseData, textStatus, jqXHR) => {
resolve({ status: jqXHR.status, data: responseData });
}).fail((jqXHR, textStatus, errorThrown) => {
if ((!jqXHR.status || jqXHR.status < 400 || jqXHR.status > 499) && retries > 0) {
setTimeout(() => {
getGameState(gameId, retries - 1).then(resolve, reject);
}, RETRY_DELAY);
} else {
reject({ status: jqXHR.status, textStatus, errorThrown });
}
});
});
}
function gamePollState(gameId) {
if (gameId in games === false) {
games[gameId] = {
currentRequest: null,
data: { gameId, modified: 0 },
listeners: [],
nextId: 1,
};
}
return games[gameId];
}
function processGame(gameId, data) {
const game = gamePollState(gameId);
if (data && data.modified > game.data.modified) {
game.data = data;
for (const cbId in game.listeners) {
try {
game.listeners[cbId](data, gameId);
} catch(err) {
console.error('uncaught exception in callback', err);
}
}
}
}
function startGamePoll(gameId, afterTime) {
const game = gamePollState(gameId);
if (game.currentRequest === null) {
if (afterTime === undefined) {
afterTime = game.data.modified;
}
const thisRequest = game.currentRequest = $.ajax({
dataType: 'json',
contentType: 'application/json',
url: `${API_BASE}/game/${gameId}/poll/${afterTime}`,
cache: false,
timeout: LONG_TIMEOUT,
}).done((data, textStatus, jqXHR) => {
if (game.currentRequest === thisRequest) {
game.currentRequest = null;
if (jqXHR.status == 204) {
startGamePoll(gameId, afterTime);
} else {
processGame(gameId, data);
startGamePoll(gameId, data.modified);
}
}
}).fail((jqXHR, textStatus, errorThrown) => {
if (game.currentRequest === thisRequest) {
setTimeout(() => {
if (game.currentRequest === thisRequest) {
game.currentRequest = null;
startGamePoll(gameId, 0);
}
}, RETRY_DELAY);
}
});
}
}
function stopGamePoll(gameId) {
if (gameId in games === false) {
return;
}
const game = games[gameId];
const request = game.currentRequest;
if (request !== null) {
game.currentRequest = null;
request.abort();
}
}
function processMeta(data) {
meta.lastModified = data.modified;
for (const game of data.games) {
if (game.gameId in meta.games === false || game.modified > meta.games[game.gameId].modified) {
meta.games[game.gameId] = game;
for (const cbId in meta.listeners) {
try {
meta.listeners[cbId](game, game.gameId);
} catch(err) {
console.error('uncaught exception in callback', err);
}
}
}
}
}
function startMetaPoll(afterTime) {
if (meta.currentRequest === null) {
if (afterTime === undefined) {
afterTime = meta.lastModified;
}
const thisRequest = meta.currentRequest = $.ajax({
dataType: 'json',
contentType: 'application/json',
url: `https://jessemcdonald.info/pacosako/api/games/poll/${afterTime}`,
cache: false,
timeout: LONG_TIMEOUT,
}).done((data, textStatus, jqXHR) => {
if (meta.currentRequest === thisRequest) {
meta.currentRequest = null;
if (jqXHR.status == 204) {
startMetaPoll(afterTime);
} else {
processMeta(data);
startMetaPoll(data.modified);
}
}
}).fail((jqXHR, textStatus, errorThrown) => {
if (meta.currentRequest === thisRequest) {
setTimeout(() => {
if (meta.currentRequest === thisRequest) {
meta.currentRequest = null;
startMetaPoll(0);
}
}, RETRY_DELAY);
}
});
}
}
function stopMetaPoll() {
const request = meta.currentRequest;
if (request !== null) {
meta.currentRequest = null;
request.abort();
}
}
module.exports = {
getGameState,
getGameMeta,
onGameUpdate,
onMetaUpdate,
sendUpdate,
};
/* vim:set expandtab sw=3 ts=8: */

View File

@ -1,11 +1,7 @@
'use strict'; 'use strict';
import PS from './pacosako.js'; import PS from './pacosako.js';
import IO from './pacosako_io.js';
import Gun from 'gun';
import 'gun/nts';
import 'gun/sea';
import 'gun/lib/webrtc';
import deepEqual from 'deep-equal'; import deepEqual from 'deep-equal';
@ -16,75 +12,24 @@ import 'webpack-jquery-ui/css';
import escape from 'lodash/escape'; import escape from 'lodash/escape';
import jBox from 'jbox';
import 'jbox/dist/jBox.all.css';
/* "Waterdrop" by Porphyr (freesound.org/people/Porphyr) / CC BY 3.0 (creativecommons.org/licenses/by/3.0) */ /* "Waterdrop" by Porphyr (freesound.org/people/Porphyr) / CC BY 3.0 (creativecommons.org/licenses/by/3.0) */
import Waterdrop from '../wav/191678__porphyr__waterdrop.wav'; import Waterdrop from '../wav/191678__porphyr__waterdrop.wav';
$(function (){ $(function (){
/* workaround for persistent errors accumulating which break synchronization */
if ('localStorage' in window) {
window.localStorage.removeItem('gun/');
window.localStorage.removeItem('gap/gun/');
}
let gun = Gun({
peers: ['https://jessemcdonald.info/gun'],
});
gun.on('in', function(msg) {
const filter = window.logGunIn;
if (filter && ((typeof filter !== 'function') || filter(msg)))
{
console.log('in msg: ', msg);
}
});
gun.on('out', function(msg) {
const filter = window.logGunOut;
if (filter && ((typeof filter !== 'function') || filter(msg)))
{
console.log('out msg: ', msg);
}
});
function debug() { function debug() {
if (window.logDebug) { if (window.logDebug) {
console.log.apply(console, arguments); console.log.apply(console, arguments);
} }
} }
window.logGunIn = false;
window.logGunOut = false;
window.logDebug = false; window.logDebug = false;
let currentGame = new PS.Game(); let currentGame = new PS.Game();
let visibleGame = new PS.Game(currentGame); let visibleGame = new PS.Game(currentGame);
let cancelGameCallback = function() {}; let cancelGameCallback = function() {};
let cancelMetaCallback = function() {};
Gun.chain.onWithCancel = (function() {
function cancelCallback(data,key,msg,ev) {
if (ev && typeof ev.off === 'function') {
ev.off();
}
}
return function(tag, arg, eas, as) {
if (typeof tag === 'function') {
let callback = tag;
const cancelEv = function() {
callback = cancelCallback;
};
const wrapper = function() {
return callback.apply(this, arguments);
};
this.on(wrapper, arg, eas, as);
return cancelEv;
} else {
this.on(tag, arg, eas, as);
return null;
}
};
})();
function pieceTypeCode(type) { function pieceTypeCode(type) {
if (type === PS.KING) { if (type === PS.KING) {
@ -171,7 +116,7 @@ $(function (){
piece.appendTo('#cb_hidden'); piece.appendTo('#cb_hidden');
try { try {
const meta = { timestamp: new Date(Gun.state()).getTime() }; const meta = { timestamp: +new Date() };
currentGame.move(from, to, meta); currentGame.move(from, to, meta);
} catch (err) { } catch (err) {
debug('unable to move', err); debug('unable to move', err);
@ -488,11 +433,10 @@ $(function (){
const gameId = boardElem.data('gameId'); const gameId = boardElem.data('gameId');
const moves = { past: currentGame.moves, future: currentGame.redoMoves }; const moves = { past: currentGame.moves, future: currentGame.redoMoves };
boardElem.data('last_state', currentGame.moves); boardElem.data('last_state', currentGame.moves);
gun.get(PacoSakoUUID + '/game/' + gameId).get('board').put(JSON.stringify(moves)); putMeta({ board: moves });
putMeta();
} }
function putMeta(){ function putMeta(extra) {
const gameId = $('#cb_board').data('gameId'); const gameId = $('#cb_board').data('gameId');
const lightName = $('#cb_light_name').val(); const lightName = $('#cb_light_name').val();
const darkName = $('#cb_dark_name').val(); const darkName = $('#cb_dark_name').val();
@ -501,7 +445,7 @@ $(function (){
const lastMove = currentGame.lastMove || {}; const lastMove = currentGame.lastMove || {};
const lastMeta = lastMove.meta || {}; const lastMeta = lastMove.meta || {};
const status = const status =
(currentGame.status === PS.PLAYING) ? null : (currentGame.status === PS.PLAYING) ? '' :
(currentGame.status === PS.CHECKMATE) ? 'checkmate' : (currentGame.status === PS.CHECKMATE) ? 'checkmate' :
(currentGame.status === PS.RESIGNED) ? 'resigned' : (currentGame.status === PS.RESIGNED) ? 'resigned' :
'ended'; 'ended';
@ -510,17 +454,24 @@ $(function (){
lightName, lightName,
darkName, darkName,
moves: turns, moves: turns,
timestamp: lastMeta.timestamp || new Date(Gun.state()).getTime(), timestamp: lastMeta.timestamp || +new Date(),
status, status,
}; };
const metaRef = gun.get(PacoSakoUUID + '/meta/' + gameId).put(meta); if (extra) {
Object.assign(meta, extra);
if (lightName !== '' || darkName !== '' || turns !== 0) {
gun.get(PacoSakoUUID + '/meta').get(gameId).put(metaRef);
} else {
gun.get(PacoSakoUUID + '/meta').get(gameId).put(null);
} }
meta.modified = $('#cb_board').data('modified');
IO.sendUpdate(gameId, meta).catch((err) => {
new jBox('Notice', {
content: 'Failed to send update to server.',
});
debug('update error', err);
/* force a reset back to the latest server data */
switchGameId(gameId);
});
} }
function switchGameId(newId){ function switchGameId(newId){
@ -533,13 +484,13 @@ $(function (){
} }
cancelGameCallback(); cancelGameCallback();
cancelMetaCallback();
boardElem.data('gameId', newId); boardElem.data('gameId', newId);
boardElem.data('modified', 0);
location.hash = '#/' + newId; location.hash = '#/' + newId;
const notifyAfter = new Date().getTime() + 2000; const notifyAfter = +new Date() + 2000;
$(window).data('notifyAfter', new Date().getTime() + 2000); $(window).data('notifyAfter', +new Date() + 2000);
window.setTimeout(function() { window.setTimeout(function() {
/* Delete the notification block in case the system time is changed backward */ /* Delete the notification block in case the system time is changed backward */
if ($(window).data('notifyAfter') === notifyAfter) { if ($(window).data('notifyAfter') === notifyAfter) {
@ -556,18 +507,14 @@ $(function (){
$('#cb_light_name').val(''); $('#cb_light_name').val('');
$('#cb_dark_name').val(''); $('#cb_dark_name').val('');
cancelGameCallback = gun.get(PacoSakoUUID + '/game/' + newId).onWithCancel(function(d) { cancelGameCallback = IO.onGameUpdate(newId, function(data, gameId) {
if (d && d.board) { const board = data.board || { past: [], future: [] };
try { try {
const received = JSON.parse(d.board); const moves = { past: [...board.past], future: [...board.future] };
const moves = { past: [...received.past], future: [...received.future] };
const oldState = { past: currentGame.moves, future: currentGame.redoMoves }; const oldState = { past: currentGame.moves, future: currentGame.redoMoves };
if (deepEqual(moves, oldState)) { if (!deepEqual(moves, oldState)) {
/* we already have this */
return;
}
debug('got board', moves); debug('got board', moves);
const newGame = new PS.Game(); const newGame = new PS.Game();
@ -596,19 +543,18 @@ $(function (){
} }
setCurrentGame(newGame, newGame.moves.length > currentGame.moves.length); setCurrentGame(newGame, newGame.moves.length > currentGame.moves.length);
}
} catch (err) { } catch (err) {
debug('Error parsing board data', err); debug('Error parsing board data', err);
} }
}
});
cancelMetaCallback = gun.get(PacoSakoUUID + '/meta').get(newId).onWithCancel(function(d) { const d = data || {};
d = d || {};
debug('got meta', d);
$('#cb_board').data('lightName', shortenName(String(d.lightName || 'Light'))); $('#cb_board').data('lightName', shortenName(String(d.lightName || 'Light')));
$('#cb_board').data('darkName', shortenName(String(d.darkName || 'Dark'))); $('#cb_board').data('darkName', shortenName(String(d.darkName || 'Dark')));
$('#cb_light_name').val(String(d.lightName || '')); $('#cb_light_name').val(String(d.lightName || ''));
$('#cb_dark_name').val(String(d.darkName || '')); $('#cb_dark_name').val(String(d.darkName || ''));
$('#cb_board').data('modified', data.modified);
}); });
let selOpt = $('#cb_game_' + newId); let selOpt = $('#cb_game_' + newId);
@ -644,7 +590,7 @@ $(function (){
const notifyAudio = new Audio(Waterdrop); const notifyAudio = new Audio(Waterdrop);
function playNotifySound(){ function playNotifySound(){
const now = new Date().getTime(); const now = +new Date();
const then = $(window).data('notifyAfter'); const then = $(window).data('notifyAfter');
if (!then || now >= then) { if (!then || now >= then) {
try { notifyAudio.play(); } catch (err) {} try { notifyAudio.play(); } catch (err) {}
@ -652,7 +598,7 @@ $(function (){
} }
function notify(body) { function notify(body) {
const now = new Date().getTime(); const now = +new Date();
const then = $(window).data('notifyAfter'); const then = $(window).data('notifyAfter');
if (!then || now >= then) { if (!then || now >= then) {
try { try {
@ -824,7 +770,7 @@ $(function (){
$('#cb_resign').on('click', function(){ $('#cb_resign').on('click', function(){
try { try {
const meta = { timestamp: new Date(Gun.state()).getTime() }; const meta = { timestamp: +new Date() };
currentGame.resign(meta); currentGame.resign(meta);
} catch (err) { } catch (err) {
debug('unable to resign', err); debug('unable to resign', err);
@ -910,15 +856,24 @@ $(function (){
} }
}); });
let updateMeta = function() { putMeta(); } let idleTimeoutId = undefined;
$('#cb_light_name').on('input', updateMeta); $('#cb_light_name, #cb_dark_name').on('input', function() {
$('#cb_dark_name').on('input', updateMeta); if (idleTimeoutId !== undefined) {
clearTimeout(idleTimeoutId);
}
idleTimeoutId = setTimeout(function() { putMeta(); }, 500);
}).on('blur', function() {
if (idleTimeoutId !== undefined) {
clearTimeout(idleTimeoutId);
}
putMeta();
});
function updateTitle(opt){ function updateTitle(opt){
opt = $(opt); opt = $(opt);
const then = opt.data('then'); const then = opt.data('then');
const now = new Date(Gun.state()).getTime(); const now = +new Date();
let age_str = ''; let age_str = '';
if (then > now) { if (then > now) {
age_str = ' (future)'; age_str = ' (future)';
@ -971,7 +926,7 @@ $(function (){
opt.data('gameId', key); opt.data('gameId', key);
opt.data('title', lightName + ' vs. ' + darkName + moves + stat); opt.data('title', lightName + ' vs. ' + darkName + moves + stat);
opt.data('then', d.timestamp || new Date(Gun.state()).getTime()); opt.data('then', d.timestamp || +new Date());
opt.addClass('cb-game-option'); opt.addClass('cb-game-option');
opt.appendTo('#cb_select_game'); opt.appendTo('#cb_select_game');
updateTitle(opt); updateTitle(opt);
@ -997,45 +952,22 @@ $(function (){
} }
} }
let cancelAll = function(){}; let cancelMeta = null;
return function() { return function() {
cancelAll();
$('#cb_select_game .cb-game-option').remove(); $('#cb_select_game .cb-game-option').remove();
updateSelectMeta(null, $('#cb_board').data('gameId')); updateSelectMeta(null, $('#cb_board').data('gameId'));
const cancellers = {}; /* cancel and resubscribe to get all the cached data again */
let cancelMeta = gun.get(PacoSakoUUID + '/meta').onWithCancel(function(meta) { if (cancelMeta) {
for (const gameId in meta) { /* use of 'in' here is deliberate */ /* cancel, but don't stop polling the server */
/* 'gameId' may include extra GUN fields like '_' */ /* this is only a very brief interruption */
if (gameId.match(/^[0-9a-f]{16}$/)) { cancelMeta(true);
if (!Gun.obj.is(meta[gameId])) {
updateSelectMeta(null, gameId);
if (gameId in cancellers) {
cancellers[gameId]();
delete cancellers[gameId];
} }
} else if (!(gameId in cancellers)) {
cancellers[gameId] = gun.get(meta[gameId]).onWithCancel(function(d) { cancelMeta = IO.onMetaUpdate(function(data, gameId) {
updateSelectMeta(d, gameId); updateSelectMeta(data, gameId);
}); });
}
}
}
}, { change: true });
cancelAll = function() {
cancelMeta();
cancelMeta = function(){};
for (const gameId in cancellers) {
cancellers[gameId]();
delete cancellers[gameId];
}
cancelAll = function(){};
};
return cancelAll;
}; };
})(); })();
@ -1047,31 +979,6 @@ $(function (){
}); });
}, 15000); }, 15000);
window.setInterval(function(){
const peers = gun._.opt.peers;
let n_open = 0;
let n_total = 0;
for (const peerId in peers) {
++n_total;
try {
const peer = peers[peerId];
if (peer.constructor === RTCPeerConnection) {
if (peer.connectionState === 'connected') {
++n_open;
}
} else if (peer.wire && peer.wire.constructor === WebSocket) {
if (peer.wire.readyState === peer.wire.OPEN) {
++n_open;
}
}
} catch (err) {}
}
const newText = 'Synchronizing with ' + n_open + (n_open === 1 ? ' peer' : ' peers') + ' (' + n_total + ' total).';
if (newText !== $('#cb_peers').text()) {
$('#cb_peers').text(newText);
}
}, 1000);
window.onpopstate = function(event){ window.onpopstate = function(event){
const foundId = location.hash.match(/^#\/([0-9a-f]{16}\b)/); const foundId = location.hash.match(/^#\/([0-9a-f]{16}\b)/);
if (foundId) { if (foundId) {
@ -1091,32 +998,16 @@ $(function (){
/* Low-level commands to be run from the JS console */ /* Low-level commands to be run from the JS console */
window.Admin = { window.Admin = {
convertFromV2: function() {
gun.get(PacoSakoUUID).get('games').map().once(function(d,key){
if (d && d.board) {
debug('converting ' + key);
gun.get(PacoSakoUUID + '/game/' + key).get('board').put(d.board);
}
});
gun.get(PacoSakoUUID).get('meta').map().once(function(d,key){
if (d) {
debug('converting metadata for ' + key);
gun.get(PacoSakoUUID + '/meta').get(key).put(d);
}
});
},
getCurrentGame: function() { return currentGame; }, getCurrentGame: function() { return currentGame; },
getVisibleGame: function() { return visibleGame; }, getVisibleGame: function() { return visibleGame; },
setCurrentGame: setCurrentGame, setCurrentGame,
setVisibleGame: setVisibleGame, setVisibleGame,
refresh: function() { setCurrentGame(currentGame); }, refresh: function() { setCurrentGame(currentGame); },
renderBoard: renderBoard, renderBoard,
putState: putState, putState,
putMeta: putMeta, putMeta,
gun: gun, PacoSakoUUID,
PacoSakoUUID: PacoSakoUUID, IO,
}; };
/* /*

335
package-lock.json generated
View File

@ -1083,42 +1083,6 @@
"@hapi/hoek": "^8.3.0" "@hapi/hoek": "^8.3.0"
} }
}, },
"@peculiar/asn1-schema": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-1.0.5.tgz",
"integrity": "sha512-rzzorGYnQNmVHleLvC8gJSbbdNYtg+EB9s075dHvwpxs10teXHYnRmTWhCVuWjbSVSofwdm7IYPtMTWTbcNUWA==",
"dev": true,
"optional": true,
"requires": {
"asn1js": "^2.0.26",
"tslib": "^1.11.1"
}
},
"@peculiar/json-schema": {
"version": "1.1.10",
"resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.10.tgz",
"integrity": "sha512-kbpnG9CkF1y6wwGkW7YtSA+yYK4X5uk4rAwsd1hxiaYE3Hkw2EsGlbGh/COkMLyFf+Fe830BoFiMSB3QnC/ItA==",
"dev": true,
"optional": true,
"requires": {
"tslib": "^1.11.1"
}
},
"@peculiar/webcrypto": {
"version": "1.0.26",
"resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.0.26.tgz",
"integrity": "sha512-7Ws4t+eUiLPSL9q8OCcbevd9S8qjqBDAXJrbnjzbuWu3nI8NgBvc7qZ97DZO8y8qxEoh5cGqK2p+p+UhxLw9Kg==",
"dev": true,
"optional": true,
"requires": {
"@peculiar/asn1-schema": "^1.0.5",
"@peculiar/json-schema": "^1.1.10",
"asn1js": "^2.0.26",
"pvtsutils": "^1.0.10",
"tslib": "^1.11.1",
"webcrypto-core": "^1.0.18"
}
},
"@rollup/plugin-node-resolve": { "@rollup/plugin-node-resolve": {
"version": "7.1.3", "version": "7.1.3",
"resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz", "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz",
@ -1316,28 +1280,6 @@
"source-map": "^0.6.1" "source-map": "^0.6.1"
} }
}, },
"@unimodules/core": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/@unimodules/core/-/core-5.1.0.tgz",
"integrity": "sha512-gaamGkJ4PVwusWEfsZyPo4uhrVWPDE0BmHc/lTYfkZCv2oIAswC7gG/ULRdtZpYdwnYqFIZng+WQxwuVrJUNDw==",
"dev": true,
"optional": true,
"requires": {
"compare-versions": "^3.4.0"
}
},
"@unimodules/react-native-adapter": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/@unimodules/react-native-adapter/-/react-native-adapter-5.2.0.tgz",
"integrity": "sha512-S3HMEeQbV6xs7ORRcxXFGMk38DAnxqNcZG9T8JkX/KGY9ILUUqTS/e68+d849B6beEeglNMcOxyjwlqjykN+FA==",
"dev": true,
"optional": true,
"requires": {
"invariant": "^2.2.4",
"lodash": "^4.5.0",
"prop-types": "^15.6.1"
}
},
"@webassemblyjs/ast": { "@webassemblyjs/ast": {
"version": "1.9.0", "version": "1.9.0",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz",
@ -1531,13 +1473,6 @@
"integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==",
"dev": true "dev": true
}, },
"addressparser": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/addressparser/-/addressparser-0.3.2.tgz",
"integrity": "sha1-WYc/Nej89sc2HBAjkmHXbhU0i7I=",
"dev": true,
"optional": true
},
"ajv": { "ajv": {
"version": "6.12.0", "version": "6.12.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz",
@ -1661,13 +1596,6 @@
"integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
"dev": true "dev": true
}, },
"asmcrypto.js": {
"version": "0.22.0",
"resolved": "https://registry.npmjs.org/asmcrypto.js/-/asmcrypto.js-0.22.0.tgz",
"integrity": "sha512-usgMoyXjMbx/ZPdzTSXExhMPur2FTdz/Vo5PVx2gIaBcdAAJNOFlsdgqveM8Cff7W0v+xrf9BwjOV26JSAF9qA==",
"dev": true,
"optional": true
},
"asn1.js": { "asn1.js": {
"version": "4.10.1", "version": "4.10.1",
"resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
@ -1679,16 +1607,6 @@
"minimalistic-assert": "^1.0.0" "minimalistic-assert": "^1.0.0"
} }
}, },
"asn1js": {
"version": "2.0.26",
"resolved": "https://registry.npmjs.org/asn1js/-/asn1js-2.0.26.tgz",
"integrity": "sha512-yG89F0j9B4B0MKIcFyWWxnpZPLaNTjCj4tkE3fjbAoo0qmpGw0PYYqSbX/4ebnd9Icn8ZgK4K1fvDyEtW1JYtQ==",
"dev": true,
"optional": true,
"requires": {
"pvutils": "^1.0.17"
}
},
"assert": { "assert": {
"version": "1.5.0", "version": "1.5.0",
"resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
@ -1734,26 +1652,6 @@
"integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
"dev": true "dev": true
}, },
"b64-lite": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/b64-lite/-/b64-lite-1.4.0.tgz",
"integrity": "sha512-aHe97M7DXt+dkpa8fHlCcm1CnskAHrJqEfMI0KN7dwqlzml/aUe1AGt6lk51HzrSfVD67xOso84sOpr+0wIe2w==",
"dev": true,
"optional": true,
"requires": {
"base-64": "^0.1.0"
}
},
"b64u-lite": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/b64u-lite/-/b64u-lite-1.1.0.tgz",
"integrity": "sha512-929qWGDVCRph7gQVTC6koHqQIpF4vtVaSbwLltFQo44B1bYUquALswZdBKFfrJCPEnsCOvWkJsPdQYZ/Ukhw8A==",
"dev": true,
"optional": true,
"requires": {
"b64-lite": "^1.4.0"
}
},
"babel-code-frame": { "babel-code-frame": {
"version": "6.26.0", "version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
@ -2564,13 +2462,6 @@
} }
} }
}, },
"base-64": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/base-64/-/base-64-0.1.0.tgz",
"integrity": "sha1-eAqZyE59YAJgNhURxId2E78k9rs=",
"dev": true,
"optional": true
},
"base64-js": { "base64-js": {
"version": "1.3.1", "version": "1.3.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
@ -2751,16 +2642,6 @@
"integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==",
"dev": true "dev": true
}, },
"buffer": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.5.0.tgz",
"integrity": "sha512-9FTEDjLjwoAkEwyMGDjYJQN2gfRgOKBKRfiglhvibGbpeeU/pQn1bJxQqm32OD/AIeEuHxU9roxXxg34Byp/Ww==",
"dev": true,
"requires": {
"base64-js": "^1.0.2",
"ieee754": "^1.1.4"
}
},
"buffer-from": { "buffer-from": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
@ -2773,16 +2654,6 @@
"integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
"dev": true "dev": true
}, },
"bufferutil": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.1.tgz",
"integrity": "sha512-xowrxvpxojqkagPcWRQVXZl0YXhRhAtBEIq3VoER1NH5Mw1n1o0ojdspp+GS2J//2gCVyrzQDApQ4unGF+QOoA==",
"dev": true,
"optional": true,
"requires": {
"node-gyp-build": "~3.7.0"
}
},
"builtin-modules": { "builtin-modules": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz",
@ -3126,13 +2997,6 @@
"integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
"dev": true "dev": true
}, },
"compare-versions": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz",
"integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==",
"dev": true,
"optional": true
},
"component-emitter": { "component-emitter": {
"version": "1.3.0", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
@ -4029,36 +3893,6 @@
"minimalistic-crypto-utils": "^1.0.0" "minimalistic-crypto-utils": "^1.0.0"
} }
}, },
"emailjs": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/emailjs/-/emailjs-2.2.0.tgz",
"integrity": "sha1-ulsj5KSwpFEPZS6HOxVOlAe2ygM=",
"dev": true,
"optional": true,
"requires": {
"addressparser": "^0.3.2",
"emailjs-mime-codec": "^2.0.7"
}
},
"emailjs-base64": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/emailjs-base64/-/emailjs-base64-1.1.4.tgz",
"integrity": "sha512-4h0xp1jgVTnIQBHxSJWXWanNnmuc5o+k4aHEpcLXSToN8asjB5qbXAexs7+PEsUKcEyBteNYsSvXUndYT2CGGA==",
"dev": true,
"optional": true
},
"emailjs-mime-codec": {
"version": "2.0.9",
"resolved": "https://registry.npmjs.org/emailjs-mime-codec/-/emailjs-mime-codec-2.0.9.tgz",
"integrity": "sha512-7qJo4pFGcKlWh/kCeNjmcgj34YoJWY0ekZXEHYtluWg4MVBnXqGM4CRMtZQkfYwitOhUgaKN5EQktJddi/YIDQ==",
"dev": true,
"optional": true,
"requires": {
"emailjs-base64": "^1.1.4",
"ramda": "^0.26.1",
"text-encoding": "^0.7.0"
}
},
"emoji-regex": { "emoji-regex": {
"version": "7.0.3", "version": "7.0.3",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
@ -4281,16 +4115,6 @@
"homedir-polyfill": "^1.0.1" "homedir-polyfill": "^1.0.1"
} }
}, },
"expo-random": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/expo-random/-/expo-random-8.1.0.tgz",
"integrity": "sha512-9n2gg83Hpg3ErkKu+a3FFOGmaPIxaHn6RuzjW24xFckdfmnrAKtbs1aU1aAcmoL1kXPvDeufRSEV/3lW93u6ug==",
"dev": true,
"optional": true,
"requires": {
"base64-js": "^1.3.0"
}
},
"extend-shallow": { "extend-shallow": {
"version": "3.0.2", "version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
@ -5245,21 +5069,6 @@
"integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
"dev": true "dev": true
}, },
"gun": {
"version": "0.2020.301",
"resolved": "https://registry.npmjs.org/gun/-/gun-0.2020.301.tgz",
"integrity": "sha512-Jb5VNKgBt2my+XHB/K65gTOMbBICgglc4kVaMmQ/lD7ZyxLvwUSXissfcLHAwBxUWPU3P4GqTi+fQmsK068FQw==",
"dev": true,
"requires": {
"buffer": "^5.4.3",
"bufferutil": "^4.0.1",
"emailjs": "^2.2.0",
"isomorphic-webcrypto": "^2.3.2",
"text-encoding": "^0.7.0",
"utf-8-validate": "^5.0.2",
"ws": "^7.2.1"
}
},
"has": { "has": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
@ -5904,24 +5713,21 @@
"integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
"dev": true "dev": true
}, },
"isomorphic-webcrypto": { "jbox": {
"version": "2.3.6", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/isomorphic-webcrypto/-/isomorphic-webcrypto-2.3.6.tgz", "resolved": "https://registry.npmjs.org/jbox/-/jbox-1.2.0.tgz",
"integrity": "sha512-d1prB3b0UMWOao5DK3+O2Dr5ZJCakzB5Q+2kCWNkNuM9ln7VB8TSw2SwUjbnErzg7cgsYja+VPQaeBtXEojpew==", "integrity": "sha512-TCReU5oT+cQz8YFoSumFuJ1czrY4VXxgSg8WJ/1klxFtAs4wXDhBvvmltXFA9qJgQQUhd8CErwArHRP3R11j/A==",
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"@peculiar/webcrypto": "^1.0.22", "jquery": "^3.5.0"
"@unimodules/core": "*", },
"@unimodules/react-native-adapter": "*", "dependencies": {
"asmcrypto.js": "^0.22.0", "jquery": {
"b64-lite": "^1.3.1", "version": "3.5.0",
"b64u-lite": "^1.0.1", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.0.tgz",
"expo-random": "*", "integrity": "sha512-Xb7SVYMvygPxbFMpTFQiHh1J7HClEaThguL15N/Gg37Lri/qKyhRGZYzHRyLH8Stq3Aow0LsHO2O2ci86fCrNQ==",
"msrcrypto": "^1.5.6", "dev": true
"react-native-securerandom": "^0.1.1", }
"str2buf": "^1.3.0",
"webcrypto-shim": "^0.1.4"
} }
}, },
"jest-worker": { "jest-worker": {
@ -6396,13 +6202,6 @@
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
"dev": true "dev": true
}, },
"msrcrypto": {
"version": "1.5.8",
"resolved": "https://registry.npmjs.org/msrcrypto/-/msrcrypto-1.5.8.tgz",
"integrity": "sha512-ujZ0TRuozHKKm6eGbKHfXef7f+esIhEckmThVnz7RNyiOJd7a6MXj2JGBoL9cnPDW+JMG16MoTUh5X+XXjI66Q==",
"dev": true,
"optional": true
},
"nan": { "nan": {
"version": "2.14.0", "version": "2.14.0",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
@ -6451,13 +6250,6 @@
"tslib": "^1.10.0" "tslib": "^1.10.0"
} }
}, },
"node-gyp-build": {
"version": "3.7.0",
"resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.7.0.tgz",
"integrity": "sha512-L/Eg02Epx6Si2NXmedx+Okg+4UHqmaf3TNcxd50SF9NQGcJaON3AtU++kax69XV7YWz4tUspqZSAsVofhFKG2w==",
"dev": true,
"optional": true
},
"node-libs-browser": { "node-libs-browser": {
"version": "2.2.1", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz",
@ -8898,18 +8690,6 @@
"integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
"dev": true "dev": true
}, },
"prop-types": {
"version": "15.7.2",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz",
"integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==",
"dev": true,
"optional": true,
"requires": {
"loose-envify": "^1.4.0",
"object-assign": "^4.1.1",
"react-is": "^16.8.1"
}
},
"prr": { "prr": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
@ -8969,23 +8749,6 @@
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
"dev": true "dev": true
}, },
"pvtsutils": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.0.10.tgz",
"integrity": "sha512-8ZKQcxnZKTn+fpDh7wL4yKax5fdl3UJzT8Jv49djZpB/dzPxacyN1Sez90b6YLdOmvIr9vaySJ5gw4aUA1EdSw==",
"dev": true,
"optional": true,
"requires": {
"tslib": "^1.10.0"
}
},
"pvutils": {
"version": "1.0.17",
"resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.0.17.tgz",
"integrity": "sha512-wLHYUQxWaXVQvKnwIDWFVKDJku9XDCvyhhxoq8dc5MFdIlRenyPI9eSfEtcvgHgD7FlvCyGAlWgOzRnZD99GZQ==",
"dev": true,
"optional": true
},
"q": { "q": {
"version": "1.5.1", "version": "1.5.1",
"resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
@ -9014,13 +8777,6 @@
"integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
"dev": true "dev": true
}, },
"ramda": {
"version": "0.26.1",
"resolved": "https://registry.npmjs.org/ramda/-/ramda-0.26.1.tgz",
"integrity": "sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==",
"dev": true,
"optional": true
},
"randombytes": { "randombytes": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
@ -9040,23 +8796,6 @@
"safe-buffer": "^5.1.0" "safe-buffer": "^5.1.0"
} }
}, },
"react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
"dev": true,
"optional": true
},
"react-native-securerandom": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/react-native-securerandom/-/react-native-securerandom-0.1.1.tgz",
"integrity": "sha1-8TBiOkEsM4sK+t7bwgTFy7i/IHA=",
"dev": true,
"optional": true,
"requires": {
"base64-js": "*"
}
},
"readable-stream": { "readable-stream": {
"version": "2.3.7", "version": "2.3.7",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
@ -9752,13 +9491,6 @@
} }
} }
}, },
"str2buf": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/str2buf/-/str2buf-1.3.0.tgz",
"integrity": "sha512-xIBmHIUHYZDP4HyoXGHYNVmxlXLXDrtFHYT0eV6IOdEj3VO9ccaF1Ejl9Oq8iFjITllpT8FhaXb4KsNmw+3EuA==",
"dev": true,
"optional": true
},
"stream-browserify": { "stream-browserify": {
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
@ -10144,13 +9876,6 @@
} }
} }
}, },
"text-encoding": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.7.0.tgz",
"integrity": "sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA==",
"dev": true,
"optional": true
},
"through2": { "through2": {
"version": "2.0.5", "version": "2.0.5",
"resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
@ -10436,16 +10161,6 @@
"integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
"dev": true "dev": true
}, },
"utf-8-validate": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.2.tgz",
"integrity": "sha512-SwV++i2gTD5qh2XqaPzBnNX88N6HdyhQrNNRykvcS0QKvItV9u3vPEJr+X5Hhfb1JC0r0e1alL0iB09rY8+nmw==",
"dev": true,
"optional": true,
"requires": {
"node-gyp-build": "~3.7.0"
}
},
"util": { "util": {
"version": "0.11.1", "version": "0.11.1",
"resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
@ -10522,24 +10237,6 @@
"neo-async": "^2.5.0" "neo-async": "^2.5.0"
} }
}, },
"webcrypto-core": {
"version": "1.0.18",
"resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.0.18.tgz",
"integrity": "sha512-wHRMXYxtDUWsTXNyRdaYlbcbq1OJF9pQov5THqvn5OBvixpCjnjU2spvEscxqRY8bLlpHk2S7RtROIMyNoEyFg==",
"dev": true,
"optional": true,
"requires": {
"pvtsutils": "^1.0.10",
"tslib": "^1.11.1"
}
},
"webcrypto-shim": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/webcrypto-shim/-/webcrypto-shim-0.1.5.tgz",
"integrity": "sha512-mE+E00gulvbLjHaAwl0kph60oOLQRsKyivEFgV9DMM/3Y05F1vZvGq12hAcNzHRnYxyEOABBT/XMtwGSg5xA7A==",
"dev": true,
"optional": true
},
"webpack": { "webpack": {
"version": "4.42.1", "version": "4.42.1",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.1.tgz", "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.1.tgz",
@ -10964,12 +10661,6 @@
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true "dev": true
}, },
"ws": {
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz",
"integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==",
"dev": true
},
"xtend": { "xtend": {
"version": "4.0.2", "version": "4.0.2",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",

View File

@ -1,6 +1,6 @@
{ {
"name": "paco_sako", "name": "paco_sako",
"version": "0.2.0", "version": "0.3.0",
"description": "Online version of the Paco Ŝako chess variation", "description": "Online version of the Paco Ŝako chess variation",
"browser": "index.js", "browser": "index.js",
"scripts": { "scripts": {
@ -19,8 +19,8 @@
"copy-webpack-plugin": "^5.1.1", "copy-webpack-plugin": "^5.1.1",
"deep-equal": "git+https://jessemcdonald.info/gogs/nybble/node-deep-equal", "deep-equal": "git+https://jessemcdonald.info/gogs/nybble/node-deep-equal",
"extract-loader": "^5.0.1", "extract-loader": "^5.0.1",
"gun": "^0.2020.301",
"html-webpack-plugin": "^4.0.4", "html-webpack-plugin": "^4.0.4",
"jbox": "^1.2.0",
"jquery-ui-touch-punch": "^0.2.3", "jquery-ui-touch-punch": "^0.2.3",
"lodash": "^4.17.15", "lodash": "^4.17.15",
"mini-css-extract-plugin": "^0.9.0", "mini-css-extract-plugin": "^0.9.0",