17 Commits
1.1.2 ... 1.2.0

Author SHA1 Message Date
d97abc00e2 Fix version number
All checks were successful
Setup testing environment and test the code / build (push) Successful in 24s
Publish to NPM / build-and-publish (release) Successful in 26s
2026-04-17 16:27:31 +02:00
cada5487bf Merge remote-tracking branch 'origin/main'
Some checks failed
Setup testing environment and test the code / build (push) Successful in 33s
Publish to NPM / build-and-publish (release) Failing after 15s
# Conflicts:
#	package.json
2026-04-17 16:25:28 +02:00
2f9c65512b Added network permissions as constants and a permission calculator in permissions.ts 2026-04-17 16:25:03 +02:00
edd87375c3 Update package.json
Some checks failed
Setup testing environment and test the code / build (push) Has been cancelled
Publish to NPM / build-and-publish (release) Successful in 17s
2026-04-16 18:15:30 +02:00
b2d5b84435 Update package.json
Some checks failed
Setup testing environment and test the code / build (push) Has been cancelled
2026-04-16 18:13:06 +02:00
c460dc5385 Updated networkService.ts to use new /v2/ endpoint for uploading new network pictures
All checks were successful
Setup testing environment and test the code / build (push) Successful in 26s
Publish to NPM / build-and-publish (release) Successful in 37s
2026-04-16 16:55:48 +02:00
f54e76ab72 Updated extraMetadata to allow any type of data
All checks were successful
Setup testing environment and test the code / build (push) Successful in 26s
Publish to NPM / build-and-publish (release) Successful in 18s
2026-04-15 16:11:01 +02:00
fb1555338d Update WS
Some checks failed
Publish to NPM / build-and-publish (release) Successful in 27s
Setup testing environment and test the code / build (push) Has been cancelled
2026-04-14 16:44:27 +02:00
c98c917594 Update WS 2026-04-14 16:44:19 +02:00
cfb72d1772 Fixed types in getQuick functions
All checks were successful
Setup testing environment and test the code / build (push) Successful in 1m48s
Publish to NPM / build-and-publish (release) Successful in 27s
2026-04-14 16:05:09 +02:00
01d07d65d1 WebSocket Hotfix
All checks were successful
Setup testing environment and test the code / build (push) Successful in 1m9s
Publish to NPM / build-and-publish (release) Successful in 32s
2026-04-11 17:25:10 +02:00
c6ad01b710 Fix textChannelService.ts websocket
All checks were successful
Setup testing environment and test the code / build (push) Successful in 1m1s
Publish to NPM / build-and-publish (release) Successful in 30s
2026-04-11 17:14:39 +02:00
113cff5512 Fix textChannelService.ts websocket
Some checks failed
Setup testing environment and test the code / build (push) Failing after 1s
Publish to NPM / build-and-publish (release) Successful in 40s
2026-04-11 17:03:19 +02:00
2c91b73a60 Fix textChannelService.ts websocket
Some checks failed
Setup testing environment and test the code / build (push) Has been cancelled
2026-04-11 17:02:53 +02:00
866c8a1838 Removed dotenv
All checks were successful
Setup testing environment and test the code / build (push) Successful in 1m22s
Publish to NPM / build-and-publish (release) Successful in 29s
2026-04-10 21:17:16 +02:00
926a28b7f9 SessionManager hotfix
All checks were successful
Setup testing environment and test the code / build (push) Successful in 2m37s
Publish to NPM / build-and-publish (release) Successful in 1m44s
2026-04-10 19:18:13 +02:00
9d6a18dda4 Updated Attachment type
All checks were successful
Setup testing environment and test the code / build (push) Successful in 2m42s
Publish to NPM / build-and-publish (release) Successful in 2m47s
2026-04-10 09:18:16 +02:00
11 changed files with 79 additions and 30 deletions

View File

@@ -45,13 +45,11 @@ jobs:
with:
node-version: '24'
- name: Create .env file
run: |
echo "API_URL=http://api:3000" >> .env
echo "CDN_URL=http://cdn:4000" >> .env
echo "WS_URL=ws://api:3000" >> .env
- name: Run Vitest
env:
API_URL: http://api:3000
CDN_URL: http://cdn:4000
WS_URL: ws://api:3000
run: |
npm install
npm test --experimental-websocket

View File

