Skip to content

Commit 633c021

Browse files
committed
blobToBuffer util
1 parent cc1563d commit 633c021

File tree

8 files changed

+33
-9
lines changed

8 files changed

+33
-9
lines changed

packages/client/src/adapters/websocket/link-client.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import type { StandardLazyResponse, StandardRequest } from '@orpc/standard-server'
22
import type { ClientContext, ClientOptions } from '../../types'
33
import type { StandardLinkClient } from '../standard'
4+
import { blobToBuffer } from '@orpc/shared'
45
import { ClientPeer } from '@orpc/standard-server-peer'
56

67
export interface experimental_LinkWebsocketClientOptions {
@@ -29,7 +30,7 @@ export class experimental_LinkWebsocketClient<T extends ClientContext> implement
2930

3031
options.websocket.addEventListener('message', async (event) => {
3132
const message = event.data instanceof Blob
32-
? await event.data.bytes()
33+
? await blobToBuffer(event.data)
3334
: event.data
3435

3536
this.peer.message(message)

packages/server/src/adapters/websocket/handler.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import type { StandardHandler } from '../standard'
44
import type {
55
experimental_HandleStandardServerPeerMessageOptions as HandleStandardServerPeerMessageOptions,
66
} from '../standard-peer'
7-
import { resolveMaybeOptionalOptions } from '@orpc/shared'
7+
import { blobToBuffer, resolveMaybeOptionalOptions } from '@orpc/shared'
88
import { ServerPeer } from '@orpc/standard-server-peer'
99
import {
1010
experimental_handleStandardServerPeerMessage as handleStandardServerPeerMessage,
@@ -57,7 +57,7 @@ export class experimental_WebsocketHandler<T extends Context> {
5757
}
5858

5959
const message = data instanceof Blob
60-
? await data.bytes()
60+
? await blobToBuffer(data)
6161
: data
6262

6363
await handleStandardServerPeerMessage(

packages/server/src/adapters/ws/handler.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import type { StandardHandler } from '../standard'
55
import type {
66
experimental_HandleStandardServerPeerMessageOptions as HandleStandardServerPeerMessageOptions,
77
} from '../standard-peer'
8-
import { resolveMaybeOptionalOptions } from '@orpc/shared'
8+
import { blobToBuffer, resolveMaybeOptionalOptions } from '@orpc/shared'
99
import { ServerPeer } from '@orpc/standard-server-peer'
1010
import {
1111
experimental_handleStandardServerPeerMessage as handleStandardServerPeerMessage,
@@ -25,7 +25,7 @@ export class experimental_WsHandler<T extends Context> {
2525

2626
ws.addEventListener('message', async (event) => {
2727
const message = Array.isArray(event.data)
28-
? await (new Blob(event.data)).bytes()
28+
? await blobToBuffer(new Blob(event.data))
2929
: event.data
3030

3131
await handleStandardServerPeerMessage(

packages/shared/src/blob.test.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { blobToBuffer } from './blob'
2+
3+
it('blobToBuffer', async () => {
4+
const blob = new Blob(['test'], { type: 'text/plain' })
5+
6+
expect(new TextDecoder().decode(await blobToBuffer(blob))).toBe('test')
7+
expect(new TextDecoder().decode(await blobToBuffer(new Proxy(blob, {
8+
has: (target, prop) => Reflect.has(target, prop) && prop !== 'bytes',
9+
})))).toBe('test')
10+
})

packages/shared/src/blob.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/**
2+
* Converts a Blob to a buffer (ArrayBuffer or Uint8Array).
3+
*
4+
* Prefers the newer `.bytes` method when available as it more efficient but not widely supported yet.
5+
*/
6+
export function blobToBuffer(blob: Blob): Promise<ArrayBuffer | Uint8Array> {
7+
if ('bytes' in blob) {
8+
return blob.bytes()
9+
}
10+
11+
return (blob as Blob).arrayBuffer()
12+
}

packages/shared/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
export * from './args'
22
export * from './array'
3+
export * from './blob'
34
export * from './chain'
45
export * from './event-publisher'
56
export * from './function'

packages/standard-server-aws-lambda/src/body.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ describe.each([true, false])('toStandardBody: base64=%s', (isBase64Encoded) => {
118118
const res = new Response(form)
119119

120120
const standardBody: any = await toStandardBody({
121-
body: Buffer.from(await res.bytes()).toString('base64'),
121+
body: Buffer.from(await res.arrayBuffer()).toString('base64'),
122122
headers: {
123123
'content-type': res.headers.get('content-type')!,
124124
},

packages/standard-server-peer/src/codec.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { EventMeta, StandardBody, StandardHeaders, StandardRequest, StandardResponse } from '@orpc/standard-server'
22
import type { EncodedMessage } from './types'
3-
import { isAsyncIteratorObject, stringifyJSON } from '@orpc/shared'
3+
import { blobToBuffer, isAsyncIteratorObject, stringifyJSON } from '@orpc/shared'
44
import { flattenHeader, generateContentDisposition, getFilenameFromContentDisposition } from '@orpc/standard-server'
55

66
export enum MessageType {
@@ -307,11 +307,11 @@ async function encodeRawMessage(data: object, blob?: Blob): Promise<EncodedMessa
307307
return json
308308
}
309309

310-
return new Blob([
310+
return blobToBuffer(new Blob([
311311
new TextEncoder().encode(json),
312312
new Uint8Array([JSON_AND_BINARY_DELIMITER]),
313313
blob,
314-
]).bytes()
314+
]))
315315
}
316316

317317
async function decodeRawMessage(raw: EncodedMessage): Promise<{ json: any, buffer?: Uint8Array }> {

0 commit comments

Comments
 (0)