Skip to content

Commit

Permalink
Use a utility to wrap response.body in an async iterator
Browse files Browse the repository at this point in the history
  • Loading branch information
kraenhansen committed Jan 22, 2024
1 parent e4535c6 commit 0c631da
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 2 deletions.
4 changes: 2 additions & 2 deletions packages/realm/src/app-services/User.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import {
ProviderType,
PushClient,
assert,
asyncIteratorFromResponse,
binding,
cleanArguments,
createFactory,
Expand Down Expand Up @@ -314,8 +315,7 @@ export class User<
assert(response.ok, () => `Request failed: ${response.statusText} (${response.status})`);
assert(response.body, "Expected a body in the response");

throw new Error("ReadableStream is not yet implementing AsyncIterable");
// return response.body;
return asyncIteratorFromResponse(response);
}

/**
Expand Down
53 changes: 53 additions & 0 deletions packages/realm/src/async-iterator-from-response.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
////////////////////////////////////////////////////////////////////////////
//
// Copyright 2024 Realm Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
////////////////////////////////////////////////////////////////////////////

import { Response } from "@realm/fetch";

/** @internal */
export function asyncIteratorFromResponse({ body }: Response): AsyncIterable<Uint8Array> {
if (typeof body !== "object" || body === null) {
throw new Error("Expected a non-null object");
} else if (Symbol.asyncIterator in body) {
return body as AsyncIterable<Uint8Array>;
} else if ("getReader" in body) {
return {
[Symbol.asyncIterator]() {
const reader = body.getReader();
return {
async next() {
const { done, value } = await reader.read();
if (done) {
// TODO: Simply return the result once https://github.com/microsoft/TypeScript-DOM-lib-generator/pull/1676 is merged and released
return { done, value: undefined };
} else if (value instanceof Uint8Array) {
return { done, value };
} else {
throw new Error("Expected value to be Uint8Array");
}
},
async return() {
await reader.cancel();
return { done: true, value: null };
},
};
},
};
} else {
throw new Error("Expected an AsyncIterable or a ReadableStream");
}
}
2 changes: 2 additions & 0 deletions packages/realm/src/internal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ export * from "./assert";
/** @internal */
export * from "./ranges";
/** @internal */
export * from "./async-iterator-from-response";
/** @internal */
export * from "./Listeners";
/** @internal */
export * from "./JSONCacheMap";
Expand Down

0 comments on commit 0c631da

Please sign in to comment.