Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion gramjs/extensions/PromisedWebSockets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ export class PromisedWebSockets {
};
//CONTEST
if (isBrowser) {
window.addEventListener("offline", async () => {
globalThis?.addEventListener("offline", async () => {
await this.close();
if (this.resolveRead) {
this.resolveRead(false);
Expand Down
23 changes: 19 additions & 4 deletions gramjs/extensions/markdownv2.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,7 @@ export class MarkdownV2Parser {
message = message.replace(/\|\|(.*?)\|\|/g, "<spoiler>$1</spoiler>");

// Inline URL
message = message.replace(
/(?<!\!)\[([^\]]+)\]\(([^)]+)\)/g,
'<a href="$2">$1</a>'
);
message = replaceInnerUrl(message);

// Emoji
message = message.replace(
Expand Down Expand Up @@ -79,3 +76,21 @@ export class MarkdownV2Parser {
return text;
}
}

const replaceInnerUrl = (message: string) => {
let innerUrl = message;
const replacedMarkdownText = message.replace(
/!\[([^\[\]]*)\]\(([^)]+)\)/g,
""
);

const linkRegex = /\[([^\[\]]*)\]\(([^)]+)\)/g;

let match;
while ((match = linkRegex.exec(replacedMarkdownText)) !== null) {
const text = match[1];
const url = match[2];
innerUrl = `'<a href="${url}">${text}</a>'`;
}
return innerUrl;
};
52 changes: 30 additions & 22 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "telegram",
"version": "2.25.11",
"name": "@sipz/telegram",
"version": "1.0.11",
"description": "NodeJS/Browser MTProto API Telegram client library,",
"main": "index.js",
"types": "index.d.ts",
Expand Down Expand Up @@ -70,4 +70,4 @@
"node-localstorage": "^2.2.1",
"socks": "^2.6.2"
}
}
}
152 changes: 152 additions & 0 deletions tempBrowser/extensions/PromisedWebSockets.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
import { Buffer } from "buffer/";
import { w3cwebsocket } from "websocket";
import { Mutex } from "async-mutex";
import { isBrowser } from "../platform";

const mutex = new Mutex();

const closeError = new Error("WebSocket was closed");

export class PromisedWebSockets {
private closed: boolean;
private stream: Buffer;
private canRead?: boolean | Promise<boolean>;
private resolveRead: ((value?: any) => void) | undefined;
private client: w3cwebsocket | undefined;
private website?: string;

constructor() {
this.client = undefined;
this.stream = Buffer.alloc(0);

this.closed = true;
}

async readExactly(number: number) {
let readData = Buffer.alloc(0);
while (true) {
const thisTime = await this.read(number);
readData = Buffer.concat([readData, thisTime]);
number = number - thisTime.length;
if (!number) {
return readData;
}
}
}

async read(number: number) {
if (this.closed) {
throw closeError;
}
await this.canRead;
if (this.closed) {
throw closeError;
}
const toReturn = this.stream.slice(0, number);
this.stream = this.stream.slice(number);
if (this.stream.length === 0) {
this.canRead = new Promise((resolve) => {
this.resolveRead = resolve;
});
}

return toReturn;
}

async readAll() {
if (this.closed || !(await this.canRead)) {
throw closeError;
}
const toReturn = this.stream;
this.stream = Buffer.alloc(0);
this.canRead = new Promise((resolve) => {
this.resolveRead = resolve;
});
return toReturn;
}

getWebSocketLink(ip: string, port: number, testServers: boolean) {
if (port === 443) {
return `wss://${ip}:${port}/apiws${testServers ? "_test" : ""}`;
} else {
return `ws://${ip}:${port}/apiws${testServers ? "_test" : ""}`;
}
}

async connect(port: number, ip: string, testServers: boolean = false) {
this.stream = Buffer.alloc(0);
this.canRead = new Promise((resolve) => {
this.resolveRead = resolve;
});
this.closed = false;
this.website = this.getWebSocketLink(ip, port, testServers);
this.client = new w3cwebsocket(this.website, "binary");
return new Promise((resolve, reject) => {
if (this.client) {
this.client.onopen = () => {
this.receive();
resolve(this);
};
this.client.onerror = (error: any) => {
reject(error);
};
this.client.onclose = () => {
if (this.resolveRead) {
this.resolveRead(false);
}
this.closed = true;
};
//CONTEST
if (isBrowser) {
globalThis.addEventListener?.("offline", async () => {
await this.close();
if (this.resolveRead) {
this.resolveRead(false);
}
});
}
}
});
}

write(data: Buffer) {
if (this.closed) {
throw closeError;
}
if (this.client) {
this.client.send(data);
}
}

async close() {
if (this.client) {
await this.client.close();
}
this.closed = true;
}

async receive() {
if (this.client) {
this.client.onmessage = async (message: any) => {
const release = await mutex.acquire();
try {
let data;
//CONTEST BROWSER
data = Buffer.from(
await new Response(message.data).arrayBuffer()
);
this.stream = Buffer.concat([this.stream, data]);
if (this.resolveRead) {
this.resolveRead(true);
}
} finally {
release();
}
};
}
}

toString() {
return "PromisedWebSocket";
}
}