Обновление до v4
VK-IO v4 — это следующее мажорное обновление. Ниже приведён список критических изменений, который поможет вам обновиться.
TL;DR
- Были произведены серьёзные изменения в типизации библиотеки
- Библиотека теперь полностью следует immutable принципу.
- Каждый компонент теперь не зависит от основной инстанции
VK
- Убраны лишние компоненты в пользу простых функций (например
resolveResource()
илиcreateCollectIterator()
)
Если ещё короче
Breaking Сhanges
Поддержка Node.js 12 и выше
Библиотека поддерживает теперь только Node.js 12 и выше.
VK
- Удалён геттер/сеттер
vk.token
- Удалён метод
vk.setOptions()
- Удалён сеттер
vk.captchaHandler
, используйте методvk.callbackService.onCaptcha()
- Удалён сеттер
vk.twoFactorHandler
, используйте методvk.callbackService.onTwoFactor()
- Удалён модуль
vk.auth
, используйте вместо этого пакет @vk-io/authorization - Удалён модуль
vk.streaming
, используйте вместо этого пакет @vk-io/streaming - Удалён экспорт по умолчанию, используйте именованный
diff
- import VK from 'vk-io';
+ import { VK } from 'vk-io';
- Удалён
vk.snippets.resolveResource()
, вместо модуля добавлена функцияresolveResource()
Принимает опции вида:
ts
interface IResolveResourceOptions {
resource: string | number;
api?: API;
}
Например
ts
import { resolveResource } from 'vk-io';
const result = await resolveResource({
// Объект API
api,
resource: 'https://vk.com/durov'
});
- Удалён
vk.collect
, модуль разбит на мелкие классы и функции - collect.chain() - используйте класс
new Chain()
- collect.chain() - используйте класс
ts
import { Chain } from 'vk-io';
const chain = new Chain({
// Объект API
api
});
- collect.executes() - используйте функцию
executes()
Принимает опции вида:
- collect.executes() - используйте функцию
ts
interface IExecutesOptions {
api: API;
method: string;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
queue: Record<string, any>[];
}
Например
ts
import { executes } from 'vk-io';
const result = await executes({
// Объект API
api,
method: 'users.get',
queue: [
{ user_id: 1 },
{ user_id: 2 },
{ user_id: 3 },
// ...
]
});
- collect..() - используйте функцию
createCollectIterator()
Принимает опции вида:
- collect..() - используйте функцию
ts
interface ICollectIteratorOptions {
api: API;
method: string;
params: Record<string, any> & {
count?: number;
offset?: number;
};
maxCount?: number;
countPerRequest: number;
retryLimit?: number;
parallelRequests?: number;
}
Например
ts
import { createCollectIterator } from 'vk-io';
const iterator = createCollectIterator({
// Объект API
api,
method: 'messages.getConversations',
params: {
// Будет получать profiles и groups
extended: 1
},
// Максимальный count в методе
countPerRequest: 200,
// Устанавливайте опцию для методов которые не позволяет получить больше N данных, например `users.search`
// maxCount: 1000,
// Количество попыток вызвать снова при ошибке
// retryLimit: 3,
// Количество паралельных вызовов если поддерживается execute
// parallelRequests: 25
});
for await (const chunk of iterator) {
// chunk.received
// chunk.percent
// chunk.total
// chunk.items
// chunk.profiles
// chunk.groups
}
API
- Переименование опции apiAttempts в apiRetryLimit
- Удалён геттер
vk.api.API_VERSION
- Enum
APIErrorCode
теперь автоматический генерируется из схемы - Объкты схемы теперь экспортируются в своих namespace
Params
,Objects
иResponses
- Удалена автоматическая верификация аккаунта, используйте
@vk-io/authorization
классAccountVerification
- Удалена автоматическая установка
random_id
вapi.messages.send()
, используйте вместо этого функциюgetRandomId()
ts
import { getRandomId } from 'vk-io';
const result = await api.messages.send({
peer_id: 1234,
random_id: getRandomId(),
text: 'Hello!'
});
APIRequest
- Конструктор теперь принимает опции вида:
ts
interface IAPIRequestOptions {
api: API;
method: string;
params: Record<string, any>;
}
- Удалён алиас
Request
, используйтеAPIRequest
Attachment & ExternalAttachment
- Конструктор теперь принимает опции вида:
ts
interface ISharedAttachmentPayload {
id: number;
owner_id: number;
access_key?: string;
}
interface IAttachmentOptions<P, Type extends string = string> {
api: API;
type: Type;
payload: Partial<ISharedAttachmentPayload> & P;
}
DocumentAttachment
- Удалён геттер
document.typeName
Context
- Конструктор теперь принимает опции вида:
ts
interface IContextOptions<
P,
S,
Type extends string = string,
SubType extends string = string
> {
api: API;
upload: Upload;
type: Type;
subTypes: SubType[];
payload: P;
state?: S;
source: UpdateSource;
updateType: string | number;
groupId?: number;
}
- Метод
context.is()
принимает теперь массив типов
MessageContext
- Метод
context.send()
теперь возвращает инстанциюMessageContext
- Геттер
context.replyMessage
теперь возвращаетMessageContext
вместоMessageReply
- Геттер
context.forwards
теперь возвращает массивMessageContext
вместоMessageForward
- Изменились входные параметры для методов
context.sendPhotos()
,context.sendDocuments()
,context.sendAudioMessage()
иcontext.sendAudioMessage()
. Теперь они принимают объект.
Было:
ts
context.sendPhotos('./cat.png');
Стало:
ts
context.sendPhotos({
value: './cat.png',
// filename: 'cat.png',
// contentType: 'image/png',
// contentLength: ...
});
// Или
context.sendPhotos({
values: [{
value: './cat.png'
// filename: 'cat.png',
// contentType: 'image/png'
// contentLength: ...
}],
// timeout: 30_000,
// uploadUrl: '...'
});
- Удалён метод
context.getInviteLink()
- Удалён метод
context.markAsImportant()
- Удалён метод
context.renameChat()
- Удалён метод
context.newChatPhoto()
- Удалён метод
context.deleteChatPhoto()
- Удалён метод
context.inviteUser()
- Удалён метод
context.kickUser()
- Удалён метод
context.pinMessage()
- Удалён метод
context.unpinMessage()
- Удалён метод
context.editMessageText()
- Удалён метод
context.sendSticker()
, используйтеcontext.send({ sticker_id: 123 })
CommentActionContext
- Переименован в
CommentContext
CommentContext
- Удалён геттер
context.userId
, используйтеcontext.fromId
- Удалён геттер
context.removerUserId
, используйтеcontext.deleterUserId
MessageFlagsContext
- Переименован подтип
message_flags_update
вmessage_flags_replace
- Переименован подтип
message_flags_set
вmessage_flags_add
- Переименован геттер
context.isChat
вcontext.isFromWebChat
- Переименован геттер
context.isFriends
вcontext.isFriendMessage
- Переименован геттер
context.isSpam
вcontext.isMarkSpam
- Переименован геттер
context.isSpam
вcontext.isUnmarkSpam
- Удалён геттер
context.isFixed
- Удалён геттер
context.isMedia
DialogFlagsContext
- Переименован подтип
dialog_flags_update
вdialog_flags_replace
- Переименован подтип
dialog_flags_set
вdialog_flags_add
RemovedMessagesContext
- Переименован в
DialogMessagesContext
DialogMessagesContext
- Переименован подтип
messages_delete
вdialog_messages_delete
- Переименован подтип
messages_restore
вdialog_messages_restore
- Переименован геттер
context.id
вcontext.localId
- Переименован геттер
context.isRemoved
вcontext.isDelete
- Переименован геттер
context.isRecovery
вcontext.isRestore
UserOnlineContext
- Переименован в
FriendActivityContext
FriendActivityContext
- Переименован подтип
user_online
вfriend_online
- Переименован подтип
user_offline
вfriend_offline
- Переименован геттер
context.isUserOnline
вcontext.isOnline
- Переименован геттер
context.isUserOffline
вcontext.isOffline
- Переименован геттер
context.isSelfExit
вcontext.isSelfLeave
- Переименован геттер
context.isTimeoutExit
вcontext.isTimeoutLeave
- Переименован геттер
context.createdAt
вcontext.eventAt
- Геттер
context.platform
теперь возвращает ID платформы
ReadMessagesContext
- Переименован в
MessagesReadContext
MessagesReadContext
- Переименован подтип
messages_inbox_read
вmessages_read_inbox
- Переименован подтип
messages_outbox_read
вmessages_read_outbox
- Переименован геттер
context.id
вcontext.localId
MessageAllowContext
- Переименован в
MessageSubscriptionContext
MessageSubscriptionContext
- Тип
message_subscribers
переименован вmessage_subscription
Keyboard
- Удалена константа
Keyboard.DEFAULT_COLOR
, используйтеKeyboard.SECONDARY_COLOR
Updates
- Все контексты теперь используют
undefined
вместоnull
для удобной деструктуризации, например:
ts
updates.on('message_new', async (context) => {
const { text = 'default text' } = context;
if (text === 'default text') {
return context.send('Вы ничего не написали');
}
await context.send('Hello!');
});
- Удалён метод
updates.hear()
иupdates.setHearFallbackHandler()
, используйте вместо этого пакет @vk-io/hear - Теперь используются официальные именования событий Например
ts
updates.on('message_new', async (context) => {
await context.send('Hello!');
});
- Удален второй аргумент у
updates.startWebhook()
, вместо этого передавайте функцию в свойствоnext
ts
updates.startWebhook({
// ...
next(req, res) {
// ...
}
})
- Версия polling'а была обновлена до
10
- Переименование опции pollingAttempts в pollingRetryLimit
Upload
- Методы
upload.storiesPhoto()
иupload.storiesVideo()
теперь возвращаютStoryAttachment
- Удалён метод
upload.graffiti()
, используйте вместо негоupload.documentGraffiti()
илиupload.messageGraffiti()
- Изменился формат
source
, теперь он принимает только два интерфейса:
ts
upload.messagePhoto({
source: {
value: 'https://picsum.photos/200/300/?image=1',
// filename: 'image.jpeg',
// contentType: 'image/jpeg'
// contentLength?: number;
}
})
Или
ts
upload.messagePhoto({
source: {
// uploadUrl?: string;
// timeout?: number;
// Свойство values может быть массивом если загрузка в альбом
values: {
value: 'https://picsum.photos/200/300/?image=1',
// filename: 'image.jpeg',
// contentType: 'image/jpeg
// contentLength?: number;
}
}
})
- У элемента в
source
появилось свойствоcontentLength
, позволяет указать размер загружаемого файла
Если вы используете поток, который не предоставляет информации о размере в байтах, вам следует указать свойство
contentLength
, так как иначе файл не будет загружен. Это особенно актуально для методаupload.video()
Callback Service
- Используйте метод
callbackService.onCaptcha()
вместо сеттераcallbackService.captchaHandler
- Используйте метод
callbackService.onTwoFactor()
вместо сеттераcallbackService.twoFactorHandler
Удалённые экспорты
- Удалён экспорт
attachmentTypes
, используйтеAttachmentType
- Удалён экспорт
defaultExtensions
, используйтеDefaultExtension
- Удалён экспорт
defaultContentTypes
, используйтеDefaultContentType
- Удалён экспорт
captchaTypes
, используйтеCaptchaType
- Удалён экспорт
messageSources
, используйтеMessageSource
- Удалён экспорт
resourceTypes
, используйтеResourceType
- Удалён экспорт
updatesSources
, используйтеUpdateSource
- Удалён экспорт
apiErrors
, используйтеAPIErrorCode
- Удалён экспорт
uploadErrors
, используйтеUploadErrorCode
- Удалён экспорт
updatesErrors
, используйтеUpdatesErrorCode
- Удалён экспорт
snippetsErrors
, используйтеResourceErrorCode
- Удалён экспорт
sharedErrors
, используйтеSharedErrorCode