diff --git a/examples/tutorial/package.json b/examples/tutorial/package.json index c09064bc5..c36a02f5c 100644 --- a/examples/tutorial/package.json +++ b/examples/tutorial/package.json @@ -16,7 +16,7 @@ "emoji-mart": "^5.6.0", "react": "^19.2.6", "react-dom": "^19.2.6", - "stream-chat": "10.0.0-rc.2", + "stream-chat": "10.0.0-rc.4", "stream-chat-react": "workspace:^" }, "devDependencies": { diff --git a/examples/vite/package.json b/examples/vite/package.json index 3445639be..1b12bf4a6 100644 --- a/examples/vite/package.json +++ b/examples/vite/package.json @@ -17,7 +17,7 @@ "modern-normalize": "^3.0.1", "react": "^19.2.6", "react-dom": "^19.2.6", - "stream-chat": "10.0.0-rc.2", + "stream-chat": "10.0.0-rc.4", "stream-chat-react": "workspace:^" }, "devDependencies": { diff --git a/package.json b/package.json index 5a401a92f..235a41c1f 100644 --- a/package.json +++ b/package.json @@ -132,7 +132,7 @@ "modern-normalize": "^3.0.1", "react": "^19.0.0 || ^18.0.0 || ^17.0.0", "react-dom": "^19.0.0 || ^18.0.0 || ^17.0.0", - "stream-chat": "10.0.0-rc.2" + "stream-chat": "10.0.0-rc.4" }, "peerDependenciesMeta": { "@breezystack/lamejs": { @@ -202,7 +202,7 @@ "react-dom": "^19.2.6", "sass": "^1.100.0", "semantic-release": "^25.0.3", - "stream-chat": "10.0.0-rc.2", + "stream-chat": "10.0.0-rc.4", "typescript": "^6.0.3", "typescript-eslint": "^8.59.4", "vite": "^8.1.3", diff --git a/src/components/Channel/utils.ts b/src/components/Channel/utils.ts index d37332ea8..8e5d496a2 100644 --- a/src/components/Channel/utils.ts +++ b/src/components/Channel/utils.ts @@ -1,5 +1,5 @@ import { - type APIErrorResponse, + type APIError, type ChannelState, type MessageResponse, StreamAPIError, @@ -75,14 +75,27 @@ export const findInMsgSetByDate = ( } return { index: -1 }; }; +/** + * Builds the `APIError` payload for a synthetic error response, for transport failures + * that never produced one. + */ +const buildErrorResponseData = (message: string, status: number, code = 0): APIError => ({ + code, + details: [], + duration: '', + message, + more_info: '', + status_code: status, +}); + /** * Compatibility adapter: - * LocalMessage.error expects StreamAPIError, but some transport failures + * LocalMessage.error expects StreamAPIError, but some transport failures * (for example Axios ERR_NETWORK while offline) do not have an HTTP response payload. */ export const adaptMessageSendErrorToErrorFromResponse = ( error: unknown, -): StreamAPIError => { +): StreamAPIError => { if (error instanceof StreamAPIError) { return error; } @@ -97,7 +110,7 @@ export const adaptMessageSendErrorToErrorFromResponse = ( code?: unknown; message?: unknown; name?: unknown; - response?: StreamAPIError['response']; + response?: StreamAPIError['response']; status?: unknown; }; @@ -108,20 +121,15 @@ export const adaptMessageSendErrorToErrorFromResponse = ( : 'Network Error'; status = maybeAxiosError.response?.status ?? 0; - return new StreamAPIError(message, { + return new StreamAPIError(message, { code: undefined, response: maybeAxiosError.response ?? ({ // Compatibility shim: this is an intentionally incomplete AxiosResponse-like object. - data: { - duration: '', - message, - more_info: '', - StatusCode: status, - }, + data: buildErrorResponseData(message, status), status, - } as StreamAPIError['response']), + } as StreamAPIError['response']), status, }); } @@ -147,18 +155,13 @@ export const adaptMessageSendErrorToErrorFromResponse = ( } } - return new StreamAPIError(message, { + return new StreamAPIError(message, { code, response: { // Compatibility shim: this is an intentionally incomplete AxiosResponse-like object. - data: { - duration: '', - message, - more_info: '', - StatusCode: status, - }, + data: buildErrorResponseData(message, status, code), status, - } as StreamAPIError['response'], + } as StreamAPIError['response'], status, }); }; diff --git a/src/components/MediaRecorder/AudioRecorder/__tests__/AudioRecorder.test.tsx b/src/components/MediaRecorder/AudioRecorder/__tests__/AudioRecorder.test.tsx index cb2622a78..8627523ef 100644 --- a/src/components/MediaRecorder/AudioRecorder/__tests__/AudioRecorder.test.tsx +++ b/src/components/MediaRecorder/AudioRecorder/__tests__/AudioRecorder.test.tsx @@ -333,7 +333,7 @@ describe('MessageInput', () => { // Mock getAppSettings so the SDK's upload config check doesn't make a real network request vi.spyOn(client, 'getAppSettings').mockResolvedValue(fromPartial({})); const sendFileSpy = vi - .spyOn(channel, 'sendFile') + .spyOn(channel, 'uploadFile') .mockResolvedValue(fromPartial({ file: fileObjectURL })); await renderComponent({ channelStateCtx: { channel }, @@ -366,7 +366,7 @@ describe('MessageInput', () => { // Mock getAppSettings so the SDK's upload config check doesn't make a real network request vi.spyOn(client, 'getAppSettings').mockResolvedValue(fromPartial({})); const sendFileSpy = vi - .spyOn(channel, 'sendFile') + .spyOn(channel, 'uploadFile') .mockResolvedValue(fromPartial({ file: fileObjectURL })); const sendMessageSpy = vi .spyOn(channel, 'sendMessage') @@ -402,7 +402,7 @@ describe('MessageInput', () => { }); vi.spyOn(client, 'getAppSettings').mockResolvedValue({} as AppSettingsAPIResponse); - vi.spyOn(channel, 'sendFile').mockResolvedValue({ + vi.spyOn(channel, 'uploadFile').mockResolvedValue({ file: fileObjectURL, } as SendFileAPIResponse); diff --git a/src/components/MessageComposer/__tests__/MessageInput.test.tsx b/src/components/MessageComposer/__tests__/MessageInput.test.tsx index b9affb295..ffa9840d2 100644 --- a/src/components/MessageComposer/__tests__/MessageInput.test.tsx +++ b/src/components/MessageComposer/__tests__/MessageInput.test.tsx @@ -328,12 +328,12 @@ const setup = async ({ channelData }: { channelData?: GenerateChannelOptions } = channelsData: [channelData ?? mockedChannelData], customUser: user, }); - const sendImageSpy = vi.spyOn(customChannel, 'sendImage').mockResolvedValueOnce( + const sendImageSpy = vi.spyOn(customChannel, 'uploadImage').mockResolvedValueOnce( fromPartial({ file: fileUploadUrl, }), ); - const sendFileSpy = vi.spyOn(customChannel, 'sendFile').mockResolvedValueOnce( + const sendFileSpy = vi.spyOn(customChannel, 'uploadFile').mockResolvedValueOnce( fromPartial({ file: fileUploadUrl, }), @@ -351,13 +351,15 @@ const setupUploadRejected = async (error: unknown) => { channelsData: [mockedChannelData], customUser: user, }); - const sendImageSpy = vi.spyOn(customChannel, 'sendImage').mockRejectedValueOnce(error); - const sendFileSpy = vi.spyOn(customChannel, 'sendFile').mockRejectedValueOnce(error); + const sendImageSpy = vi + .spyOn(customChannel, 'uploadImage') + .mockRejectedValueOnce(error); + const sendFileSpy = vi.spyOn(customChannel, 'uploadFile').mockRejectedValueOnce(error); customClient.activeChannels[customChannel.cid] = customChannel; return { customChannel, customClient, sendFileSpy, sendImageSpy }; }; -/** `channel.sendImage` / `channel.sendFile` pass upload options (e.g. `onUploadProgress`) after the file. */ +/** `channel.uploadImage` / `channel.uploadFile` take `({ file }, requestOptions)`. */ type UploadSpy = { mock: { calls: [unknown, ...unknown[]][]; @@ -367,7 +369,7 @@ type UploadSpy = { const expectChannelUploadCall = (spy: UploadSpy, expectedFile: File) => { expect(spy.mock.calls.length).toBeGreaterThan(0); const callArgs = spy.mock.calls[0]; - expect(callArgs[0]).toBe(expectedFile); + expect(callArgs[0]).toEqual({ file: expectedFile }); expect(callArgs[callArgs.length - 1]).toEqual( expect.objectContaining({ onUploadProgress: expect.any(Function) }), ); diff --git a/src/components/MessageComposer/__tests__/ThreadMessageInput.test.tsx b/src/components/MessageComposer/__tests__/ThreadMessageInput.test.tsx index eabe6e313..0ff6ff186 100644 --- a/src/components/MessageComposer/__tests__/ThreadMessageInput.test.tsx +++ b/src/components/MessageComposer/__tests__/ThreadMessageInput.test.tsx @@ -68,10 +68,10 @@ const setup = async ({ channelData }: any = {}) => { customUser: user, }); const sendImageSpy = vi - .spyOn(customChannel, 'sendImage') + .spyOn(customChannel, 'uploadImage') .mockResolvedValueOnce(fromPartial({ file: fileUploadUrl })); const sendFileSpy = vi - .spyOn(customChannel, 'sendFile') + .spyOn(customChannel, 'uploadFile') .mockResolvedValueOnce(fromPartial({ file: fileUploadUrl })); const getDraftSpy = vi .spyOn(customChannel, 'getDraft') diff --git a/src/components/Thread/Thread.tsx b/src/components/Thread/Thread.tsx index c35368c78..e498c5c01 100644 --- a/src/components/Thread/Thread.tsx +++ b/src/components/Thread/Thread.tsx @@ -24,7 +24,6 @@ import type { MessageProps } from '../Message/types'; import type { MessageActionsArray } from '../Message/utils'; import type { DeleteMessageOptions, - EventAPIResponse, LocalMessage, MarkReadRequest, MessageRequest, @@ -64,7 +63,7 @@ export type ThreadProps = { doMarkReadRequest?: (params: { thread: StreamThread; options?: MarkReadRequest; - }) => Promise | void; + }) => ReturnType | void; /** Custom action handler to override the default `channel.sendMessage` request function in thread flows */ doSendMessageRequest?: ( thread: StreamThread, diff --git a/src/components/Thread/hooks/useThreadRequestHandlers.ts b/src/components/Thread/hooks/useThreadRequestHandlers.ts index b1145117b..2dc3295ce 100644 --- a/src/components/Thread/hooks/useThreadRequestHandlers.ts +++ b/src/components/Thread/hooks/useThreadRequestHandlers.ts @@ -2,7 +2,6 @@ import { useEffect } from 'react'; import { localMessageToNewMessagePayload } from 'stream-chat'; import type { DeleteMessageOptions, - EventAPIResponse, LocalMessage, MarkReadRequest, MessageRequest, @@ -24,7 +23,7 @@ export type ThreadRequestHandlersParams = { doMarkReadRequest?: (params: { thread: StreamThread; options?: MarkReadRequest; - }) => Promise | void; + }) => ReturnType | void; doSendMessageRequest?: ( thread: StreamThread, message: MessageRequest, diff --git a/src/plugins/ChannelDetail/Views/ChannelManagementView/ChannelManagementView.tsx b/src/plugins/ChannelDetail/Views/ChannelManagementView/ChannelManagementView.tsx index 7e593b70e..7310c3aaa 100644 --- a/src/plugins/ChannelDetail/Views/ChannelManagementView/ChannelManagementView.tsx +++ b/src/plugins/ChannelDetail/Views/ChannelManagementView/ChannelManagementView.tsx @@ -228,7 +228,7 @@ const useChannelManagementEditForm = ({ async (file: File) => { const url = uploadImage ? await uploadImage(file) - : (await channel.sendImage(file)).file; + : (await channel.uploadImage({ file })).file; if (!url) throw new Error('Image upload did not return a URL'); return url; }, diff --git a/src/plugins/ChannelDetail/__tests__/ChannelManagementView.test.tsx b/src/plugins/ChannelDetail/__tests__/ChannelManagementView.test.tsx index b34305c39..9eee322c7 100644 --- a/src/plugins/ChannelDetail/__tests__/ChannelManagementView.test.tsx +++ b/src/plugins/ChannelDetail/__tests__/ChannelManagementView.test.tsx @@ -14,7 +14,6 @@ const mocks = vi.hoisted(() => ({ member_count: 2, own_capabilities: ['update-channel'], }, - sendImage: vi.fn(), state: { members: { 'other-user': { user: { id: 'other-user' } }, @@ -23,6 +22,7 @@ const mocks = vi.hoisted(() => ({ membership: {}, }, updatePartial: vi.fn(), + uploadImage: vi.fn(), }, close: vi.fn(), displayImage: undefined as string | undefined, @@ -187,9 +187,11 @@ describe('ChannelManagementView', () => { value: vi.fn(), }); mocks.addNotification.mockReset(); - mocks.channel.sendImage.mockReset(); + mocks.channel.uploadImage.mockReset(); mocks.channel.updatePartial.mockReset(); - mocks.channel.sendImage.mockResolvedValue({ file: 'https://stream-upload.example' }); + mocks.channel.uploadImage.mockResolvedValue({ + file: 'https://stream-upload.example', + }); mocks.channel.updatePartial.mockResolvedValue({}); mocks.channel.data.custom.name = 'Test channel'; mocks.channel.data.member_count = 2; @@ -306,7 +308,7 @@ describe('ChannelManagementView', () => { fireEvent.click(screen.getByRole('button', { name: 'Save' })); await waitFor(() => expect(uploadImage).toHaveBeenCalledTimes(1)); - expect(mocks.channel.sendImage).not.toHaveBeenCalled(); + expect(mocks.channel.uploadImage).not.toHaveBeenCalled(); expect(mocks.channel.updatePartial).toHaveBeenCalledWith({ set: { 'custom.image': 'https://custom-upload.example' }, }); @@ -340,17 +342,17 @@ describe('ChannelManagementView', () => { set: { 'custom.name': 'Renamed channel' }, }), ); - expect(mocks.channel.sendImage).not.toHaveBeenCalled(); + expect(mocks.channel.uploadImage).not.toHaveBeenCalled(); }); - it('uploads via channel.sendImage when no custom upload is provided', async () => { + it('uploads via channel.uploadImage when no custom upload is provided', async () => { const { container } = renderChannelManagementView(); enterEditMode(); uploadFile(container); save(); - await waitFor(() => expect(mocks.channel.sendImage).toHaveBeenCalledTimes(1)); + await waitFor(() => expect(mocks.channel.uploadImage).toHaveBeenCalledTimes(1)); expect(mocks.channel.updatePartial).toHaveBeenCalledWith({ set: { 'custom.image': 'https://stream-upload.example' }, }); @@ -387,7 +389,7 @@ describe('ChannelManagementView', () => { unset: ['custom.image'], }), ); - expect(mocks.channel.sendImage).not.toHaveBeenCalled(); + expect(mocks.channel.uploadImage).not.toHaveBeenCalled(); }); it('emits a success notification after saving', async () => { @@ -427,7 +429,7 @@ describe('ChannelManagementView', () => { }); it('does not persist when the upload returns no URL', async () => { - mocks.channel.sendImage.mockResolvedValueOnce({ file: undefined }); + mocks.channel.uploadImage.mockResolvedValueOnce({ file: undefined }); const { container } = renderChannelManagementView(); enterEditMode(); diff --git a/yarn.lock b/yarn.lock index b7a93a2f3..54074937b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1829,7 +1829,7 @@ __metadata: emoji-mart: "npm:^5.6.0" react: "npm:^19.2.6" react-dom: "npm:^19.2.6" - stream-chat: "npm:10.0.0-rc.2" + stream-chat: "npm:10.0.0-rc.4" stream-chat-react: "workspace:^" typescript: "npm:^6.0.3" vite: "npm:^8.1.3" @@ -1856,7 +1856,7 @@ __metadata: react: "npm:^19.2.6" react-dom: "npm:^19.2.6" sass: "npm:^1.100.0" - stream-chat: "npm:10.0.0-rc.2" + stream-chat: "npm:10.0.0-rc.4" stream-chat-react: "workspace:^" typescript: "npm:^6.0.3" vite: "npm:^8.1.3" @@ -2202,16 +2202,6 @@ __metadata: languageName: node linkType: hard -"@types/jsonwebtoken@npm:^9.0.8": - version: 9.0.10 - resolution: "@types/jsonwebtoken@npm:9.0.10" - dependencies: - "@types/ms": "npm:*" - "@types/node": "npm:*" - checksum: 10c0/0688ac8fb75f809201cb7e18a12b9d80ce539cb9dd27e1b01e11807cb1a337059e899b8ee3abc3f2c9417f02e363a3069d9eab9ef9724b1da1f0e10713514f94 - languageName: node - linkType: hard - "@types/linkifyjs@npm:^2.1.7": version: 2.1.7 resolution: "@types/linkifyjs@npm:2.1.7" @@ -2344,15 +2334,6 @@ __metadata: languageName: node linkType: hard -"@types/ws@npm:^8.18.1": - version: 8.18.1 - resolution: "@types/ws@npm:8.18.1" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/61aff1129143fcc4312f083bc9e9e168aa3026b7dd6e70796276dcfb2c8211c4292603f9c4864fae702f2ed86e4abd4d38aa421831c2fd7f856c931a481afbab - languageName: node - linkType: hard - "@typescript-eslint/eslint-plugin@npm:8.59.4": version: 8.59.4 resolution: "@typescript-eslint/eslint-plugin@npm:8.59.4" @@ -3054,15 +3035,15 @@ __metadata: languageName: node linkType: hard -"axios@npm:^1.16.1": - version: 1.17.0 - resolution: "axios@npm:1.17.0" +"axios@npm:^1.19.0": + version: 1.19.0 + resolution: "axios@npm:1.19.0" dependencies: follow-redirects: "npm:^1.16.0" - form-data: "npm:^4.0.5" + form-data: "npm:^4.0.6" https-proxy-agent: "npm:^5.0.1" proxy-from-env: "npm:^2.1.0" - checksum: 10c0/c4fa19ff3a3a63bde48beec03ad816b133b9a6385cccffffe172577ab18c6a70e299280d57f12c80c867fe25df41f92cb91d3a8258708a6d2be3e9e085f92650 + checksum: 10c0/559fe7d51291787def61566a3db78b87510c8faf9c8a8c006d9d8b933808628ff0d8eca7756b40ae25e07da96d946c68c1ffba3da9075ed0b5d3661801d76869 languageName: node linkType: hard @@ -3096,13 +3077,6 @@ __metadata: languageName: node linkType: hard -"base64-js@npm:^1.5.1": - version: 1.5.1 - resolution: "base64-js@npm:1.5.1" - checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf - languageName: node - linkType: hard - "baseline-browser-mapping@npm:^2.10.12": version: 2.10.29 resolution: "baseline-browser-mapping@npm:2.10.29" @@ -3198,13 +3172,6 @@ __metadata: languageName: node linkType: hard -"buffer-equal-constant-time@npm:^1.0.1": - version: 1.0.1 - resolution: "buffer-equal-constant-time@npm:1.0.1" - checksum: 10c0/fb2294e64d23c573d0dd1f1e7a466c3e978fe94a4e0f8183937912ca374619773bef8e2aceb854129d2efecbbc515bbd0cc78d2734a3e3031edb0888531bbc8e - languageName: node - linkType: hard - "cacache@npm:^20.0.0, cacache@npm:^20.0.1, cacache@npm:^20.0.4": version: 20.0.4 resolution: "cacache@npm:20.0.4" @@ -3970,15 +3937,6 @@ __metadata: languageName: node linkType: hard -"ecdsa-sig-formatter@npm:1.0.11": - version: 1.0.11 - resolution: "ecdsa-sig-formatter@npm:1.0.11" - dependencies: - safe-buffer: "npm:^5.0.1" - checksum: 10c0/ebfbf19d4b8be938f4dd4a83b8788385da353d63307ede301a9252f9f7f88672e76f2191618fd8edfc2f24679236064176fab0b78131b161ee73daa37125408c - languageName: node - linkType: hard - "electron-to-chromium@npm:^1.5.328": version: 1.5.353 resolution: "electron-to-chromium@npm:1.5.353" @@ -4754,16 +4712,16 @@ __metadata: languageName: node linkType: hard -"form-data@npm:^4.0.5": - version: 4.0.5 - resolution: "form-data@npm:4.0.5" +"form-data@npm:^4.0.6": + version: 4.0.6 + resolution: "form-data@npm:4.0.6" dependencies: asynckit: "npm:^0.4.0" combined-stream: "npm:^1.0.8" es-set-tostringtag: "npm:^2.1.0" - hasown: "npm:^2.0.2" - mime-types: "npm:^2.1.12" - checksum: 10c0/dd6b767ee0bbd6d84039db12a0fa5a2028160ffbfaba1800695713b46ae974a5f6e08b3356c3195137f8530dcd9dfcb5d5ae1eeff53d0db1e5aad863b619ce3b + hasown: "npm:^2.0.4" + mime-types: "npm:^2.1.35" + checksum: 10c0/43947a77bf0ff45c6ceed789778982d47a3f3e720a74b71721174ebf3310a5f1a8be1d6b38a3ee3688e8a18a2c4273073ec0844cd37efda3eaf46d41c9c318ff languageName: node linkType: hard @@ -5136,6 +5094,15 @@ __metadata: languageName: node linkType: hard +"hasown@npm:^2.0.4": + version: 2.0.4 + resolution: "hasown@npm:2.0.4" + dependencies: + function-bind: "npm:^1.1.2" + checksum: 10c0/2d8de939e270b70618f8cebb69746620db10617dbb495bc66ddad326955ea24d3ca4af133aff3eb7c1853e0218f867bc2b050ec26fe02e3aea58f880ffc5e506 + languageName: node + linkType: hard + "hast-util-find-and-replace@npm:^5.0.1": version: 5.0.1 resolution: "hast-util-find-and-replace@npm:5.0.1" @@ -5895,15 +5862,6 @@ __metadata: languageName: node linkType: hard -"isomorphic-ws@npm:^5.0.0": - version: 5.0.0 - resolution: "isomorphic-ws@npm:5.0.0" - peerDependencies: - ws: "*" - checksum: 10c0/a058ac8b5e6efe9e46252cb0bc67fd325005d7216451d1a51238bc62d7da8486f828ef017df54ddf742e0fffcbe4b1bcc2a66cc115b027ed0180334cd18df252 - languageName: node - linkType: hard - "issue-parser@npm:^7.0.0": version: 7.0.2 resolution: "issue-parser@npm:7.0.2" @@ -6146,24 +6104,6 @@ __metadata: languageName: node linkType: hard -"jsonwebtoken@npm:^9.0.3": - version: 9.0.3 - resolution: "jsonwebtoken@npm:9.0.3" - dependencies: - jws: "npm:^4.0.1" - lodash.includes: "npm:^4.3.0" - lodash.isboolean: "npm:^3.0.3" - lodash.isinteger: "npm:^4.0.4" - lodash.isnumber: "npm:^3.0.3" - lodash.isplainobject: "npm:^4.0.6" - lodash.isstring: "npm:^4.0.1" - lodash.once: "npm:^4.0.0" - ms: "npm:^2.1.1" - semver: "npm:^7.5.4" - checksum: 10c0/6ca7f1e54886ea3bde7146a5a22b53847c46e25453c7f7307a69818b9a6ad48c390b2e59d5690fcfd03c529b01960060cc4bb0c686991d6edae2285dfd30f4ba - languageName: node - linkType: hard - "jsx-ast-utils@npm:^2.4.1 || ^3.0.0": version: 3.3.5 resolution: "jsx-ast-utils@npm:3.3.5" @@ -6190,27 +6130,6 @@ __metadata: languageName: node linkType: hard -"jwa@npm:^2.0.1": - version: 2.0.1 - resolution: "jwa@npm:2.0.1" - dependencies: - buffer-equal-constant-time: "npm:^1.0.1" - ecdsa-sig-formatter: "npm:1.0.11" - safe-buffer: "npm:^5.0.1" - checksum: 10c0/ab3ebc6598e10dc11419d4ed675c9ca714a387481466b10e8a6f3f65d8d9c9237e2826f2505280a739cf4cbcf511cb288eeec22b5c9c63286fc5a2e4f97e78cf - languageName: node - linkType: hard - -"jws@npm:^4.0.1": - version: 4.0.1 - resolution: "jws@npm:4.0.1" - dependencies: - jwa: "npm:^2.0.1" - safe-buffer: "npm:^5.0.1" - checksum: 10c0/6be1ed93023aef570ccc5ea8d162b065840f3ef12f0d1bb3114cade844de7a357d5dc558201d9a65101e70885a6fa56b17462f520e6b0d426195510618a154d0 - languageName: node - linkType: hard - "keyv@npm:^4.5.4": version: 4.5.4 resolution: "keyv@npm:4.5.4" @@ -6593,34 +6512,6 @@ __metadata: languageName: node linkType: hard -"lodash.includes@npm:^4.3.0": - version: 4.3.0 - resolution: "lodash.includes@npm:4.3.0" - checksum: 10c0/7ca498b9b75bf602d04e48c0adb842dfc7d90f77bcb2a91a2b2be34a723ad24bc1c8b3683ec6b2552a90f216c723cdea530ddb11a3320e08fa38265703978f4b - languageName: node - linkType: hard - -"lodash.isboolean@npm:^3.0.3": - version: 3.0.3 - resolution: "lodash.isboolean@npm:3.0.3" - checksum: 10c0/0aac604c1ef7e72f9a6b798e5b676606042401dd58e49f051df3cc1e3adb497b3d7695635a5cbec4ae5f66456b951fdabe7d6b387055f13267cde521f10ec7f7 - languageName: node - linkType: hard - -"lodash.isinteger@npm:^4.0.4": - version: 4.0.4 - resolution: "lodash.isinteger@npm:4.0.4" - checksum: 10c0/4c3e023a2373bf65bf366d3b8605b97ec830bca702a926939bcaa53f8e02789b6a176e7f166b082f9365bfec4121bfeb52e86e9040cb8d450e64c858583f61b7 - languageName: node - linkType: hard - -"lodash.isnumber@npm:^3.0.3": - version: 3.0.3 - resolution: "lodash.isnumber@npm:3.0.3" - checksum: 10c0/2d01530513a1ee4f72dd79528444db4e6360588adcb0e2ff663db2b3f642d4bb3d687051ae1115751ca9082db4fdef675160071226ca6bbf5f0c123dbf0aa12d - languageName: node - linkType: hard - "lodash.isplainobject@npm:^4.0.6": version: 4.0.6 resolution: "lodash.isplainobject@npm:4.0.6" @@ -6649,13 +6540,6 @@ __metadata: languageName: node linkType: hard -"lodash.once@npm:^4.0.0": - version: 4.1.1 - resolution: "lodash.once@npm:4.1.1" - checksum: 10c0/46a9a0a66c45dd812fcc016e46605d85ad599fe87d71a02f6736220554b52ffbe82e79a483ad40f52a8a95755b0d1077fba259da8bfb6694a7abbf4a48f1fc04 - languageName: node - linkType: hard - "lodash.throttle@npm:^4.1.1": version: 4.1.1 resolution: "lodash.throttle@npm:4.1.1" @@ -7424,7 +7308,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.12": +"mime-types@npm:^2.1.35": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -9121,13 +9005,6 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:^5.0.1": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 - languageName: node - linkType: hard - "safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": version: 5.1.2 resolution: "safe-buffer@npm:5.1.2" @@ -9250,7 +9127,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.1.1, semver@npm:^7.1.2, semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.7.2, semver@npm:^7.7.3, semver@npm:^7.7.4": +"semver@npm:^7.1.1, semver@npm:^7.1.2, semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.6.0, semver@npm:^7.7.2, semver@npm:^7.7.3, semver@npm:^7.7.4": version: 7.8.0 resolution: "semver@npm:7.8.0" bin: @@ -9657,7 +9534,7 @@ __metadata: remark-parse: "npm:^11.0.0" sass: "npm:^1.100.0" semantic-release: "npm:^25.0.3" - stream-chat: "npm:10.0.0-rc.2" + stream-chat: "npm:10.0.0-rc.4" typescript: "npm:^6.0.3" typescript-eslint: "npm:^8.59.4" unified: "npm:^11.0.5" @@ -9675,7 +9552,7 @@ __metadata: modern-normalize: ^3.0.1 react: ^19.0.0 || ^18.0.0 || ^17.0.0 react-dom: ^19.0.0 || ^18.0.0 || ^17.0.0 - stream-chat: 10.0.0-rc.2 + stream-chat: 10.0.0-rc.4 dependenciesMeta: "@parcel/watcher": built: true @@ -9701,26 +9578,19 @@ __metadata: languageName: unknown linkType: soft -"stream-chat@npm:10.0.0-rc.2": - version: 10.0.0-rc.2 - resolution: "stream-chat@npm:10.0.0-rc.2" +"stream-chat@npm:10.0.0-rc.4": + version: 10.0.0-rc.4 + resolution: "stream-chat@npm:10.0.0-rc.4" dependencies: "@stream-io/logger": "npm:^2.0.0" - "@types/jsonwebtoken": "npm:^9.0.8" - "@types/ws": "npm:^8.18.1" - axios: "npm:^1.16.1" - base64-js: "npm:^1.5.1" - form-data: "npm:^4.0.5" - isomorphic-ws: "npm:^5.0.0" - jsonwebtoken: "npm:^9.0.3" + axios: "npm:^1.19.0" linkifyjs: "npm:^4.3.3" - ws: "npm:^8.20.1" dependenciesMeta: esbuild: built: true husky: built: true - checksum: 10c0/a8ad3570d6820edfec476330674fdb2c96dda28324b7ea6f198e9320a5045eea754afd85f88a8a6702f09cd06dbfc88df9f85262ba0bc588c683fc45083c0d49 + checksum: 10c0/44582f022a84fc4924723316d1ed43961d0cd4044ed8544e92347047ed79066f6f365e772af7f47e4d03ca1678a0dca7a10b59663618c360f62bd4f3658475ab languageName: node linkType: hard @@ -11050,21 +10920,6 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.20.1": - version: 8.21.0 - resolution: "ws@npm:8.21.0" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 10c0/ef4a243476283fc49bc7550966c4af4aa0eef56273837211e700de3b664e08604a760cdddcb5ba43c049140e74ccfec5b0ee0bb439e08c2adf9138902fdde5f9 - languageName: node - linkType: hard - "xml-name-validator@npm:^5.0.0": version: 5.0.0 resolution: "xml-name-validator@npm:5.0.0"