Skip to content

Commit c514629

Browse files
author
web3blind
committed
Use archive events for arena challenges
1 parent ff68f19 commit c514629

5 files changed

Lines changed: 103 additions & 11 deletions

File tree

app/index.html

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,11 @@
111111
<script src="lib/viz.min.js"></script>
112112

113113
<!-- Config -->
114-
<script src="js/config.js?v=20260621a"></script>
114+
<script src="js/config.js?v=20260621b"></script>
115115

116116
<!-- I18n -->
117-
<script src="js/i18n/ru.js?v=20260621a"></script>
118-
<script src="js/i18n/en.js?v=20260621a"></script>
117+
<script src="js/i18n/ru.js?v=20260621b"></script>
118+
<script src="js/i18n/en.js?v=20260621b"></script>
119119

120120
<!-- Utilities -->
121121
<script src="js/utils/helpers.js"></script>
@@ -125,7 +125,7 @@
125125
<!-- Blockchain layer -->
126126
<script src="js/blockchain/connection.js"></script>
127127
<script src="js/blockchain/account.js"></script>
128-
<script src="js/blockchain/history-source.js?v=20260621a"></script>
128+
<script src="js/blockchain/history-source.js?v=20260621b"></script>
129129
<script src="js/blockchain/broadcast.js"></script>
130130
<script src="js/blockchain/invite.js"></script>
131131

@@ -152,7 +152,7 @@
152152
<script src="js/engine/duel.js"></script>
153153
<script src="js/engine/duel-state.js"></script>
154154
<script src="js/engine/validator.js"></script>
155-
<script src="js/engine/guild.js?v=20260621a"></script>
155+
<script src="js/engine/guild.js?v=20260621b"></script>
156156
<script src="js/engine/territory.js"></script>
157157
<script src="js/engine/crafting.js"></script>
158158
<script src="js/engine/enchanting.js"></script>
@@ -186,8 +186,8 @@
186186
<script src="js/ui/screens/inventory.js"></script>
187187
<script src="js/ui/screens/chronicle.js"></script>
188188
<script src="js/ui/screens/duel.js"></script>
189-
<script src="js/ui/screens/arena.js"></script>
190-
<script src="js/ui/screens/guild.js?v=20260621a"></script>
189+
<script src="js/ui/screens/arena.js?v=20260621b"></script>
190+
<script src="js/ui/screens/guild.js?v=20260621b"></script>
191191
<script src="js/ui/screens/map.js"></script>
192192
<script src="js/ui/screens/marketplace.js"></script>
193193
<script src="js/ui/screens/crafting.js"></script>

