Skip to content

Commit

Permalink
fix: bind fetch to window (again)
Browse files Browse the repository at this point in the history
Signed-off-by: Henry Gressmann <mail@henrygressmann.de>
  • Loading branch information
explodingcamera committed Aug 26, 2024
1 parent 7c9c3eb commit 59040d1
Show file tree
Hide file tree
Showing 6 changed files with 65 additions and 32 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Subsonic-API <a href="https://www.npmjs.com/package/subsonic-api"><img src="https://img.shields.io/npm/v/subsonic-api?style=flat&colorA=000000&colorB=efefef"/></a> <a href="https://github.com/explodingcamera/subsonic-api/actions/workflows/test.yml"><img src="https://img.shields.io/github/actions/workflow/status/explodingcamera/subsonic-api/test.yml?branch=main&style=flat&colorA=000000"/></a>

A simple API library for interacting with Subsonic/Opensubsonic-compatible servers written in TypeScript. Supports Node.js >= 18, bun >= 1 and modern Browsers. Less than 5kb minified and gzipped.
A simple API library for interacting with Subsonic/Opensubsonic-compatible servers written in TypeScript. Supports Node.js >= 18, bun >= 1 and modern Browsers. 3kb minified and gzipped.

## Installation

Expand Down
8 changes: 2 additions & 6 deletions biome.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,7 @@
"lineWidth": 110
},
"files": {
"ignore": [
"**/node_modules/*",
"**/dist/*",
"**/.turbo/*"
]
"ignore": ["**/node_modules/*", "**/dist/*", "src/md5.ts", "**/.turbo/*"]
},
"linter": {
"enabled": true,
Expand All @@ -27,4 +23,4 @@
}
}
}
}
}
1 change: 1 addition & 0 deletions examples/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ const api = new SubsonicAPI({
password: "demo",
username: "demo",
},
fetch,
});

const res = await api.ping();
Expand Down
25 changes: 4 additions & 21 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,22 +11,9 @@
"type": "git",
"url": "https://github.com/explodingcamera/subsonic-api.git"
},
"keywords": [
"subsonic",
"api",
"music",
"streaming",
"media",
"player",
"client",
"typescript"
],
"keywords": ["subsonic", "api", "music", "streaming", "media", "player", "client", "typescript"],
"homepage": "https://github.com/explodingcamera/subsonic-api",
"files": [
"lib",
"README.md",
"LICENSE.md"
],
"files": ["lib", "README.md", "LICENSE.md"],
"exports": {
".": "./lib/index.js"
},
Expand All @@ -42,11 +29,9 @@
},
"devDependencies": {
"@biomejs/biome": "^1.8.3",
"@types/spark-md5": "^3.0.4",
"bun-types": "^1.1.26",
"esbuild": "^0.23.1",
"release-it": "^17.6.0",
"spark-md5": "^3.0.2"
"release-it": "^17.6.0"
},
"release-it": {
"git": {
Expand All @@ -60,7 +45,5 @@
"node": ">=18"
},
"engineStrict": false,
"trustedDependencies": [
"@biomejs/biome"
]
"trustedDependencies": ["@biomejs/biome"]
}
16 changes: 12 additions & 4 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import md5 from "spark-md5";
import { arrayBufferToBase64 } from "./utils.js";
import { md5 } from "./md5";

