Skip to content

Commit 4014b2b

Browse files
committed
Queue, history, tracks features and minor changes
1 parent ed7618c commit 4014b2b

File tree

34 files changed

+1067
-409
lines changed

34 files changed

+1067
-409
lines changed

Makefile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ EXT_NAME = syncify.js
99
APP_DIR = src\app
1010
APP_NAME = syncify
1111

12+
# Updating
13+
14+
update-wrangler:
15+
npm update wrangler --save-dev
16+
1217
# Apply Changes
1318

1419
apply:

package-lock.json

Lines changed: 48 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@
1414
"itty-router": "^5.0.18",
1515
"jsonwebtoken": "^9.0.2",
1616
"mustache": "^4.2.0",
17+
"superjson": "^2.2.2",
1718
"urlpattern-polyfill": "^10.0.0"
1819
},
1920
"devDependencies": {
2021
"@cloudflare/workers-types": "^4.20250430.0",
22+
"@types/mustache": "^4.2.5",
2123
"typescript": "^5.8.3",
2224
"wrangler": "^4.14.1"
2325
}

src/ext/syncify.js

Lines changed: 60 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const reconnectionAttempts = 3;
1+
const MAX_CONNECTIONS_ATTEMPTS = 3;
22
const Addresses = [
33
`http://127.0.0.1:8787`,
44
`https://syncify.giulioo.workers.dev`,
@@ -7,6 +7,8 @@ const Addresses = [
77
let customButton;
88
let syncify_observer;
99
let socket;
10+
let disconnectedByUser = false;
11+
let attempts = 0;
1012

1113
function createButton() {
1214
const controlBar = document.querySelector('.main-nowPlayingBar-extraControls');
@@ -45,8 +47,10 @@ function createButton() {
4547
customButton.addEventListener('click', () => {
4648
if (customButton.classList.contains('connected')) {
4749
showDialog("Disconnected", "Successfully disconnected from Syncify servers!")
50+
disconnectedByUser = true;
4851
disconnect();
4952
} else {
53+
disconnectedByUser = false;
5054
connect();
5155
}
5256
});
@@ -93,22 +97,37 @@ async function attemptConnection(url, user_data) {
9397
});
9498

9599
socket.send(data);
100+
console.log("Attempting to connect to Syncify server...")
96101
});
97102

98103
socket.addEventListener("message", (event) => {
99104
const data = JSON.parse(event.data);
100105

101-
if (data.status == 'success') {
106+
if (data.status == 'finalize') {
102107
window.open(`${url}/challenge?code=${data.id}`, '_blank');
108+
console.log("Syncify server connection successful and finalization needed.")
109+
resolve(socket);
110+
}
111+
else if (data.status == 'success') {
112+
console.log("Syncify server connection successful and finalization NOT needed.")
103113
resolve(socket);
104114
}
105115

106116
reject({'type' : 'connection-error', 'title' : "Syncify Server Connection Error", 'message' : event.reason, 'fatal' : true})
107117
});
108118

109119
socket.addEventListener("close", (event) => {
110-
console.log("disconnected");
111-
reject({'type' : 'connection-error', 'title' : "Syncify Server Connection Error", 'message' : event.reason, 'fatal' : false});
120+
disconnect();
121+
if (!disconnectedByUser && attempts < MAX_CONNECTIONS_ATTEMPTS) {
122+
showDialog("Connection Closed",`Socket closed: ${event.reason}, trying to establish a new connection...`);
123+
attempts += 1;
124+
resolve(attemptConnection(url, user_data));
125+
}
126+
else if (!disconnectedByUser) {
127+
showDialog("Connection Closed",`Socket closed: ${event.reason}, no more attempts left.`);
128+
reject({'type' : 'connection-error', 'title' : "Syncify Server Connection Error", 'message' : event.reason, 'fatal' : true});
129+
}
130+
// reject({'type' : 'connection-error', 'title' : "Syncify Server Connection Error", 'message' : event.reason, 'fatal' : true});
112131
});
113132
});
114133
};
@@ -128,17 +147,47 @@ async function findAvailableConnection() {
128147
throw new Error('Failed to connect to any selected Syncify Server. Try again later...');
129148
};
130149

150+
async function searchSong(socket, event, data) {
151+
console.log(data);
152+
console.log(`https://api.spotify.com/v1/search?q=${data.query}&type=track,album,playlist,show,episode,audiobook&market=${Spicetify.Platform.Session.locale}`);
153+
154+
const search_results = await Spicetify.CosmosAsync.get(`https://api.spotify.com/v1/search?q=${data.query}&type=track,album,playlist,show,episode,audiobook&limit=10&market=${Spicetify.Platform.Session.locale}`);
155+
156+
const response = {
157+
type : "search-results",
158+
results : search_results,
159+
roomid : data.roomid,
160+
userid : data.userid
161+
}
162+
163+
socket.send(JSON.stringify(response));
164+
}
165+
131166
async function connect() {
132-
showDialog("Alomost there!", `Just a moment while we try to connect you with Syncify Server...`);
167+
showDialog("Alomost there!", `Just a moment while we try to connect you with Syncify Servers...`);
133168
setButtonStatus(true);
134169
findAvailableConnection()
135-
.then((socket) => {
170+
.then(
171+
(socket) => {
172+
socket.addEventListener("message",async (event) => {
173+
const data = JSON.parse(event.data);
174+
switch (data.type) {
175+
case 'search-song':
176+
await searchSong(socket, event, data);
177+
break;
178+
}
179+
});
180+
136181
// We need to implement the logic to handle the connection here
137-
})
138-
.catch((error) => {
139-
showDialog('Syncify Error', error.message);
140-
disconnect();
141-
})
182+
},
183+
(reason) => {
184+
console.log(reason);
185+
if (reason.fatal) showDialog(reason.title, reason.message);
186+
})
187+
.catch((error) => {
188+
showDialog('Syncify Error', error.message);
189+
disconnect();
190+
})
142191
};
143192

144193
function disconnect() {

src/web/auth.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// @ts-ignore
2-
const jwt = require('jsonwebtoken');
2+
import jwt = require('jsonwebtoken');
33

4-
import Utils from './utils.js';
4+
import { parseCookies } from './utils.js';
55

66
const protectedRoutes = [
77
'/user',
@@ -19,7 +19,7 @@ export default {
1919
const url = new URL(request.url);
2020
if (!protectedRoutes.includes(url.pathname)) { return; }
2121

22-
const cookies = Utils.parseCookies(request.headers.get('cookie'));
22+
const cookies = parseCookies(request.headers.get('cookie'));
2323

2424
const user_token = cookies.get('user_access_token');
2525
const room_token = cookies.get('room_access_token');

0 commit comments

Comments
 (0)