diff --git a/package.json b/package.json index a8cb86c11..1ce4f5710 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "masto", "description": "Mastodon API client for JavaScript, TypeScript, Node.js, browsers", "private": false, - "version": "4.4.1", + "version": "4.5.0-rc1", "author": "Ryo Igarashi ", "license": "AGPL-3.0", "main": "./dist/index.js", diff --git a/src/clients/admin.ts b/src/clients/admin.ts index 351decb56..7e7a3be64 100644 --- a/src/clients/admin.ts +++ b/src/clients/admin.ts @@ -1,3 +1,4 @@ +import { MastoConfig } from '../config'; import { Http } from '../http'; import { AdminRepositories } from '../repositories'; @@ -5,15 +6,21 @@ export class MastoAdminClient { readonly account: AdminRepositories.AccountRepository; readonly report: AdminRepositories.ReportRepository; - constructor(private readonly http: Http, private readonly version: string) { + constructor( + private readonly http: Http, + private readonly version: string, + private readonly config: MastoConfig, + ) { this.account = new AdminRepositories.AccountRepository( this.http, this.version, + this.config, ); this.report = new AdminRepositories.ReportRepository( this.http, this.version, + this.config, ); } } diff --git a/src/clients/masto.ts b/src/clients/masto.ts index d0ef58328..16d8a256c 100644 --- a/src/clients/masto.ts +++ b/src/clients/masto.ts @@ -95,50 +95,112 @@ export class MastoClient { private readonly http: Http, private readonly ws: Ws, readonly version: string, - private readonly config: MastoConfig, + readonly config: MastoConfig, ) { - this.admin = new MastoAdminClient(this.http, this.version); - this.stream = new StreamRepository(this.ws, this.version); - this.accounts = new AccountRepository(this.http, this.version); - this.announcements = new AnnouncementRepository(this.http, this.version); - this.apps = new AppRepository(this.http, this.version); - this.blocks = new BlockRepository(this.http, this.version); - this.bookmarks = new BookmarkRepository(this.http, this.version); - this.conversations = new ConversationRepository(this.http, this.version); - this.customEmojis = new CustomEmojiRepository(this.http, this.version); - this.directory = new DirectoryRepository(this.http, this.version); - this.domainBlocks = new DomainBlockRepository(this.http, this.version); - this.endorsements = new EndorsementRepository(this.http, this.version); - this.favourites = new FavouriteRepository(this.http, this.version); - this.featuredTags = new FeaturedTagRepository(this.http, this.version); - this.filters = new FilterRepository(this.http, this.version); - this.followRequests = new FollowRequestRepository(this.http, this.version); - this.instances = new InstanceRepository(this.http, this.version); - this.lists = new ListRepository(this.http, this.version); - this.markers = new MarkerRepository(this.http, this.version); + this.admin = new MastoAdminClient(this.http, this.version, this.config); + this.stream = new StreamRepository(this.ws, this.version, this.config); + this.accounts = new AccountRepository(this.http, this.version, this.config); + this.announcements = new AnnouncementRepository( + this.http, + this.version, + this.config, + ); + this.apps = new AppRepository(this.http, this.version, this.config); + this.blocks = new BlockRepository(this.http, this.version, this.config); + this.bookmarks = new BookmarkRepository( + this.http, + this.version, + this.config, + ); + this.conversations = new ConversationRepository( + this.http, + this.version, + this.config, + ); + this.customEmojis = new CustomEmojiRepository( + this.http, + this.version, + this.config, + ); + this.directory = new DirectoryRepository( + this.http, + this.version, + this.config, + ); + this.domainBlocks = new DomainBlockRepository( + this.http, + this.version, + this.config, + ); + this.endorsements = new EndorsementRepository( + this.http, + this.version, + this.config, + ); + this.favourites = new FavouriteRepository( + this.http, + this.version, + this.config, + ); + this.featuredTags = new FeaturedTagRepository( + this.http, + this.version, + this.config, + ); + this.filters = new FilterRepository(this.http, this.version, this.config); + this.followRequests = new FollowRequestRepository( + this.http, + this.version, + this.config, + ); + this.instances = new InstanceRepository( + this.http, + this.version, + this.config, + ); + this.lists = new ListRepository(this.http, this.version, this.config); + this.markers = new MarkerRepository(this.http, this.version, this.config); this.mediaAttachments = new MediaAttachmentRepository( this.http, this.version, - this.config.timeout, + this.config, + ); + this.mutes = new MuteRepository(this.http, this.version, this.config); + this.notifications = new NotificationsRepository( + this.http, + this.version, + this.config, + ); + this.poll = new PollRepository(this.http, this.version, this.config); + this.preferences = new PreferenceRepository( + this.http, + this.version, + this.config, ); - this.mutes = new MuteRepository(this.http, this.version); - this.notifications = new NotificationsRepository(this.http, this.version); - this.poll = new PollRepository(this.http, this.version); - this.preferences = new PreferenceRepository(this.http, this.version); this.pushSubscriptions = new PushSubscriptionsRepository( this.http, this.version, + this.config, ); - this.reports = new ReportRepository(this.http, this.version); + this.reports = new ReportRepository(this.http, this.version, this.config); this.scheduledStatuses = new ScheduledStatusesRepository( this.http, this.version, + this.config, + ); + this.statuses = new StatusRepository(this.http, this.version, this.config); + this.suggestions = new SuggestionRepository( + this.http, + this.version, + this.config, + ); + this.timelines = new TimelinesRepository( + this.http, + this.version, + this.config, ); - this.statuses = new StatusRepository(this.http, this.version); - this.suggestions = new SuggestionRepository(this.http, this.version); - this.timelines = new TimelinesRepository(this.http, this.version); - this.trends = new TrendRepository(this.http, this.version); - this.email = new EmailRepository(this.http, this.version); + this.trends = new TrendRepository(this.http, this.version, this.config); + this.email = new EmailRepository(this.http, this.version, this.config); } /** diff --git a/src/config.ts b/src/config.ts index cfe4c165d..c5935e296 100644 --- a/src/config.ts +++ b/src/config.ts @@ -17,4 +17,7 @@ export interface MastoConfig { readonly timeout?: number; readonly headers?: { [key: string]: string }; readonly proxy?: MastoProxyConfig; + readonly disableVersionCheck?: boolean; + readonly disableDeprecatedWarning?: boolean; + readonly disableExperimentalWarning?: boolean; } diff --git a/src/decorators/deprecated.ts b/src/decorators/deprecated.ts index 9c11eb6aa..1f04a4c5a 100644 --- a/src/decorators/deprecated.ts +++ b/src/decorators/deprecated.ts @@ -1,3 +1,12 @@ +import { MastoConfig } from '../config'; + +interface Target { + readonly config: MastoConfig; +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +type Fn = (...args: any[]) => any; + /** * Decorator that verifies the version of the Mastodon instance * @param parameters Optional params @@ -5,29 +14,27 @@ export const deprecated = (message: string) => ( - _obj: unknown, + _target: Target, name: string | symbol, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - descriptor: TypedPropertyDescriptor<(...args: any[]) => any>, + descriptor: TypedPropertyDescriptor, ) => { - const original = descriptor.value; - - if (!original) { - throw new Error('available can only apply to a method of a class'); + const origin = descriptor.value; + if (!origin) { + throw new Error('deprecated can only apply to a method of a class'); } descriptor.value = function ( - this: unknown, - ...args: Parameters + this: Target, + ...args: Parameters ) { if ( process.env.NODE_ENV !== 'production' || - !process.env.NODE_IGNORE_MASTO_WARNINGS + !this.config?.disableDeprecatedWarning ) { // eslint-disable-next-line no-console console.warn(`#${name.toString()} is deprecated. ${message}`); } - return original.apply(this, args); + return origin.apply(this, args); }; }; diff --git a/src/decorators/version.ts b/src/decorators/version.ts index 74aeaf229..dd2405215 100644 --- a/src/decorators/version.ts +++ b/src/decorators/version.ts @@ -1,9 +1,11 @@ import semver from 'semver'; +import { MastoConfig } from '../config'; import { MastoNotFoundError } from '../errors'; -export interface Version { +interface Target { readonly version: string; + readonly config: MastoConfig; } export interface AvailableParams { @@ -11,28 +13,29 @@ export interface AvailableParams { until?: `${number}.${number}.${number}`; } +// eslint-disable-next-line @typescript-eslint/no-explicit-any +type Fn = (...args: any[]) => any; + /** * Decorator that verifies the version of the Mastodon instance * @param parameters Optional params */ export const version = ({ since, until }: AvailableParams) => - ( - _version: Version, - name: string | symbol, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - descriptor: TypedPropertyDescriptor<(...args: any[]) => any>, - ) => { - const original = descriptor.value; - - if (!original) { - throw new Error('available can only apply to a method of a class'); + (_target: Target, name: string, descriptor: TypedPropertyDescriptor) => { + const origin = descriptor.value; + if (!origin) { + throw new Error('version can only apply to a method of a class'); } descriptor.value = function ( - this: Version, - ...args: Parameters + this: Target, + ...args: Parameters ) { + if (this.config.disableVersionCheck) { + return origin.apply(this, args); + } + if (since && semver.lt(this.version, since, { loose: true })) { throw new MastoNotFoundError( `${String(name)} is not available with the current ` + @@ -49,6 +52,6 @@ export const version = ); } - return original.apply(this, args); + return origin.apply(this, args); }; }; diff --git a/src/entrypoints/fetch.ts b/src/entrypoints/fetch.ts index e168929e8..d9ea25d37 100644 --- a/src/entrypoints/fetch.ts +++ b/src/entrypoints/fetch.ts @@ -6,7 +6,7 @@ import { SerializerNativeImpl } from '../serializers'; import { WsNodejsImpl } from '../ws'; export const login = async (config: MastoConfig): Promise => { - if (!process.env.NODE_IGNORE_MASTO_WARNINGS) { + if (!config.disableExperimentalWarning) { // eslint-disable-next-line no-console console.warn( 'You are using experimental Fetch API. Please consider using Axios instead until it is fully supported.', @@ -15,7 +15,7 @@ export const login = async (config: MastoConfig): Promise => { const serializer = new SerializerNativeImpl(); const http = new HttpNativeImpl(config, serializer); - const instance = await new InstanceRepository(http, '1.0.0').fetch(); + const instance = await new InstanceRepository(http, '1.0.0', config).fetch(); const ws = new WsNodejsImpl( instance.urls.streamingApi, instance.version, diff --git a/src/entrypoints/nodejs.ts b/src/entrypoints/nodejs.ts index b07c75475..efa2207ac 100644 --- a/src/entrypoints/nodejs.ts +++ b/src/entrypoints/nodejs.ts @@ -8,17 +8,19 @@ import { SerializerNodejsImpl } from '../serializers'; import { WsNodejsImpl } from '../ws'; export const login = async (config: MastoConfig): Promise => { + const version = 'yay yay'; + const serializer = new SerializerNodejsImpl(); const http = new HttpAxiosImpl(config, serializer); - const instance = await new InstanceRepository(http, '1.0.0').fetch(); + const instance = await new InstanceRepository(http, '1.0.0', config).fetch(); const ws = new WsNodejsImpl( instance.urls.streamingApi, - instance.version, + version, config, serializer, ); - return new MastoClient(http, ws, instance.version, config); + return new MastoClient(http, ws, version, config); }; export * from '../decorators'; diff --git a/src/repositories/__tests__/email-repository.spec.ts b/src/repositories/__tests__/email-repository.spec.ts index b645dba6e..4b283d502 100644 --- a/src/repositories/__tests__/email-repository.spec.ts +++ b/src/repositories/__tests__/email-repository.spec.ts @@ -3,7 +3,9 @@ import { EmailRepository } from '../email-repository'; describe('email', () => { const mockHttp = new HttpMockImpl(); - const email = new EmailRepository(mockHttp, '999.0.0'); + const email = new EmailRepository(mockHttp, '999.0.0', { + url: 'https://example.com', + }); test('create confirmations', () => { email.createConfirmation({ email: 'foo@example.com' }); diff --git a/src/repositories/__tests__/status-repository.spec.ts b/src/repositories/__tests__/status-repository.spec.ts index 9d8f55ad1..2319752e6 100644 --- a/src/repositories/__tests__/status-repository.spec.ts +++ b/src/repositories/__tests__/status-repository.spec.ts @@ -1,9 +1,16 @@ -import { httpDelete, httpGet, HttpMockImpl, httpPost } from '../../http/http-mock-impl'; +import { + httpDelete, + httpGet, + HttpMockImpl, + httpPost, +} from '../../http/http-mock-impl'; import { StatusRepository } from '../status-repository'; describe('status', () => { const mockHttp = new HttpMockImpl(); - const status = new StatusRepository(mockHttp, '999.0.0'); + const status = new StatusRepository(mockHttp, '999.0.0', { + url: 'https://example.com', + }); beforeEach(() => { mockHttp.clear(); @@ -22,7 +29,7 @@ describe('status', () => { expect(httpPost.mock.calls[0][1]).toStrictEqual({ status: 'hello', }); - }) + }); test('type checks', () => { status.create({ @@ -33,7 +40,7 @@ describe('status', () => { // Status can be null when mediaIds provided status.create({ - mediaIds: ['123123'] + mediaIds: ['123123'], }); // @ts-expect-error: Status cannot be null when mediaIds are not provided diff --git a/src/repositories/account-repository.ts b/src/repositories/account-repository.ts index 1e0057bb2..fe38ec3f8 100644 --- a/src/repositories/account-repository.ts +++ b/src/repositories/account-repository.ts @@ -1,3 +1,4 @@ +import { MastoConfig } from '../config'; import { version } from '../decorators/version'; import type { Account, @@ -95,7 +96,11 @@ export interface LookupAccountParams { export class AccountRepository implements Repository { - constructor(private readonly http: Http, readonly version: string) {} + constructor( + private readonly http: Http, + readonly version: string, + readonly config: MastoConfig, + ) {} /** * View information about a profile. diff --git a/src/repositories/admin/account-repository.ts b/src/repositories/admin/account-repository.ts index 933eea2e4..c5d17d891 100644 --- a/src/repositories/admin/account-repository.ts +++ b/src/repositories/admin/account-repository.ts @@ -1,3 +1,4 @@ +import { MastoConfig } from '../../config'; import { version } from '../../decorators'; import { Admin } from '../../entities'; import { Http } from '../../http'; @@ -52,7 +53,11 @@ export interface AdminActionAccountParams { } export class AccountRepository { - constructor(private readonly http: Http, readonly version: string) {} + constructor( + private readonly http: Http, + readonly version: string, + readonly config: MastoConfig, + ) {} /** * View accounts matching certain criteria for filtering, up to 100 at a time. @@ -85,7 +90,10 @@ export class AccountRepository { * @see https://docs.joinmastodon.org/methods/admin/ */ @version({ since: '2.9.1' }) - createAction(id: string, params: AdminActionAccountParams): Promise { + createAction( + id: string, + params: AdminActionAccountParams, + ): Promise { return this.http.post(`/api/v1/admin/accounts/${id}/action`, params); } diff --git a/src/repositories/admin/report-repository.ts b/src/repositories/admin/report-repository.ts index cd3c9675c..a767b4a9a 100644 --- a/src/repositories/admin/report-repository.ts +++ b/src/repositories/admin/report-repository.ts @@ -1,3 +1,4 @@ +import { MastoConfig } from '../../config'; import { version } from '../../decorators'; import { Admin } from '../../entities'; import { Http } from '../../http'; @@ -10,7 +11,11 @@ export interface AdminFetchReportsParams { } export class ReportRepository { - constructor(private readonly http: Http, readonly version: string) {} + constructor( + private readonly http: Http, + readonly version: string, + readonly config: MastoConfig, + ) {} /** * View all reports. Pagination may be done with HTTP Link header in the response. diff --git a/src/repositories/announcement-repository.ts b/src/repositories/announcement-repository.ts index 0afe63737..4fa2fae41 100644 --- a/src/repositories/announcement-repository.ts +++ b/src/repositories/announcement-repository.ts @@ -1,10 +1,15 @@ +import { MastoConfig } from '../config'; import { version } from '../decorators'; import { Announcement, Reaction } from '../entities'; import { Http } from '../http'; import { Repository } from '../repository'; export class AnnouncementRepository implements Repository { - constructor(private readonly http: Http, readonly version: string) {} + constructor( + private readonly http: Http, + readonly version: string, + readonly config: MastoConfig, + ) {} /** * Fetch announcements diff --git a/src/repositories/app-repository.ts b/src/repositories/app-repository.ts index adcbf322f..d3575f71f 100644 --- a/src/repositories/app-repository.ts +++ b/src/repositories/app-repository.ts @@ -1,3 +1,4 @@ +import { MastoConfig } from '../config'; import { version } from '../decorators'; import type { Client } from '../entities'; import type { Http } from '../http'; @@ -19,7 +20,11 @@ export interface CreateAppParams { } export class AppRepository implements Repository { - constructor(private readonly http: Http, readonly version: string) {} + constructor( + private readonly http: Http, + readonly version: string, + readonly config: MastoConfig, + ) {} /** * Create a new application to obtain OAuth2 credentials. diff --git a/src/repositories/block-repository.ts b/src/repositories/block-repository.ts index ffefa2e4c..403a7da61 100644 --- a/src/repositories/block-repository.ts +++ b/src/repositories/block-repository.ts @@ -1,3 +1,4 @@ +import { MastoConfig } from '../config'; import { version } from '../decorators'; import { Account } from '../entities'; import { Http } from '../http'; @@ -5,7 +6,11 @@ import { Paginator } from '../paginator'; import { DefaultPaginationParams, Repository } from '../repository'; export class BlockRepository implements Repository { - constructor(private readonly http: Http, readonly version: string) {} + constructor( + private readonly http: Http, + readonly version: string, + readonly config: MastoConfig, + ) {} async *[Symbol.asyncIterator]() { yield* this.getIterator(); diff --git a/src/repositories/bookmark-repository.ts b/src/repositories/bookmark-repository.ts index 2c7a140a6..547c1b746 100644 --- a/src/repositories/bookmark-repository.ts +++ b/src/repositories/bookmark-repository.ts @@ -1,3 +1,4 @@ +import { MastoConfig } from '../config'; import { version } from '../decorators'; import { Status } from '../entities'; import { Http } from '../http'; @@ -5,7 +6,11 @@ import { Paginator } from '../paginator'; import { DefaultPaginationParams, Repository } from '../repository'; export class BookmarkRepository implements Repository { - constructor(private readonly http: Http, readonly version: string) {} + constructor( + private readonly http: Http, + readonly version: string, + readonly config: MastoConfig, + ) {} async *[Symbol.asyncIterator]() { yield* this.getIterator(); diff --git a/src/repositories/conversation-repository.ts b/src/repositories/conversation-repository.ts index 96631b304..c4a2e4dd1 100644 --- a/src/repositories/conversation-repository.ts +++ b/src/repositories/conversation-repository.ts @@ -1,3 +1,4 @@ +import { MastoConfig } from '../config'; import { version } from '../decorators'; import { Conversation } from '../entities'; import { Http } from '../http'; @@ -5,7 +6,11 @@ import { Paginator } from '../paginator'; import { DefaultPaginationParams, Repository } from '../repository'; export class ConversationRepository implements Repository { - constructor(private readonly http: Http, readonly version: string) {} + constructor( + private readonly http: Http, + readonly version: string, + readonly config: MastoConfig, + ) {} async *[Symbol.asyncIterator]() { yield* this.getIterator(); diff --git a/src/repositories/custom-emoji-repository.ts b/src/repositories/custom-emoji-repository.ts index 96040d6cb..09c7c5b37 100644 --- a/src/repositories/custom-emoji-repository.ts +++ b/src/repositories/custom-emoji-repository.ts @@ -1,10 +1,15 @@ +import { MastoConfig } from '../config'; import { version } from '../decorators'; import { Emoji } from '../entities'; import { Http } from '../http'; import { Repository } from '../repository'; export class CustomEmojiRepository implements Repository { - constructor(private readonly http: Http, readonly version: string) {} + constructor( + private readonly http: Http, + readonly version: string, + readonly config: MastoConfig, + ) {} /** * Returns custom emojis that are available on the server. diff --git a/src/repositories/directory-repository.ts b/src/repositories/directory-repository.ts index 2e9a08f20..d6c6bccef 100644 --- a/src/repositories/directory-repository.ts +++ b/src/repositories/directory-repository.ts @@ -1,3 +1,4 @@ +import { MastoConfig } from '../config'; import { version } from '../decorators'; import { Account } from '../entities'; import { Http } from '../http'; @@ -19,7 +20,11 @@ export interface FetchDirectoryParams { export class DirectoryRepository implements Repository { - constructor(private readonly http: Http, readonly version: string) {} + constructor( + private readonly http: Http, + readonly version: string, + readonly config: MastoConfig, + ) {} /** * List accounts visible in the directory. diff --git a/src/repositories/domain-block-repository.ts b/src/repositories/domain-block-repository.ts index afa7d04ea..23767d14f 100644 --- a/src/repositories/domain-block-repository.ts +++ b/src/repositories/domain-block-repository.ts @@ -1,10 +1,15 @@ +import { MastoConfig } from '../config'; import { version } from '../decorators'; import { Http } from '../http'; import { Paginator } from '../paginator'; import { DefaultPaginationParams, Repository } from '../repository'; export class DomainBlockRepository implements Repository { - constructor(private readonly http: Http, readonly version: string) {} + constructor( + private readonly http: Http, + readonly version: string, + readonly config: MastoConfig, + ) {} async *[Symbol.asyncIterator]() { yield* this.getIterator(); diff --git a/src/repositories/email-repository.ts b/src/repositories/email-repository.ts index a3c3b0c31..931dfd117 100644 --- a/src/repositories/email-repository.ts +++ b/src/repositories/email-repository.ts @@ -1,3 +1,4 @@ +import { MastoConfig } from '../config'; import { Http } from '../http'; export interface CreateConfirmationParams { @@ -5,7 +6,11 @@ export interface CreateConfirmationParams { } export class EmailRepository { - constructor(private readonly http: Http, readonly version: string) {} + constructor( + private readonly http: Http, + readonly version: string, + readonly config: MastoConfig, + ) {} createConfirmation(params?: CreateConfirmationParams): Promise { return this.http.post('/api/v1/email/confirmations', params); diff --git a/src/repositories/endorsement-repository.ts b/src/repositories/endorsement-repository.ts index 02591142d..f58f2561d 100644 --- a/src/repositories/endorsement-repository.ts +++ b/src/repositories/endorsement-repository.ts @@ -1,3 +1,4 @@ +import { MastoConfig } from '../config'; import { version } from '../decorators'; import { Account } from '../entities'; import { Http } from '../http'; @@ -5,7 +6,11 @@ import { Paginator } from '../paginator'; import { DefaultPaginationParams, Repository } from '../repository'; export class EndorsementRepository implements Repository { - constructor(private readonly http: Http, readonly version: string) {} + constructor( + private readonly http: Http, + readonly version: string, + readonly config: MastoConfig, + ) {} async *[Symbol.asyncIterator]() { yield* this.getIterator(); diff --git a/src/repositories/favourite-repository.ts b/src/repositories/favourite-repository.ts index b6dae065a..49566ce5d 100644 --- a/src/repositories/favourite-repository.ts +++ b/src/repositories/favourite-repository.ts @@ -1,3 +1,4 @@ +import { MastoConfig } from '../config'; import { version } from '../decorators'; import { Status } from '../entities'; import { Http } from '../http'; @@ -5,7 +6,11 @@ import { Paginator } from '../paginator'; import { DefaultPaginationParams, Repository } from '../repository'; export class FavouriteRepository implements Repository { - constructor(private readonly http: Http, readonly version: string) {} + constructor( + private readonly http: Http, + readonly version: string, + readonly config: MastoConfig, + ) {} async *[Symbol.asyncIterator]() { yield* this.getIterator(); diff --git a/src/repositories/featured-tag-repository.ts b/src/repositories/featured-tag-repository.ts index c84385fdb..54f55fb8a 100644 --- a/src/repositories/featured-tag-repository.ts +++ b/src/repositories/featured-tag-repository.ts @@ -1,3 +1,4 @@ +import { MastoConfig } from '../config'; import { version } from '../decorators'; import { FeaturedTag, Tag } from '../entities'; import { Http } from '../http'; @@ -9,7 +10,11 @@ export interface CreateFeaturedTagParams { } export class FeaturedTagRepository implements Repository { - constructor(private readonly http: Http, readonly version: string) {} + constructor( + private readonly http: Http, + readonly version: string, + readonly config: MastoConfig, + ) {} /** * View your featured tags diff --git a/src/repositories/filter-repository.ts b/src/repositories/filter-repository.ts index e3fec986c..f25d1caf8 100644 --- a/src/repositories/filter-repository.ts +++ b/src/repositories/filter-repository.ts @@ -1,3 +1,4 @@ +import { MastoConfig } from '../config'; import { version } from '../decorators'; import { Filter, FilterContext } from '../entities'; import { Http } from '../http'; @@ -24,7 +25,11 @@ export type UpdateFilterParams = CreateFilterParams; export class FilterRepository implements Repository { - constructor(private readonly http: Http, readonly version: string) {} + constructor( + private readonly http: Http, + readonly version: string, + readonly config: MastoConfig, + ) {} /** * View all filters diff --git a/src/repositories/follow-request-repository.ts b/src/repositories/follow-request-repository.ts index 212b064e8..9c5afedb1 100644 --- a/src/repositories/follow-request-repository.ts +++ b/src/repositories/follow-request-repository.ts @@ -1,3 +1,4 @@ +import { MastoConfig } from '../config'; import { version } from '../decorators'; import { Account } from '../entities'; import { Http } from '../http'; @@ -5,7 +6,11 @@ import { Paginator } from '../paginator'; import { DefaultPaginationParams, Repository } from '../repository'; export class FollowRequestRepository implements Repository { - constructor(private readonly http: Http, readonly version: string) {} + constructor( + private readonly http: Http, + readonly version: string, + readonly config: MastoConfig, + ) {} async *[Symbol.asyncIterator]() { yield* this.getIterator(); diff --git a/src/repositories/instance-repository.ts b/src/repositories/instance-repository.ts index 38da727b5..95ece1c6e 100644 --- a/src/repositories/instance-repository.ts +++ b/src/repositories/instance-repository.ts @@ -1,10 +1,15 @@ +import { MastoConfig } from '../config'; import { version } from '../decorators'; import { Activity, Instance } from '../entities'; import { Http } from '../http'; import { Repository } from '../repository'; export class InstanceRepository implements Repository { - constructor(private readonly http: Http, readonly version: string) {} + constructor( + private readonly http: Http, + readonly version: string, + readonly config: MastoConfig, + ) {} /** * Information about the server. diff --git a/src/repositories/list-repository.ts b/src/repositories/list-repository.ts index 3ed2c8af9..f9f85f74e 100644 --- a/src/repositories/list-repository.ts +++ b/src/repositories/list-repository.ts @@ -1,3 +1,4 @@ +import { MastoConfig } from '../config'; import { version } from '../decorators'; import { Account, List } from '../entities'; import { Http } from '../http'; @@ -17,7 +18,11 @@ export interface ModifyListAccountsParams { export class ListRepository implements Repository { - constructor(private readonly http: Http, readonly version: string) {} + constructor( + private readonly http: Http, + readonly version: string, + readonly config: MastoConfig, + ) {} /** * Fetch the list with the given ID. Used for verifying the title of a list. diff --git a/src/repositories/marker-repository.ts b/src/repositories/marker-repository.ts index 3e02a9006..9e8236ce1 100644 --- a/src/repositories/marker-repository.ts +++ b/src/repositories/marker-repository.ts @@ -1,3 +1,4 @@ +import { MastoConfig } from '../config'; import { version } from '../decorators'; import { Marker, MarkerItem, MarkerTimeline } from '../entities'; import { Http } from '../http'; @@ -20,7 +21,11 @@ export type CreateMarkersParams = { export class MarkerRepository implements Repository { - constructor(private readonly http: Http, readonly version: string) {} + constructor( + private readonly http: Http, + readonly version: string, + readonly config: MastoConfig, + ) {} /** * Get saved timeline position diff --git a/src/repositories/media-attachment-repository.ts b/src/repositories/media-attachment-repository.ts index d781d8286..33f88e4b1 100644 --- a/src/repositories/media-attachment-repository.ts +++ b/src/repositories/media-attachment-repository.ts @@ -1,3 +1,4 @@ +import { MastoConfig } from '../config'; import { deprecated, version } from '../decorators'; import { Attachment } from '../entities'; import { Http } from '../http'; @@ -31,7 +32,7 @@ export class MediaAttachmentRepository constructor( private readonly http: Http, readonly version: string, - readonly timeout?: number, + readonly config: MastoConfig, ) {} /** @@ -56,7 +57,7 @@ export class MediaAttachmentRepository return media; })(), - this.timeout ?? 3000, + this.config.timeout ?? 3000, ); } diff --git a/src/repositories/mutes-repository.ts b/src/repositories/mutes-repository.ts index efeba5cae..b89540526 100644 --- a/src/repositories/mutes-repository.ts +++ b/src/repositories/mutes-repository.ts @@ -1,3 +1,4 @@ +import { MastoConfig } from '../config'; import { version } from '../decorators'; import { Account } from '../entities'; import { Http } from '../http'; @@ -5,7 +6,11 @@ import { Paginator } from '../paginator'; import { DefaultPaginationParams, Repository } from '../repository'; export class MuteRepository implements Repository { - constructor(private readonly http: Http, readonly version: string) {} + constructor( + private readonly http: Http, + readonly version: string, + readonly config: MastoConfig, + ) {} async *[Symbol.asyncIterator]() { yield* this.getIterator(); diff --git a/src/repositories/notification-repository.ts b/src/repositories/notification-repository.ts index 92ce23314..8fe5bbf64 100644 --- a/src/repositories/notification-repository.ts +++ b/src/repositories/notification-repository.ts @@ -1,3 +1,4 @@ +import { MastoConfig } from '../config'; import { version } from '../decorators'; import { Notification, NotificationType } from '../entities'; import { Http } from '../http'; @@ -14,7 +15,11 @@ export interface FetchNotificationsParams extends DefaultPaginationParams { } export class NotificationsRepository implements Repository { - constructor(private readonly http: Http, readonly version: string) {} + constructor( + private readonly http: Http, + readonly version: string, + readonly config: MastoConfig, + ) {} async *[Symbol.asyncIterator]() { yield* this.getIterator(); diff --git a/src/repositories/poll-repository.ts b/src/repositories/poll-repository.ts index ba83b1398..74dddf753 100644 --- a/src/repositories/poll-repository.ts +++ b/src/repositories/poll-repository.ts @@ -1,3 +1,4 @@ +import { MastoConfig } from '../config'; import { version } from '../decorators'; import { Poll } from '../entities'; import { Http } from '../http'; @@ -9,7 +10,11 @@ export interface VotePollParams { } export class PollRepository implements Repository { - constructor(private readonly http: Http, readonly version: string) {} + constructor( + private readonly http: Http, + readonly version: string, + readonly config: MastoConfig, + ) {} /** * View a poll * @param id ID of the poll in the database diff --git a/src/repositories/preferences-repository.ts b/src/repositories/preferences-repository.ts index 89476b2ce..7ce0a8bf9 100644 --- a/src/repositories/preferences-repository.ts +++ b/src/repositories/preferences-repository.ts @@ -1,10 +1,15 @@ +import { MastoConfig } from '../config'; import { version } from '../decorators'; import { Preference } from '../entities'; import { Http } from '../http'; import { Repository } from '../repository'; export class PreferenceRepository implements Repository { - constructor(private readonly http: Http, readonly version: string) {} + constructor( + private readonly http: Http, + readonly version: string, + readonly config: MastoConfig, + ) {} /** * Preferences defined by the user in their account settings. diff --git a/src/repositories/push-subscription-repository.ts b/src/repositories/push-subscription-repository.ts index 49d11deee..89b31b857 100644 --- a/src/repositories/push-subscription-repository.ts +++ b/src/repositories/push-subscription-repository.ts @@ -1,3 +1,4 @@ +import { MastoConfig } from '../config'; import { version } from '../decorators'; import { PushSubscription, PushSubscriptionAlerts } from '../entities'; import { Http } from '../http'; @@ -36,7 +37,11 @@ export class PushSubscriptionsRepository UpdatePushSubscriptionParams > { - constructor(private readonly http: Http, readonly version: string) {} + constructor( + private readonly http: Http, + readonly version: string, + readonly config: MastoConfig, + ) {} /** * Add a Web Push API subscription to receive notifications. diff --git a/src/repositories/report-repository.ts b/src/repositories/report-repository.ts index 2bf94cba6..ef693f746 100644 --- a/src/repositories/report-repository.ts +++ b/src/repositories/report-repository.ts @@ -1,3 +1,4 @@ +import { MastoConfig } from '../config'; import { version } from '../decorators'; import { Http } from '../http'; @@ -19,7 +20,11 @@ export interface ReportAccountParams { } export class ReportRepository { - constructor(private readonly http: Http, readonly version: string) {} + constructor( + private readonly http: Http, + readonly version: string, + readonly config: MastoConfig, + ) {} /** * File a report diff --git a/src/repositories/scheduled-statuses-repository.ts b/src/repositories/scheduled-statuses-repository.ts index 09bf76bb8..343d98d91 100644 --- a/src/repositories/scheduled-statuses-repository.ts +++ b/src/repositories/scheduled-statuses-repository.ts @@ -1,3 +1,4 @@ +import { MastoConfig } from '../config'; import { version } from '../decorators'; import { ScheduledStatus } from '../entities'; import { Http } from '../http'; @@ -12,7 +13,11 @@ export interface UpdateScheduledStatusParams { export class ScheduledStatusesRepository implements AsyncIterable { - constructor(private readonly http: Http, readonly version: string) {} + constructor( + private readonly http: Http, + readonly version: string, + readonly config: MastoConfig, + ) {} async *[Symbol.asyncIterator]() { yield* this.getIterator(); diff --git a/src/repositories/status-repository.ts b/src/repositories/status-repository.ts index 5c8a8a751..4a12b414c 100644 --- a/src/repositories/status-repository.ts +++ b/src/repositories/status-repository.ts @@ -1,3 +1,4 @@ +import { MastoConfig } from '../config'; import { deprecated, version } from '../decorators'; import { Account, @@ -65,7 +66,11 @@ export interface ReblogStatusParams { } export class StatusRepository implements Repository { - constructor(private readonly http: Http, readonly version: string) {} + constructor( + private readonly http: Http, + readonly version: string, + readonly config: MastoConfig, + ) {} /** * View information about a status. diff --git a/src/repositories/stream-repository.ts b/src/repositories/stream-repository.ts index 1754b2153..20d7e2019 100644 --- a/src/repositories/stream-repository.ts +++ b/src/repositories/stream-repository.ts @@ -1,8 +1,13 @@ +import { MastoConfig } from '../config'; import { version } from '../decorators'; import { Ws, WsEvents } from '../ws'; export class StreamRepository { - constructor(private readonly ws: Ws, readonly version: string) {} + constructor( + private readonly ws: Ws, + readonly version: string, + readonly config: MastoConfig, + ) {} /** * Starting home timeline and notification streaming diff --git a/src/repositories/suggestion-repository.ts b/src/repositories/suggestion-repository.ts index d957120c1..16673ef68 100644 --- a/src/repositories/suggestion-repository.ts +++ b/src/repositories/suggestion-repository.ts @@ -1,3 +1,4 @@ +import { MastoConfig } from '../config'; import { version } from '../decorators'; import { Account } from '../entities'; import { Http } from '../http'; @@ -5,7 +6,11 @@ import { Paginator } from '../paginator'; import { DefaultPaginationParams, Repository } from '../repository'; export class SuggestionRepository implements Repository { - constructor(private readonly http: Http, readonly version: string) {} + constructor( + private readonly http: Http, + readonly version: string, + readonly config: MastoConfig, + ) {} async *[Symbol.asyncIterator]() { yield* this.getIterator(); diff --git a/src/repositories/timelines-repository.ts b/src/repositories/timelines-repository.ts index 06d90eefd..165836385 100644 --- a/src/repositories/timelines-repository.ts +++ b/src/repositories/timelines-repository.ts @@ -1,3 +1,4 @@ +import { MastoConfig } from '../config'; import { deprecated, version } from '../decorators'; import { Status } from '../entities'; import { Http } from '../http'; @@ -14,7 +15,11 @@ export interface FetchTimelineParams extends DefaultPaginationParams { } export class TimelinesRepository { - constructor(private readonly http: Http, readonly version: string) {} + constructor( + private readonly http: Http, + readonly version: string, + readonly config: MastoConfig, + ) {} get home(): Paginator { return this.getHomeIterable(); diff --git a/src/repositories/trend-repository.ts b/src/repositories/trend-repository.ts index dabe254f8..df00f57be 100644 --- a/src/repositories/trend-repository.ts +++ b/src/repositories/trend-repository.ts @@ -1,3 +1,4 @@ +import { MastoConfig } from '../config'; import { version } from '../decorators'; import { Link, Status, Tag } from '../entities'; import { Http } from '../http'; @@ -10,7 +11,11 @@ export interface FetchTrendsParams { } export class TrendRepository implements Repository { - constructor(private readonly http: Http, readonly version: string) {} + constructor( + private readonly http: Http, + readonly version: string, + readonly config: MastoConfig, + ) {} get statuses(): Paginator { return this.getStatuses(); diff --git a/src/ws/base-ws.ts b/src/ws/base-ws.ts index 337f56e79..5cc3e0914 100644 --- a/src/ws/base-ws.ts +++ b/src/ws/base-ws.ts @@ -13,6 +13,10 @@ export abstract class BaseWs implements Ws { abstract stream(path: string, params: unknown): Promise; private supportsSecureToken() { + if (this.config.disableVersionCheck) { + return false; + } + // Since v2.8.4, it is supported to pass access token with`Sec-Websocket-Protocol` // https://github.com/tootsuite/mastodon/pull/10818 return ( diff --git a/tsconfig.json b/tsconfig.json index 72cc6c6df..87441f5c9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,7 +3,6 @@ "target": "es5", "module": "es6", "outDir": "./dist", - "baseUrl": "./", "lib": ["es2019", "dom", "esnext.asynciterable"], "declaration": false, "esModuleInterop": true,