// biome-ignore format:
import type { AlbumID3, AlbumInfo, AlbumList, AlbumList2, ArtistInfo, ArtistInfo2, ArtistWithAlbumsID3, ArtistsID3, Bookmarks, ChatMessages, Directory, Genres, Indexes, InternetRadioStations, License, MusicFolders, NewestPodcasts, NowPlaying, OpenSubsonicExtensions, PlayQueue, Playlist, Playlists, Podcasts, ScanStatus, SearchResult2, SearchResult3, Shares, SimilarSongs, SimilarSongs2, Songs, Starred, Starred2, StructuredLyrics, TopSongs, User, Users, VideoInfo, Videos } from "./types.js";
Expand Down Expand Up @@ -65,10 +65,18 @@ export default class SubsonicAPI {
#crypto?: Crypto;

constructor(config: SubsonicConfig) {
this.#config = config;
if (!config) throw new Error("no config provided");
if (!config.url) throw new Error("no url provided");
if (!config.auth) throw new Error("no auth provided");
if (!config.auth.username) throw new Error("no username provided");
if (!config.auth.password) throw new Error("no password provided");

this.#config = config;
this.#crypto = config.crypto || globalThis.crypto;
this.#fetch = config.fetch || globalThis.fetch;
if (!this.#crypto && !this.#config.salt)
throw new Error("no crypto implementation available. Provide a salt or crypto implementation.");

this.#fetch = (config.fetch || globalThis.fetch).bind(globalThis);
if (!this.#fetch) throw new Error("no fetch implementation available");
}

Expand Down Expand Up @@ -114,7 +122,7 @@ export default class SubsonicAPI {
if (this.#config.reuseSalt) this.#config.salt = salt;
return {
salt,
token: md5.hash(password + salt),
token: md5(password + salt),
};
}

Expand Down
45 changes: 45 additions & 0 deletions src/md5.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
// https://stackoverflow.com/a/74041923 ported to TypeScript
// just a short-ish md5 implementation since there's no built-in one in the browser
// and all the libraries were a bit too much for this simple use case
export const md5 = (input: string) => {
const hc = '0123456789abcdef';
const rh = (n: number) => {let j: any,s='';for(j=0;j<=3;j++) s+=hc.charAt((n>>(j*8+4))&0x0F)+hc.charAt((n>>(j*8))&0x0F);return s;}
const ad = (x: number, y: number) => {const l=(x&0xFFFF)+(y&0xFFFF);const m=(x>>16)+(y>>16)+(l>>16);return (m<<16)|(l&0xFFFF);}
const rl = (n: number, c: number) => (n<<c)|(n>>>(32-c));
const cm = (q: number, a: any, b: any, x: any, s: any, t: any) => ad(rl(ad(ad(a,q),ad(x,t)),s),b);
const ff = (a: number, b: number, c: number, d: number, x: number, s: number,t: number) => cm((b&c)|((~b)&d),a,b,x,s,t);
const gg = (a: number, b: number, c: number, d: number, x: number, s: number,t: number) => cm((b&d)|(c&(~d)),a,b,x,s,t);
const hh = (a: number, b: number, c: number, d: number, x: number, s: number,t: number) => cm(b^c^d,a,b,x,s,t);
const ii = (a: number, b: number, c: number, d: number, x: number, s: number,t: number) => cm(c^(b|(~d)),a,b,x,s,t);
const sb = (x: string) => {
let i: any;const nblk=((x.length+8)>>6)+1;const blks=[];for(i=0;i<nblk*16;i++) { blks[i]=0 };
for(i=0;i<x.length;i++) {blks[i>>2]|=x.charCodeAt(i)<<((i%4)*8);}
blks[i>>2]|=0x80<<((i%4)*8);blks[nblk*16-2]=x.length*8;return blks;
}
let i: any,x=sb(input),a=1732584193,b=-271733879,c=-1732584194,d=271733878,olda:any,oldb:any,oldc:any,oldd:any;
for(i=0;i<x.length;i+=16) {olda=a;oldb=b;oldc=c;oldd=d;
a=ff(a,b,c,d,x[i+ 0], 7, -680876936);d=ff(d,a,b,c,x[i+ 1],12, -389564586);c=ff(c,d,a,b,x[i+ 2],17, 606105819);
b=ff(b,c,d,a,x[i+ 3],22,-1044525330);a=ff(a,b,c,d,x[i+ 4], 7, -176418897);d=ff(d,a,b,c,x[i+ 5],12, 1200080426);
c=ff(c,d,a,b,x[i+ 6],17,-1473231341);b=ff(b,c,d,a,x[i+ 7],22, -45705983);a=ff(a,b,c,d,x[i+ 8], 7, 1770035416);
d=ff(d,a,b,c,x[i+ 9],12,-1958414417);c=ff(c,d,a,b,x[i+10],17, -42063);b=ff(b,c,d,a,x[i+11],22,-1990404162);
a=ff(a,b,c,d,x[i+12], 7, 1804603682);d=ff(d,a,b,c,x[i+13],12, -40341101);c=ff(c,d,a,b,x[i+14],17,-1502002290);
b=ff(b,c,d,a,x[i+15],22, 1236535329);a=gg(a,b,c,d,x[i+ 1], 5, -165796510);d=gg(d,a,b,c,x[i+ 6], 9,-1069501632);
c=gg(c,d,a,b,x[i+11],14, 643717713);b=gg(b,c,d,a,x[i+ 0],20, -373897302);a=gg(a,b,c,d,x[i+ 5], 5, -701558691);
d=gg(d,a,b,c,x[i+10], 9, 38016083);c=gg(c,d,a,b,x[i+15],14, -660478335);b=gg(b,c,d,a,x[i+ 4],20, -405537848);
a=gg(a,b,c,d,x[i+ 9], 5, 568446438);d=gg(d,a,b,c,x[i+14], 9,-1019803690);c=gg(c,d,a,b,x[i+ 3],14, -187363961);
b=gg(b,c,d,a,x[i+ 8],20, 1163531501);a=gg(a,b,c,d,x[i+13], 5,-1444681467);d=gg(d,a,b,c,x[i+ 2], 9, -51403784);
c=gg(c,d,a,b,x[i+ 7],14, 1735328473);b=gg(b,c,d,a,x[i+12],20,-1926607734);a=hh(a,b,c,d,x[i+ 5], 4, -378558);
d=hh(d,a,b,c,x[i+ 8],11,-2022574463);c=hh(c,d,a,b,x[i+11],16, 1839030562);b=hh(b,c,d,a,x[i+14],23, -35309556);
a=hh(a,b,c,d,x[i+ 1], 4,-1530992060);d=hh(d,a,b,c,x[i+ 4],11, 1272893353);c=hh(c,d,a,b,x[i+ 7],16, -155497632);
b=hh(b,c,d,a,x[i+10],23,-1094730640);a=hh(a,b,c,d,x[i+13], 4, 681279174);d=hh(d,a,b,c,x[i+ 0],11, -358537222);
c=hh(c,d,a,b,x[i+ 3],16, -722521979);b=hh(b,c,d,a,x[i+ 6],23, 76029189);a=hh(a,b,c,d,x[i+ 9], 4, -640364487);
d=hh(d,a,b,c,x[i+12],11, -421815835);c=hh(c,d,a,b,x[i+15],16, 530742520);b=hh(b,c,d,a,x[i+ 2],23, -995338651);
a=ii(a,b,c,d,x[i+ 0], 6, -198630844);d=ii(d,a,b,c,x[i+ 7],10, 1126891415);c=ii(c,d,a,b,x[i+14],15,-1416354905);
b=ii(b,c,d,a,x[i+ 5],21, -57434055);a=ii(a,b,c,d,x[i+12], 6, 1700485571);d=ii(d,a,b,c,x[i+ 3],10,-1894986606);
c=ii(c,d,a,b,x[i+10],15, -1051523);b=ii(b,c,d,a,x[i+ 1],21,-2054922799);a=ii(a,b,c,d,x[i+ 8], 6, 1873313359);
d=ii(d,a,b,c,x[i+15],10, -30611744);c=ii(c,d,a,b,x[i+ 6],15,-1560198380);b=ii(b,c,d,a,x[i+13],21, 1309151649);
a=ii(a,b,c,d,x[i+ 4], 6, -145523070);d=ii(d,a,b,c,x[i+11],10,-1120210379);c=ii(c,d,a,b,x[i+ 2],15, 718787259);
b=ii(b,c,d,a,x[i+ 9],21, -343485551);a=ad(a,olda);b=ad(b,oldb);c=ad(c,oldc);d=ad(d,oldd);
}
return rh(a)+rh(b)+rh(c)+rh(d);
}

0 comments on commit 59040d1

Please sign in to comment.