From e07c171818f40923b569a54d125e7ce1ffaa0b91 Mon Sep 17 00:00:00 2001 From: AkiraFukushima Date: Mon, 11 Mar 2024 22:37:44 +0900 Subject: [PATCH 1/2] Infer streaming URL from instance information --- megalodon/src/firefish.ts | 35 ++++++++++++++++-------- megalodon/src/firefish/api_client.ts | 9 +++++-- megalodon/src/friendica.ts | 38 ++++++++++++++++++--------- megalodon/src/friendica/api_client.ts | 7 +++-- megalodon/src/mastodon.ts | 38 ++++++++++++++++++--------- megalodon/src/mastodon/api_client.ts | 7 +++-- megalodon/src/megalodon.ts | 13 ++++----- megalodon/src/pleroma.ts | 38 ++++++++++++++++++--------- megalodon/src/pleroma/api_client.ts | 7 +++-- 9 files changed, 125 insertions(+), 67 deletions(-) diff --git a/megalodon/src/firefish.ts b/megalodon/src/firefish.ts index 7c0343c17..9d10cdffe 100644 --- a/megalodon/src/firefish.ts +++ b/megalodon/src/firefish.ts @@ -2350,27 +2350,40 @@ export default class Firefish implements MegalodonInterface { }) } - public userSocket(): WebSocketInterface { - return this.client.socket('user') + public async streamingURL(): Promise { + const instance = await this.getInstance() + if (instance.data.urls) { + return instance.data.urls.streaming_api + } + return this.baseUrl + } + + public async userStreaming(): Promise { + const url = await this.streamingURL() + return this.client.socket(url, 'user') } - public publicSocket(): WebSocketInterface { - return this.client.socket('globalTimeline') + public async publicStreaming(): Promise { + const url = await this.streamingURL() + return this.client.socket(url, 'globalTimeline') } - public localSocket(): WebSocketInterface { - return this.client.socket('localTimeline') + public async localStreaming(): Promise { + const url = await this.streamingURL() + return this.client.socket(url, 'localTimeline') } - public tagSocket(_tag: string): WebSocketInterface { + public async tagStreaming(_tag: string): Promise { throw new NotImplementedError('TODO: implement') } - public listSocket(list_id: string): WebSocketInterface { - return this.client.socket('list', list_id) + public async listStreaming(list_id: string): Promise { + const url = await this.streamingURL() + return this.client.socket(url, 'list', list_id) } - public directSocket(): WebSocketInterface { - return this.client.socket('conversation') + public async directStreaming(): Promise { + const url = await this.streamingURL() + return this.client.socket(url, 'conversation') } } diff --git a/megalodon/src/firefish/api_client.ts b/megalodon/src/firefish/api_client.ts index 195a880e7..9e2164395 100644 --- a/megalodon/src/firefish/api_client.ts +++ b/megalodon/src/firefish/api_client.ts @@ -610,7 +610,11 @@ namespace FirefishAPI { get(path: string, params?: any, headers?: { [key: string]: string }): Promise> post(path: string, params?: any, headers?: { [key: string]: string }): Promise> cancel(): void - socket(channel: 'user' | 'localTimeline' | 'hybridTimeline' | 'globalTimeline' | 'conversation' | 'list', listId?: string): WebSocket + socket( + url: string, + channel: 'user' | 'localTimeline' | 'hybridTimeline' | 'globalTimeline' | 'conversation' | 'list', + listId?: string + ): WebSocket } /** @@ -702,17 +706,18 @@ namespace FirefishAPI { /** * Get connection and receive websocket connection for Firefish API. * + * @param url Streaming url. * @param channel Channel name is user, localTimeline, hybridTimeline, globalTimeline, conversation or list. * @param listId This parameter is required only list channel. */ public socket( + url: string, channel: 'user' | 'localTimeline' | 'hybridTimeline' | 'globalTimeline' | 'conversation' | 'list', listId?: string ): WebSocket { if (!this.accessToken) { throw new Error('accessToken is required') } - const url = this.baseUrl + '/streaming' const streaming = new WebSocket(url, channel, this.accessToken, listId, this.userAgent) streaming.start() diff --git a/megalodon/src/friendica.ts b/megalodon/src/friendica.ts index 389d41080..fd29e9432 100644 --- a/megalodon/src/friendica.ts +++ b/megalodon/src/friendica.ts @@ -2840,27 +2840,41 @@ export default class Friendica implements MegalodonInterface { // ====================================== // WebSocket // ====================================== - public userSocket(): WebSocket { - return this.client.socket('/api/v1/streaming', 'user') + public async streamingURL(): Promise { + const instance = await this.getInstance() + if (instance.data.urls) { + return instance.data.urls.streaming_api + } + return this.baseUrl + } + + public async userStreaming(): Promise { + const url = await this.streamingURL() + return this.client.socket(`${url}/api/v1/streaming`, 'user') } - public publicSocket(): WebSocket { - return this.client.socket('/api/v1/streaming', 'public') + public async publicStreaming(): Promise { + const url = await this.streamingURL() + return this.client.socket(`${url}/api/v1/streaming`, 'public') } - public localSocket(): WebSocket { - return this.client.socket('/api/v1/streaming', 'public:local') + public async localStreaming(): Promise { + const url = await this.streamingURL() + return this.client.socket(`${url}/api/v1/streaming`, 'public:local') } - public tagSocket(tag: string): WebSocket { - return this.client.socket('/api/v1/streaming', 'hashtag', `tag=${tag}`) + public async tagStreaming(tag: string): Promise { + const url = await this.streamingURL() + return this.client.socket(`${url}/api/v1/streaming`, 'hashtag', `tag=${tag}`) } - public listSocket(list_id: string): WebSocket { - return this.client.socket('/api/v1/streaming', 'list', `list=${list_id}`) + public async listStreaming(list_id: string): Promise { + const url = await this.streamingURL() + return this.client.socket(`${url}/api/v1/streaming`, 'list', `list=${list_id}`) } - public directSocket(): WebSocket { - return this.client.socket('/api/v1/streaming', 'direct') + public async directStreaming(): Promise { + const url = await this.streamingURL() + return this.client.socket(`${url}/api/v1/streaming`, 'direct') } } diff --git a/megalodon/src/friendica/api_client.ts b/megalodon/src/friendica/api_client.ts index 48b743c78..1bee245f8 100644 --- a/megalodon/src/friendica/api_client.ts +++ b/megalodon/src/friendica/api_client.ts @@ -24,7 +24,7 @@ namespace FriendicaAPI { postForm(path: string, params?: any, headers?: { [key: string]: string }): Promise> del(path: string, params?: any, headers?: { [key: string]: string }): Promise> cancel(): void - socket(path: string, stream: string, params?: string): WebSocket + socket(url: string, stream: string, params?: string): WebSocket } /** @@ -367,15 +367,14 @@ namespace FriendicaAPI { /** * Get connection and receive websocket connection for Pleroma API. * - * @param path relative path from baseUrl: normally it is `/streaming`. + * @param url Streaming url. * @param stream Stream name, please refer: https://git.pleroma.social/pleroma/pleroma/blob/develop/lib/pleroma/web/mastodon_api/mastodon_socket.ex#L19-28 * @returns WebSocket, which inherits from EventEmitter */ - public socket(path: string, stream: string, params?: string): WebSocket { + public socket(url: string, stream: string, params?: string): WebSocket { if (!this.accessToken) { throw new Error('accessToken is required') } - const url = this.baseUrl + path const streaming = new WebSocket(url, stream, params, this.accessToken, this.userAgent) streaming.start() diff --git a/megalodon/src/mastodon.ts b/megalodon/src/mastodon.ts index 374dae1cf..8ca97e7e3 100644 --- a/megalodon/src/mastodon.ts +++ b/megalodon/src/mastodon.ts @@ -3144,27 +3144,41 @@ export default class Mastodon implements MegalodonInterface { // ====================================== // WebSocket // ====================================== - public userSocket(): Streaming { - return this.client.socket('/api/v1/streaming', 'user') + public async streamingURL(): Promise { + const instance = await this.getInstance() + if (instance.data.urls) { + return instance.data.urls.streaming_api + } + return this.baseUrl + } + + public async userStreaming(): Promise { + const url = await this.streamingURL() + return this.client.socket(`${url}/api/v1/streaming`, 'user') } - public publicSocket(): Streaming { - return this.client.socket('/api/v1/streaming', 'public') + public async publicStreaming(): Promise { + const url = await this.streamingURL() + return this.client.socket(`${url}/api/v1/streaming`, 'public') } - public localSocket(): Streaming { - return this.client.socket('/api/v1/streaming', 'public:local') + public async localStreaming(): Promise { + const url = await this.streamingURL() + return this.client.socket(`${url}/api/v1/streaming`, 'public:local') } - public tagSocket(tag: string): Streaming { - return this.client.socket('/api/v1/streaming', 'hashtag', `tag=${tag}`) + public async tagStreaming(tag: string): Promise { + const url = await this.streamingURL() + return this.client.socket(`${url}/api/v1/streaming`, 'hashtag', `tag=${tag}`) } - public listSocket(list_id: string): Streaming { - return this.client.socket('/api/v1/streaming', 'list', `list=${list_id}`) + public async listStreaming(list_id: string): Promise { + const url = await this.streamingURL() + return this.client.socket(`${url}/api/v1/streaming`, 'list', `list=${list_id}`) } - public directSocket(): Streaming { - return this.client.socket('/api/v1/streaming', 'direct') + public async directStreaming(): Promise { + const url = await this.streamingURL() + return this.client.socket(`${url}/api/v1/streaming`, 'direct') } } diff --git a/megalodon/src/mastodon/api_client.ts b/megalodon/src/mastodon/api_client.ts index 81aa7df32..fa7291aee 100644 --- a/megalodon/src/mastodon/api_client.ts +++ b/megalodon/src/mastodon/api_client.ts @@ -24,7 +24,7 @@ namespace MastodonAPI { postForm(path: string, params?: any, headers?: { [key: string]: string }): Promise> del(path: string, params?: any, headers?: { [key: string]: string }): Promise> cancel(): void - socket(path: string, stream: string, params?: string): Streaming + socket(url: string, stream: string, params?: string): Streaming } /** @@ -367,15 +367,14 @@ namespace MastodonAPI { /** * Get connection and receive websocket connection for Pleroma API. * - * @param path relative path from baseUrl: normally it is `/streaming`. + * @param url Streaming url. * @param stream Stream name, please refer: https://git.pleroma.social/pleroma/pleroma/blob/develop/lib/pleroma/web/mastodon_api/mastodon_socket.ex#L19-28 * @returns WebSocket, which inherits from EventEmitter */ - public socket(path: string, stream: string, params?: string): Streaming { + public socket(url: string, stream: string, params?: string): Streaming { if (!this.accessToken) { throw new Error('accessToken is required') } - const url = this.baseUrl + path const streaming = new Streaming(url, stream, params, this.accessToken, this.userAgent) streaming.start() diff --git a/megalodon/src/megalodon.ts b/megalodon/src/megalodon.ts index 0d7a4aaf1..1df4aac07 100644 --- a/megalodon/src/megalodon.ts +++ b/megalodon/src/megalodon.ts @@ -1370,12 +1370,13 @@ export interface MegalodonInterface { // ====================================== // WebSocket // ====================================== - userSocket(): WebSocketInterface - publicSocket(): WebSocketInterface - localSocket(): WebSocketInterface - tagSocket(tag: string): WebSocketInterface - listSocket(list_id: string): WebSocketInterface - directSocket(): WebSocketInterface + streamingURL(): Promise + userStreaming(): Promise + publicStreaming(): Promise + localStreaming(): Promise + tagStreaming(tag: string): Promise + listStreaming(list_id: string): Promise + directStreaming(): Promise } export class NotImplementedError extends Error { diff --git a/megalodon/src/pleroma.ts b/megalodon/src/pleroma.ts index 96efd25ea..2f36fedfe 100644 --- a/megalodon/src/pleroma.ts +++ b/megalodon/src/pleroma.ts @@ -3192,27 +3192,41 @@ export default class Pleroma implements MegalodonInterface { // ====================================== // WebSocket // ====================================== - public userSocket(): WebSocket { - return this.client.socket('/api/v1/streaming', 'user') + public async streamingURL(): Promise { + const instance = await this.getInstance() + if (instance.data.urls) { + return instance.data.urls.streaming_api + } + return this.baseUrl + } + + public async userStreaming(): Promise { + const url = this.streamingURL() + return this.client.socket(`${url}/api/v1/streaming`, 'user') } - public publicSocket(): WebSocket { - return this.client.socket('/api/v1/streaming', 'public') + public async publicStreaming(): Promise { + const url = this.streamingURL() + return this.client.socket(`${url}/api/v1/streaming`, 'public') } - public localSocket(): WebSocket { - return this.client.socket('/api/v1/streaming', 'public:local') + public async localStreaming(): Promise { + const url = this.streamingURL() + return this.client.socket(`${url}/api/v1/streaming`, 'public:local') } - public tagSocket(tag: string): WebSocket { - return this.client.socket('/api/v1/streaming', 'hashtag', `tag=${tag}`) + public async tagStreaming(tag: string): Promise { + const url = this.streamingURL() + return this.client.socket(`${url}/api/v1/streaming`, 'hashtag', `tag=${tag}`) } - public listSocket(list_id: string): WebSocket { - return this.client.socket('/api/v1/streaming', 'list', `list=${list_id}`) + public async listStreaming(list_id: string): Promise { + const url = this.streamingURL() + return this.client.socket(`${url}/api/v1/streaming`, 'list', `list=${list_id}`) } - public directSocket(): WebSocket { - return this.client.socket('/api/v1/streaming', 'direct') + public async directStreaming(): Promise { + const url = this.streamingURL() + return this.client.socket(`${url}/api/v1/streaming`, 'direct') } } diff --git a/megalodon/src/pleroma/api_client.ts b/megalodon/src/pleroma/api_client.ts index 5cca712dc..6c6d8748a 100644 --- a/megalodon/src/pleroma/api_client.ts +++ b/megalodon/src/pleroma/api_client.ts @@ -439,7 +439,7 @@ namespace PleromaAPI { postForm(path: string, params?: any, headers?: { [key: string]: string }): Promise> del(path: string, params?: any, headers?: { [key: string]: string }): Promise> cancel(): void - socket(path: string, stream: string, params?: string): WebSocket + socket(url: string, stream: string, params?: string): WebSocket } /** @@ -775,15 +775,14 @@ namespace PleromaAPI { /** * Get connection and receive websocket connection for Pleroma API. * - * @param path relative path from baseUrl: normally it is `/streaming`. + * @param url Streaming url. * @param stream Stream name, please refer: https://git.pleroma.social/pleroma/pleroma/blob/develop/lib/pleroma/web/mastodon_api/mastodon_socket.ex#L19-28 * @returns WebSocket, which inherits from EventEmitter */ - public socket(path: string, stream: string, params?: string): WebSocket { + public socket(url: string, stream: string, params?: string): WebSocket { if (!this.accessToken) { throw new Error('accessToken is required') } - const url = this.baseUrl + path const streaming = new WebSocket(url, stream, params, this.accessToken, this.userAgent) streaming.start() From 34851fedfedcc8a23383c9c0b5e659f1b0652b7a Mon Sep 17 00:00:00 2001 From: AkiraFukushima Date: Mon, 11 Mar 2024 22:47:57 +0900 Subject: [PATCH 2/2] Fix web socket examples --- example/typescript/src/firefish/web_socket.ts | 52 +++++------ example/typescript/src/mastodon/streaming.ts | 65 ++++++------- .../src/mastodon/unauthorized_streaming.ts | 67 +++++++------- example/typescript/src/pleroma/web_socket.ts | 70 +++++++------- example/vite/src/main.ts | 91 ++++++++++--------- example/webpack/src/index.ts | 73 +++++++-------- megalodon/src/pleroma.ts | 12 +-- 7 files changed, 217 insertions(+), 213 deletions(-) diff --git a/example/typescript/src/firefish/web_socket.ts b/example/typescript/src/firefish/web_socket.ts index 83c8be2db..aef0ffb79 100644 --- a/example/typescript/src/firefish/web_socket.ts +++ b/example/typescript/src/firefish/web_socket.ts @@ -1,39 +1,39 @@ -import generator, { Entity, WebSocketInterface } from 'megalodon' +import generator, { Entity } from 'megalodon' import log4js from 'log4js' -const BASE_URL: string = process.env.FIREFISH_STREAMING_URL! +const BASE_URL: string = process.env.FIREFISH_URL! const access_token: string = process.env.FIREFISH_ACCESS_TOKEN! const client = generator('firefish', BASE_URL, access_token) -const stream: WebSocketInterface = client.userSocket() +client.localStreaming().then(stream => { + const logger = log4js.getLogger() + logger.level = 'debug' + stream.on('connect', () => { + logger.debug('connect') + }) -const logger = log4js.getLogger() -logger.level = 'debug' -stream.on('connect', () => { - logger.debug('connect') -}) + stream.on('pong', () => { + logger.debug('pong') + }) -stream.on('pong', () => { - logger.debug('pong') -}) + stream.on('update', (status: Entity.Status) => { + logger.debug(status) + }) -stream.on('update', (status: Entity.Status) => { - logger.debug(status) -}) + stream.on('notification', (notification: Entity.Notification) => { + logger.debug(notification) + }) -stream.on('notification', (notification: Entity.Notification) => { - logger.debug(notification) -}) + stream.on('error', (err: Error) => { + console.error(err) + }) -stream.on('error', (err: Error) => { - console.error(err) -}) - -stream.on('close', () => { - logger.debug('close') -}) + stream.on('close', () => { + logger.debug('close') + }) -stream.on('parser-error', (err: Error) => { - console.error(err) + stream.on('parser-error', (err: Error) => { + console.error(err) + }) }) diff --git a/example/typescript/src/mastodon/streaming.ts b/example/typescript/src/mastodon/streaming.ts index 57c16e88c..62cb9f23a 100644 --- a/example/typescript/src/mastodon/streaming.ts +++ b/example/typescript/src/mastodon/streaming.ts @@ -1,48 +1,49 @@ -import generator, { Entity, WebSocketInterface } from 'megalodon' +import generator, { Entity } from 'megalodon' -const BASE_URL: string = process.env.MASTODON_STREAMING_URL! +const BASE_URL: string = process.env.MASTODON_URL! const access_token: string = process.env.MASTODON_ACCESS_TOKEN! const client = generator('mastodon', BASE_URL, access_token) -const stream: WebSocketInterface = client.localSocket() -stream.on('connect', () => { - console.log('connect') -}) +client.localStreaming().then(stream => { + stream.on('connect', () => { + console.log('connect') + }) -stream.on('pong', () => { - console.log('pong') -}) + stream.on('pong', () => { + console.log('pong') + }) -stream.on('update', (status: Entity.Status) => { - console.log(status) -}) + stream.on('update', (status: Entity.Status) => { + console.log(status) + }) -stream.on('notification', (notification: Entity.Notification) => { - console.log(notification) -}) + stream.on('notification', (notification: Entity.Notification) => { + console.log(notification) + }) -stream.on('delete', (id: number) => { - console.log(id) -}) + stream.on('delete', (id: number) => { + console.log(id) + }) -stream.on('error', (err: Error) => { - console.error(err) -}) + stream.on('error', (err: Error) => { + console.error(err) + }) -stream.on('status_update', (status: Entity.Status) => { - console.log('updated: ', status.url) -}) + stream.on('status_update', (status: Entity.Status) => { + console.log('updated: ', status.url) + }) -stream.on('heartbeat', () => { - console.log('thump.') -}) + stream.on('heartbeat', () => { + console.log('thump.') + }) -stream.on('close', () => { - console.log('close') -}) + stream.on('close', () => { + console.log('close') + }) -stream.on('parser-error', (err: Error) => { - console.error(err) + stream.on('parser-error', (err: Error) => { + console.error(err) + }) }) diff --git a/example/typescript/src/mastodon/unauthorized_streaming.ts b/example/typescript/src/mastodon/unauthorized_streaming.ts index c1d24d8ca..fabf27869 100644 --- a/example/typescript/src/mastodon/unauthorized_streaming.ts +++ b/example/typescript/src/mastodon/unauthorized_streaming.ts @@ -1,52 +1,53 @@ -import generator, { Entity, WebSocketInterface } from 'megalodon' +import generator, { Entity } from 'megalodon' declare var process: { env: { - MASTODON_STREAMING_URL: string + MASTODON_URL: string } } -const url: string = process.env.MASTODON_STREAMING_URL +const url: string = process.env.MASTODON_URL const client = generator('mastodon', url) -const stream: WebSocketInterface = client.localSocket() -stream.on('connect', () => { - console.log('connect') -}) +client.localStreaming().then(stream => { + stream.on('connect', () => { + console.log('connect') + }) -stream.on('pong', () => { - console.log('pong') -}) + stream.on('pong', () => { + console.log('pong') + }) -stream.on('update', (status: Entity.Status) => { - console.log(status) -}) + stream.on('update', (status: Entity.Status) => { + console.log(status) + }) -stream.on('notification', (notification: Entity.Notification) => { - console.log(notification) -}) + stream.on('notification', (notification: Entity.Notification) => { + console.log(notification) + }) -stream.on('delete', (id: number) => { - console.log(id) -}) + stream.on('delete', (id: number) => { + console.log(id) + }) -stream.on('error', (err: Error) => { - console.error(err) -}) + stream.on('error', (err: Error) => { + console.error(err) + }) -stream.on('status_update', (status: Entity.Status) => { - console.log('updated: ', status.url) -}) + stream.on('status_update', (status: Entity.Status) => { + console.log('updated: ', status.url) + }) -stream.on('heartbeat', () => { - console.log('thump.') -}) + stream.on('heartbeat', () => { + console.log('thump.') + }) -stream.on('close', () => { - console.log('close') -}) + stream.on('close', () => { + console.log('close') + }) -stream.on('parser-error', (err: Error) => { - console.error(err) + stream.on('parser-error', (err: Error) => { + console.error(err) + }) }) diff --git a/example/typescript/src/pleroma/web_socket.ts b/example/typescript/src/pleroma/web_socket.ts index 0c57c06af..b3ef4f249 100644 --- a/example/typescript/src/pleroma/web_socket.ts +++ b/example/typescript/src/pleroma/web_socket.ts @@ -1,4 +1,4 @@ -import generator, { Entity, WebSocketInterface } from 'megalodon' +import generator, { Entity } from 'megalodon' import log4js from 'log4js' declare var process: { @@ -7,52 +7,52 @@ declare var process: { } } -const BASE_URL: string = 'wss://pleroma.io' +const BASE_URL: string = 'https://pleroma.io' const access_token: string = process.env.PLEROMA_ACCESS_TOKEN const client = generator('pleroma', BASE_URL, access_token) -const stream: WebSocketInterface = client.userSocket() +client.userStreaming().then(stream => { + const logger = log4js.getLogger() + logger.level = 'debug' + stream.on('connect', () => { + logger.debug('connect') + }) -const logger = log4js.getLogger() -logger.level = 'debug' -stream.on('connect', () => { - logger.debug('connect') -}) + stream.on('pong', () => { + logger.debug('pong') + }) -stream.on('pong', () => { - logger.debug('pong') -}) + stream.on('update', (status: Entity.Status) => { + logger.debug(status.url) + }) -stream.on('update', (status: Entity.Status) => { - logger.debug(status.url) -}) - -stream.on('notification', (notification: Entity.Notification) => { - logger.debug(notification) -}) + stream.on('notification', (notification: Entity.Notification) => { + logger.debug(notification) + }) -stream.on('delete', (id: number) => { - logger.debug(id) -}) + stream.on('delete', (id: number) => { + logger.debug(id) + }) -stream.on('error', (err: Error) => { - console.error(err) -}) + stream.on('error', (err: Error) => { + console.error(err) + }) -stream.on('heartbeat', () => { - logger.debug('thump.') -}) + stream.on('heartbeat', () => { + logger.debug('thump.') + }) -stream.on('status_update', (status: Entity.Status) => { - logger.debug('updated: ', status.url) -}) + stream.on('status_update', (status: Entity.Status) => { + logger.debug('updated: ', status.url) + }) -stream.on('close', () => { - logger.debug('close') -}) + stream.on('close', () => { + logger.debug('close') + }) -stream.on('parser-error', (err: Error) => { - logger.error(err) + stream.on('parser-error', (err: Error) => { + logger.error(err) + }) }) diff --git a/example/vite/src/main.ts b/example/vite/src/main.ts index 4785b8a65..f76063216 100644 --- a/example/vite/src/main.ts +++ b/example/vite/src/main.ts @@ -7,49 +7,50 @@ console.log('start') const client = generator('mastodon', BASE_URL, ACCESS_TOKEN) -const stream = client.publicSocket() -stream.on('connect', () => { - console.log('connect') +client.publicStreaming().then(stream => { + stream.on('connect', () => { + console.log('connect') + }) + + stream.on('pong', () => { + console.log('pong') + }) + + stream.on('update', (status: Entity.Status) => { + console.log(status) + }) + + stream.on('notification', (notification: Entity.Notification) => { + console.log(notification) + }) + + stream.on('delete', (id: number) => { + console.log(id) + }) + + stream.on('error', (err: Error) => { + console.error(err) + }) + + stream.on('status_update', (status: Entity.Status) => { + console.log('updated: ', status.url) + }) + + stream.on('heartbeat', () => { + console.log('thump.') + }) + + stream.on('close', () => { + console.log('close') + }) + + stream.on('parser-error', (err: Error) => { + console.error(err) + }) + // + // setTimeout(() => { + // stream.removeAllListeners() + // stream.stop() + // console.log('closed') + // }, 10000) }) - -stream.on('pong', () => { - console.log('pong') -}) - -stream.on('update', (status: Entity.Status) => { - console.log(status) -}) - -stream.on('notification', (notification: Entity.Notification) => { - console.log(notification) -}) - -stream.on('delete', (id: number) => { - console.log(id) -}) - -stream.on('error', (err: Error) => { - console.error(err) -}) - -stream.on('status_update', (status: Entity.Status) => { - console.log('updated: ', status.url) -}) - -stream.on('heartbeat', () => { - console.log('thump.') -}) - -stream.on('close', () => { - console.log('close') -}) - -stream.on('parser-error', (err: Error) => { - console.error(err) -}) -// -// setTimeout(() => { -// stream.removeAllListeners() -// stream.stop() -// console.log('closed') -// }, 10000) diff --git a/example/webpack/src/index.ts b/example/webpack/src/index.ts index 61ce734af..e0527919d 100644 --- a/example/webpack/src/index.ts +++ b/example/webpack/src/index.ts @@ -7,49 +7,50 @@ console.log('start') const client = generator('mastodon', BASE_URL, ACCESS_TOKEN) -const stream = client.publicSocket() -stream.on('connect', () => { - console.log('connect') -}) +client.publicStreaming().then(stream => { + stream.on('connect', () => { + console.log('connect') + }) -stream.on('pong', () => { - console.log('pong') -}) + stream.on('pong', () => { + console.log('pong') + }) -stream.on('update', (status: Entity.Status) => { - console.log(status) -}) + stream.on('update', (status: Entity.Status) => { + console.log(status) + }) -stream.on('notification', (notification: Entity.Notification) => { - console.log(notification) -}) + stream.on('notification', (notification: Entity.Notification) => { + console.log(notification) + }) -stream.on('delete', (id: number) => { - console.log(id) -}) + stream.on('delete', (id: number) => { + console.log(id) + }) -stream.on('error', (err: Error) => { - console.error(err) -}) + stream.on('error', (err: Error) => { + console.error(err) + }) -stream.on('status_update', (status: Entity.Status) => { - console.log('updated: ', status.url) -}) + stream.on('status_update', (status: Entity.Status) => { + console.log('updated: ', status.url) + }) -stream.on('heartbeat', () => { - console.log('thump.') -}) + stream.on('heartbeat', () => { + console.log('thump.') + }) -stream.on('close', () => { - console.log('close') -}) + stream.on('close', () => { + console.log('close') + }) -stream.on('parser-error', (err: Error) => { - console.error(err) -}) + stream.on('parser-error', (err: Error) => { + console.error(err) + }) -setTimeout(() => { - stream.removeAllListeners() - stream.stop() - console.log('closed') -}, 100000) + setTimeout(() => { + stream.removeAllListeners() + stream.stop() + console.log('closed') + }, 100000) +}) diff --git a/megalodon/src/pleroma.ts b/megalodon/src/pleroma.ts index 2f36fedfe..fe986f501 100644 --- a/megalodon/src/pleroma.ts +++ b/megalodon/src/pleroma.ts @@ -3201,32 +3201,32 @@ export default class Pleroma implements MegalodonInterface { } public async userStreaming(): Promise { - const url = this.streamingURL() + const url = await this.streamingURL() return this.client.socket(`${url}/api/v1/streaming`, 'user') } public async publicStreaming(): Promise { - const url = this.streamingURL() + const url = await this.streamingURL() return this.client.socket(`${url}/api/v1/streaming`, 'public') } public async localStreaming(): Promise { - const url = this.streamingURL() + const url = await this.streamingURL() return this.client.socket(`${url}/api/v1/streaming`, 'public:local') } public async tagStreaming(tag: string): Promise { - const url = this.streamingURL() + const url = await this.streamingURL() return this.client.socket(`${url}/api/v1/streaming`, 'hashtag', `tag=${tag}`) } public async listStreaming(list_id: string): Promise { - const url = this.streamingURL() + const url = await this.streamingURL() return this.client.socket(`${url}/api/v1/streaming`, 'list', `list=${list_id}`) } public async directStreaming(): Promise { - const url = this.streamingURL() + const url = await this.streamingURL() return this.client.socket(`${url}/api/v1/streaming`, 'direct') } }