Skip to content

Commit 1be5503

Browse files
committed
music
1 parent 9623d3c commit 1be5503

File tree

3 files changed

+124
-43
lines changed

3 files changed

+124
-43
lines changed

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
"nostr-fetch": "^0.15.0",
1818
"nostr-tools": "2.1.5",
1919
"svelte": "^4.2.8",
20-
"svelte-sound": "^0.6.0"
20+
"tone": "^14.7.77"
2121
},
2222
"devDependencies": {
2323
"@sveltejs/vite-plugin-svelte": "^3.0.1",

src/App.svelte

+81-42
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,21 @@
11
<script>
22
document.title = "nostrpul.se";
33
4-
// import "websocket-polyfill";
5-
64
import { onMount, afterUpdate, tick } from "svelte";
75
import { fade } from "svelte/transition";
86
import { writable } from "svelte/store";
97
108
import Modal from "./Modal.svelte";
119
12-
import { NostrFetcher } from "nostr-fetch"
10+
import * as Tone from "tone";
11+
import ToneGenerator from "./tone";
12+
13+
import { NostrFetcher } from "nostr-fetch";
1314
import { Relay } from "nostr-tools";
14-
// import { simplePoolAdapter } from "@nostr-fetch/adapter-nostr-tools";
1515
1616
import Masonry from "masonry-layout";
1717
18-
import { Sound } from "svelte-sound";
19-
import tone_file from "./assets/tone.mp3";
20-
21-
const tone = new Sound(tone_file);
22-
18+
let toneGenerator;
2319
2420
import { generateBackground } from "./utils";
2521
@@ -37,13 +33,17 @@
3733
const loading30166 = writable(false);
3834
const event30166 = writable(null);
3935
let activeTab = writable(0); // Currently selected tab index
40-
let focusRelay = writable(null)
36+
let focusRelay = writable(null);
4137
4238
let loading = true;
4339
let masonry;
4440
let initialSyncComplete = false;
4541
let since = Math.round(Date.now() / 1000) - 60 * 60 * 1.1;
4642
43+
const newEvents = [];
44+
45+
let eventRunner
46+
4747
$: if ($activeTab) {
4848
event30166.set(null);
4949
const ev = get30166($focusRelay)
@@ -57,9 +57,9 @@
5757
// let currentRelayModal = null;
5858
5959
function hideModals() {
60-
activeTab.set(0)
61-
focusRelay.set(null)
62-
event30166.set(null)
60+
activeTab.set(0);
61+
focusRelay.set(null);
62+
event30166.set(null);
6363
hideGenericModal();
6464
hideRelayModal();
6565
}
@@ -73,7 +73,7 @@
7373
}
7474
7575
function showRelayModal(ev) {
76-
focusRelay.set(getUrlFromEvent(ev))
76+
focusRelay.set(getUrlFromEvent(ev));
7777
currentRelayModal = ev.id;
7878
}
7979
@@ -93,25 +93,40 @@
9393
};
9494
}
9595
96-
const on_event_handler = (event) => {
97-
if (initialSyncComplete && event.created_at < since) return;
98-
const processedEvent = processEvent(event);
99-
since = event.created_at;
96+
const updateEvents = (processedEvent) => {
10097
if (processedEvent) {
10198
k30066.update((currentk30066) => {
10299
return [processedEvent, ...currentk30066].filter(
103100
(v, i, a) => a.findIndex((t) => t.dTag === v.dTag) === i,
104101
);
105102
});
106103
}
107-
if (!initialSyncComplete) return;
104+
};
105+
106+
const queueEvent = (event) => {
107+
newEvents.push(event);
108+
};
109+
110+
const populateNextEvent = () => {
111+
if(!newEvents.length) return
112+
const event = newEvents.shift()
113+
updateEvents(event);
108114
processBatch();
109-
if(!isMuted) tone.play()
110-
// console.log(event.id)
115+
if (!isMuted) toneGenerator.playNextNote();
116+
};
117+
118+
const on_event_handler = (event) => {
119+
if (initialSyncComplete && event.created_at < since) return;
120+
const processedEvent = processEvent(event);
121+
since = event.created_at;
122+
if (!initialSyncComplete)
123+
updateEvents(processedEvent);
124+
else
125+
queueEvent(processedEvent);
111126
};
112127
113128
async function initialSync() {
114-
const fetcher = NostrFetcher.init()
129+
const fetcher = NostrFetcher.init();
115130
const iter = fetcher.allEventsIterator(
116131
["wss://history.nostr.watch"],
117132
{
@@ -130,7 +145,9 @@
130145
}
131146
132147
const continuousSync = async () => {
133-
RelaySocket = await Relay.connect("wss://history.nostr.watch").catch(continuousSync);
148+
RelaySocket = await Relay.connect("wss://history.nostr.watch").catch(
149+
continuousSync,
150+
);
134151
RelaySocket.subscribe(
135152
[
136153
{
@@ -159,15 +176,15 @@
159176
};
160177
161178
async function get30166(relay) {
162-
console.log(`getting 30166 for ${relay.url}`)
179+
console.log(`getting 30166 for ${relay.url}`);
163180
return new Promise(async (resolve) => {
164181
RelaySocket = await Relay.connect("wss://history.nostr.watch").catch(
165182
console.error,
166183
);
167184
RelaySocket.subscribe(
168185
[
169186
{
170-
"#d": [relay],
187+
"#d": [relay],
171188
limit: 1,
172189
kinds: [30166],
173190
authors: [MONITOR],
@@ -219,13 +236,13 @@
219236
return ev;
220237
}
221238
222-
function getUrlFromEvent(event){
239+
function getUrlFromEvent(event) {
223240
return event.tags.filter((tag) => tag[0] == "d")?.[0]?.[1];
224241
}
225242
226243
function parse30066(event) {
227244
const parsedTags = {};
228-
const url = getUrlFromEvent(event)
245+
const url = getUrlFromEvent(event);
229246
if (!url) return { error: "no d tag?" };
230247
const tags = event.tags.filter((tag) => tag.length >= 3);
231248
tags.forEach((tag) => {
@@ -288,17 +305,17 @@
288305
289306
onMount(async () => {
290307
await initialSync();
308+
eventRunner = setInterval( populateNextEvent, 500 )
291309
await continuousSync();
292-
293310
return () => {
311+
clearInterval(eventRunner)
294312
RelaySocket.close();
295313
};
296314
});
297315
298316
function processBatch() {
299317
if (!initialSyncComplete) initialSyncComplete = true;
300318
k30066.update((currentk30066) => [...currentk30066]);
301-
302319
}
303320
304321
function calculateDimensions(event) {
@@ -377,9 +394,12 @@
377394
let isMuted = true; // Initial state of the sound, assuming it starts muted
378395
379396
// Function to toggle the muted state
380-
function toggleMute() {
397+
async function toggleMute() {
381398
isMuted = !isMuted;
382-
// Here, you can also add logic to actually control the audio
399+
if (isMuted) return;
400+
if (Tone.context.state !== "running") await Tone.start();
401+
else Tone.Transport.cancel();
402+
if (!toneGenerator) toneGenerator = new ToneGenerator();
383403
}
384404
385405
window.addEventListener("resize", () => {
@@ -390,8 +410,13 @@
390410
</script>
391411
392412
{#if initialSyncComplete}
393-
<button on:click={toggleMute} class="mute">
394-
{isMuted ? '🔇' : '🔈'}
413+
<button
414+
on:click={() => {
415+
toggleMute();
416+
}}
417+
class="mute"
418+
>
419+
{isMuted ? "🔇" : "🔈"}
395420
</button>
396421
<div id="header">
397422
<span class="sitetitle">nostrpul.se</span>
@@ -442,7 +467,9 @@
442467
on:click={() => showRelayModal(ev)}
443468
role="button"
444469
tabindex="0"
445-
on:keydown={(event) => { event.key === "Enter" && showRelayModal(ev) } }
470+
on:keydown={(event) => {
471+
event.key === "Enter" && showRelayModal(ev);
472+
}}
446473
>
447474
<span class="rtt">{rttDisplay("open", ev)}</span>
448475
<span class="rtt">{rttDisplay("read", ev)}</span>
@@ -685,15 +712,27 @@
685712
}
686713
687714
.mute {
688-
display:inline;
689-
background:none;
690-
border:none;
691-
position:absolute;
692-
top:10px;
693-
left:50%;
715+
display: inline;
716+
background: none;
717+
border: none;
718+
position: absolute;
719+
top: 10px;
720+
left: 50%;
721+
transform: translateX(-50%);
722+
z-index: 100;
723+
font-size: 3em;
724+
}
725+
726+
.test {
727+
display: inline;
728+
background: none;
729+
border: none;
730+
position: absolute;
731+
top: 50px;
732+
left: 50%;
694733
transform: translateX(-50%);
695734
z-index: 100;
696-
font-size:3em;
735+
font-size: 3em;
697736
}
698737
699738
@media (max-width: 600px) {
@@ -754,7 +793,7 @@
754793
}
755794
756795
.mute {
757-
display:none;
796+
display: none;
758797
}
759798
}
760799
</style>

yarn.lock

+42
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,13 @@
1010
"@jridgewell/gen-mapping" "^0.3.0"
1111
"@jridgewell/trace-mapping" "^0.3.9"
1212

13+
"@babel/runtime@^7.23.9":
14+
version "7.23.9"
15+
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.9.tgz#47791a15e4603bb5f905bc0753801cf21d6345f7"
16+
integrity sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==
17+
dependencies:
18+
regenerator-runtime "^0.14.0"
19+
1320
"@esbuild/[email protected]":
1421
version "0.19.12"
1522
resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f"
@@ -335,6 +342,14 @@ aria-query@^5.3.0:
335342
dependencies:
336343
dequal "^2.0.3"
337344

345+
automation-events@^7.0.0:
346+
version "7.0.0"
347+
resolved "https://registry.yarnpkg.com/automation-events/-/automation-events-7.0.0.tgz#241ecfb2eac48a8e2ca1421bd60912665565213c"
348+
integrity sha512-z2aGVy+pPbg3E619qRucLx5ZZqVFbcHCIF1vjx/0B3uQih5mUtuCtWEET+aYbG8Au12ikA5LTAhgoQJvGi3aWg==
349+
dependencies:
350+
"@babel/runtime" "^7.23.9"
351+
tslib "^2.6.2"
352+
338353
axobject-query@^4.0.0:
339354
version "4.0.0"
340355
resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-4.0.0.tgz#04a4c90dce33cc5d606c76d6216e3b250ff70dab"
@@ -840,6 +855,11 @@ postcss@^8.4.32:
840855
picocolors "^1.0.0"
841856
source-map-js "^1.0.2"
842857

858+
regenerator-runtime@^0.14.0:
859+
version "0.14.1"
860+
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f"
861+
integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
862+
843863
robust-predicates@^3.0.2:
844864
version "3.0.2"
845865
resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.2.tgz#d5b28528c4824d20fc48df1928d41d9efa1ad771"
@@ -882,6 +902,15 @@ source-map-js@^1.0.1, source-map-js@^1.0.2:
882902
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
883903
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
884904

905+
standardized-audio-context@^25.1.8:
906+
version "25.3.64"
907+
resolved "https://registry.yarnpkg.com/standardized-audio-context/-/standardized-audio-context-25.3.64.tgz#bbbe9b31fef5537b0901c0f8a6ae4fd06bfc97c1"
908+
integrity sha512-yo4SvErg1MWIYsAJ+nX18gLTacffBQ0DaJWBqFI63jao9Ue2EOriad4FKM3xQlWc85NPHMm4pJ2XnvdTAN05iw==
909+
dependencies:
910+
"@babel/runtime" "^7.23.9"
911+
automation-events "^7.0.0"
912+
tslib "^2.6.2"
913+
885914
svelte-hmr@^0.15.3:
886915
version "0.15.3"
887916
resolved "https://registry.yarnpkg.com/svelte-hmr/-/svelte-hmr-0.15.3.tgz#df54ccde9be3f091bf5f18fc4ef7b8eb6405fbe6"
@@ -914,6 +943,19 @@ svelte@^4.2.8:
914943
magic-string "^0.30.4"
915944
periscopic "^3.1.0"
916945

946+
tone@^14.7.77:
947+
version "14.7.77"
948+
resolved "https://registry.yarnpkg.com/tone/-/tone-14.7.77.tgz#12a2a9f033952ccdb552275a6384ca5d36d4b5ed"
949+
integrity sha512-tCfK73IkLHyzoKUvGq47gyDyxiKLFvKiVCOobynGgBB9Dl0NkxTM2p+eRJXyCYrjJwy9Y0XCMqD3uOYsYt2Fdg==
950+
dependencies:
951+
standardized-audio-context "^25.1.8"
952+
tslib "^2.0.1"
953+
954+
tslib@^2.0.1, tslib@^2.6.2:
955+
version "2.6.2"
956+
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae"
957+
integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==
958+
917959
vite@^5.0.8:
918960
version "5.0.12"
919961
resolved "https://registry.yarnpkg.com/vite/-/vite-5.0.12.tgz#8a2ffd4da36c132aec4adafe05d7adde38333c47"

0 commit comments

Comments
 (0)