@@ -1,6 +1,6 @@
{
"name": "@chatenium/chatenium-sdk",
"version": "1.1.2",
"version": "1.2.0",
"description": "A library for interacting with the Chatenium API",
"type": "module",
"main": "dist/index.js",
@@ -39,7 +39,6 @@
"dependencies": {
"@faker-js/faker": "^10.4.0",
"axios": "^1.14.0",
"dotenv": "^17.4.0",
"msw": "^2.12.14",
"uuid": "^13.0.0"
}

View File

@@ -5,19 +5,12 @@ export interface SDKConfig {
}
declare const process: any;
declare const require: any;
const isNode =
typeof process !== 'undefined' &&
typeof process.versions !== 'undefined' &&
typeof process.versions.node !== 'undefined';
if (isNode) {
try {
require('dotenv').config();
} catch { }
}
const getEnv = (key: string): string | undefined => {
if (!isNode) return undefined;
return process.env?.[key];

32
src/core/permissions.ts Normal file
View File

@@ -0,0 +1,32 @@
export const permissions = {
createAndEditCategories: 2,
deleteCategories: 4,
createAndEditChannels: 8,
deleteChannels: 16,
deleteAnyMessage: 32,
pinMessages: 64,
createAndEditRanks: 128,
deleteRanks: 256,
changeNetworkNamePictureAndVisibility: 512,
createEmojis: 1024,
deleteEmojis: 2048,
manageEmbed: 4096,
createWebhooks: 8192,
deleteWebhooks: 16384,
createInvites: 32768,
deleteInvites: 65536,
sendMessages: 131072,
seeChannels: 262144,
banMembers: 524288,
kickMembers: 1048576,
unAndAssignRanksToMember: 2097152,
}
/**
* Determines whether the set of permissions includes the permission. Note that network owners have regular permissions just like the other members, so if the userid matches with the network's creator ID, then the permission is automatically granted. This logic is not included in this function.
* @param permissions
* @param permission
*/
export function permissionGranted(permissions: number, permission: number): Boolean {
return (permissions & permission) === permission;
}

View File

@@ -43,6 +43,13 @@ export class WebSocketHandler {
this.connection = new WebSocket(`${environment.get().wsUrl}/v2/ws?userid=${userid}&access_token=${resp.data.token}`)
console.log("Connected to websocket successfully")
this.startListening()
this.connection.onclose = () => {
console.error("The WebSocket connection was closed unexpectedly. Reconnecting...")
setTimeout(() => {
this.connect(userid, token)
}, 3000)
}
return
} catch (e) {
console.log(e)

View File

@@ -24,4 +24,5 @@ export interface Attachment {
path: string
height: number
width: number
extraMetaData: Record<string, any> // Used by clients
}

View File

@@ -208,9 +208,11 @@ export interface GetMembersReq {
}
export interface UploadNewPictureReq {
picId: string
userid: string
networkId: string
data: string
isImage: boolean
monogramColors: RGB | null
}
export interface ChangeVisibilityReq {

View File

@@ -58,7 +58,7 @@ export class ChatService {
}
}
async getQuick(): Promise<Message[]> {
async getQuick(): Promise<Chat[]> {
const chats = await this.database.get("chats", this.userid)
if (chats) {
return JSON.parse(chats)

View File

@@ -108,7 +108,7 @@ export class NetworkService {
}
}
async getQuick(): Promise<Message[]> {
async getQuick(): Promise<Network[]> {
const networks = await this.database.get("networks", this.userid)
if (networks) {
return JSON.parse(networks)
@@ -711,14 +711,18 @@ export class NetworkService {
/**
* Uploads a new network picture
* @param picId
* @param isImage
* @param image
* @param colors
*/
async uploadNewPic(picId: string): Promise<void> {
async uploadNewPic(isImage: boolean, image: string | null, colors: RGB | null): Promise<void> {
try {
await this.client.patch<PublicUserData[]>("network/uploadNewPic", <UploadNewPictureReq>{
await this.client.patch<PublicUserData[]>("v2/network/uploadNewPic", <UploadNewPictureReq>{
userid: this.userid,
networkId: this.networkId,
picId: picId,
data: image,
isImage: isImage,
monogramColors: colors
});
return
} catch (e) {

View File

@@ -36,14 +36,21 @@ export class SessionManager {
async loadSessions(): Promise<Session[]> {
const tokens = await this.keyring.getAll()
const sessions: Session[] = []
for (const tokenKey of tokens) {
const token = await this.keyring.get(tokenKey)
const userData = await this.database.get("sessions", tokenKey)
if (userData) {
sessions.push({
token: token,
userData: JSON.parse(userData)
})
try {
const token = await this.keyring.get(tokenKey)
const userData = await this.database.get("sessions", tokenKey)
if (userData && userData.trim().length > 0) {
sessions.push({
token: token,
userData: JSON.parse(userData)
})
}
} catch (e) {
console.error(`Failed to parse session for ${tokenKey}:`, e)
continue
}
}
@@ -70,6 +77,11 @@ export class SessionManager {
*/
async loadPreferredSession() {
const sessions = await this.loadSessions()
if (sessions.length == 0) {
throw new Error("No sessions found")
}
let preferredUser = await this.getPreferredUser()
if (preferredUser == "") {
preferredUser = sessions[0].userData.userid

View File

@@ -48,6 +48,7 @@ export class TextChannelServiceService {
private onNewConnId(newConnId: string) {
console.log("NetworkService: New connection id")
this.client.defaults.headers["X-WS-ID"] = newConnId;
this.joinWebSocketRoom().then()
}
/**
@@ -263,7 +264,7 @@ export class TextChannelServiceService {
*/
async joinWebSocketRoom(): Promise<void> {
try {
const resp = await this.client.patch("network/channel/joinWebSocketRoom", <JoinWsRoomReq>{
const resp = await this.client.post("v2/network/channel/joinWebSocketRoom", <JoinWsRoomReq>{
networkId: this.networkId,
channelId: this.channelId,
categoryId: this.categoryId,