app/js/blockchain/history-source.js

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,22 @@ var HistorySource = (function() {
5454
return pattern;
5555
}
5656

57+
function _rangeUrl(mirror, options) {
58+
var pattern = mirror.rangeUrl || '';
59+
if (!pattern && mirror.apiBase) {
60+
pattern = String(mirror.apiBase).replace(/\/$/, '') + '/v1/range';
61+
}
62+
if (!pattern) return '';
63+
options = options || {};
64+
var params = [];
65+
if (options.protocol) params.push('protocol=' + encodeURIComponent(String(options.protocol)));
66+
if (options.start || options.from) params.push('start=' + encodeURIComponent(String(options.start || options.from)));
67+
if (options.end || options.to) params.push('end=' + encodeURIComponent(String(options.end || options.to)));
68+
if (options.limit) params.push('limit=' + encodeURIComponent(String(options.limit)));
69+
if (!params.length) return pattern;
70+
return pattern + (pattern.indexOf('?') === -1 ? '?' : '&') + params.join('&');
71+
}
72+
5773
function _eventsPayloadToThinBlock(payload) {
5874
if (!payload || !payload.events) return null;
5975
var events = payload.events || [];
@@ -274,11 +290,38 @@ var HistorySource = (function() {
274290
next(0);
275291
}
276292

293+
function getEventsRange(options, callback) {
294+
callback = callback || function() {};
295+
options = options || {};
296+
var mirrors = _archiveMirrors();
297+
function next(index) {
298+
if (!mirrors.length || index >= mirrors.length) {
299+
callback(_makeError('Event range unavailable from archive mirrors'));
300+
return;
301+
}
302+
var mirror = _normalizeMirror(mirrors[index]);
303+
var url = _rangeUrl(mirror, options);
304+
if (!url) {
305+
next(index + 1);
306+
return;
307+
}
308+
_requestJson(url, mirror.timeoutMs || 6000, function(err, payload) {
309+
if (!err && payload && payload.events) {
310+
callback(null, payload.events, payload);
311+
return;
312+
}
313+
next(index + 1);
314+
});
315+
}
316+
next(0);
317+
}
318+
277319
return {
278320
getBlock: getBlock,
279321
getAccountProtocol: getAccountProtocol,
280322
getAccountActions: getAccountActions,
281323
getCapabilities: getCapabilities,
282-
getGuildDirectory: getGuildDirectory
324+
getGuildDirectory: getGuildDirectory,
325+
getEventsRange: getEventsRange
283326
};
284327
})();

app/js/ui/screens/arena.js

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,13 +133,60 @@ var ArenaScreen = (function() {
133133
if (found) return; // Already have pending challenges loaded
134134
}
135135

136-
// Fetch recent blocks to look for challenges targeting this user
136+
// Fetch recent blocks to look for challenges targeting this user.
137+
// Prefer Archive Mirror range events so the Arena does not have to make
138+
// thousands of live getBlock() calls and so thin indexed events work in
139+
// browsers with different VIZ RPC retention/latency.
137140
viz.api.getDynamicGlobalProperties(function(err, dgp) {
138141
if (err || !dgp) return;
139142
var headBlock = dgp.head_block_number;
140143
// Scan last 2400 blocks (~2 hours) so challenges aren't missed
141144
var startBlock = Math.max(1, headBlock - 2400);
142-
_scanBlocksForChallenges(startBlock, headBlock, user, el);
145+
_scanArchiveForChallenges(startBlock, headBlock, user, el, function(found) {
146+
if (found) return;
147+
_scanBlocksForChallenges(startBlock, headBlock, user, el);
148+
});
149+
});
150+
}
151+
152+
function _scanArchiveForChallenges(startBlock, endBlock, user, el, done) {
153+
done = done || function() {};
154+
if (typeof HistorySource === 'undefined' || !HistorySource.getEventsRange) {
155+
done(false);
156+
return;
157+
}
158+
HistorySource.getEventsRange({
159+
protocol: VizMagicConfig.PROTOCOLS.VM,
160+
start: startBlock,
161+
end: endBlock,
162+
limit: 1000
163+
}, function(err, events) {
164+
if (err || !events || !events.length) {
165+
done(false);
166+
return;
167+
}
168+
var pendingChallenges = [];
169+
for (var i = 0; i < events.length; i++) {
170+
var ev = events[i] || {};
171+
if (ev.type !== VizMagicConfig.ACTION_TYPES.CHALLENGE) continue;
172+
var payload = ev.payload || {};
173+
var data = payload.d || ev.data || {};
174+
if (!data || data.target !== user) continue;
175+
var challenger = ev.sender || ev.account || '';
176+
if (!challenger && ev.accounts && ev.accounts.length) challenger = ev.accounts[0];
177+
pendingChallenges.push({
178+
challenger: challenger,
179+
blockNum: ev.blockNum || ev.block_num || 0,
180+
data: data,
181+
strategyHash: data.strategy_hash
182+
});
183+
}
184+
if (pendingChallenges.length > 0) {
185+
_showIncomingChallenges(pendingChallenges, el, user);
186+
done(true);
187+
return;
188+
}
189+
done(false);
143190
});
144191
}
145192

app/sw.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// Viz Magic — Service Worker
2-
var CACHE_NAME = 'viz-magic-v13';
2+
var CACHE_NAME = 'viz-magic-v14';
33
var ASSETS = [
44
'/',
55
'/index.html',

tests/history-source-regressions.test.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ test('history source wraps VIZ block/account access', function () {
5050
assert.ok(/XMLHttpRequest/.test(historySourceJs), 'mirror fallback should use browser-safe XHR');
5151
assert.ok(/function getAccountProtocol\(account, protocol, callback\)/.test(historySourceJs), 'account protocol API missing');
5252
assert.ok(/getCapabilities/.test(historySourceJs), 'capabilities API missing');
53+
assert.ok(/function getEventsRange\(options, callback\)/.test(historySourceJs), 'archive event range API missing');
54+
assert.ok(/\/v1\/range/.test(historySourceJs), 'event range API should call archive range endpoint');
5355
});
5456

5557
test('archive mirror config is explicit and points at production nginx path', function () {

0 commit comments

Comments
 (0)