fix: correctly extend bluebird

This commit is contained in:
Simon Chan 2022-01-08 21:48:01 +08:00
parent 5aeffeab8a
commit d730d101c2
9 changed files with 58 additions and 66 deletions

View file

@ -1,6 +1,5 @@
import { IconButton, IListProps, List, mergeStyles, mergeStyleSets, Stack } from '@fluentui/react';
import { AdbPacketInit } from '@yume-chan/adb';
import { decodeUtf8 } from '@yume-chan/adb-backend-webusb';
import { AdbPacketInit, decodeUtf8 } from '@yume-chan/adb';
import { DisposableList } from '@yume-chan/event';
import { observer } from "mobx-react-lite";
import { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';

View file

@ -1,6 +1,5 @@
import { AdbShell } from "@yume-chan/adb";
import { encodeUtf8 } from "@yume-chan/adb-backend-webusb";
import { AdbShell, encodeUtf8 } from "@yume-chan/adb";
import { AutoDisposable } from "@yume-chan/event";
import { Terminal } from 'xterm';
import { FitAddon } from 'xterm-addon-fit';

View file

@ -1,18 +0,0 @@
import { useEffect, useState } from 'react';
export function useDevicePixelRatio() {
const [value, setValue] = useState(window.devicePixelRatio);
useEffect(() => {
const match = window.matchMedia(
`(min-device-pixel-ratio: ${value}) and (max-device-pixel-ratio: ${value})`
);
function handler() {
setValue(window.devicePixelRatio);
}
match.addEventListener('change', handler);
return match.removeEventListener('change', handler);
}, [value]);
}

View file

@ -42,7 +42,7 @@ export namespace AdbPacket {
let bufferUsed = false;
const stream = new BufferedStream({
read(length: number) {
async read(length: number) {
if (!bufferUsed) {
bufferUsed = true;
return buffer;

View file

@ -19,7 +19,8 @@ export class ScrcpyOptions1_21<T extends ScrcpyOptions1_21Type = ScrcpyOptions1_
}
public override formatServerArguments(): string[] {
return Object.entries(this.value).map(([key, value]) => {
return Object.entries(this.value)
.map(([key, value]) => {
return `${toSnakeCase(key)}=${toScrcpyOption(value, '')}`;
});
}

View file

@ -2,7 +2,7 @@ import type { StructAsyncDeserializeStream, StructDeserializeStream, StructField
import { StructDefaultOptions, StructValue } from './basic';
import { Syncbird } from "./syncbird";
import { ArrayBufferFieldType, ArrayBufferLikeFieldType, FixedLengthArrayBufferLikeFieldDefinition, FixedLengthArrayBufferLikeFieldOptions, LengthField, NumberFieldDefinition, NumberFieldType, StringFieldType, Uint8ClampedArrayFieldType, VariableLengthArrayBufferLikeFieldDefinition, VariableLengthArrayBufferLikeFieldOptions } from './types';
import { Awaited, Evaluate, Identity, Overwrite, ValueOrPromise } from "./utils";
import { Evaluate, Identity, Overwrite, ValueOrPromise } from "./utils";
export interface StructLike<TValue> {
deserialize(stream: StructDeserializeStream | StructAsyncDeserializeStream): Promise<TValue>;

View file

@ -1,21 +1,35 @@
import Bluebird from 'bluebird';
export type Resolvable<R> = R | PromiseLike<R>;
type Resolvable<R> = R | PromiseLike<R>;
export class Syncbird<T> extends Bluebird<T> implements PromiseLike<T> {
public static resolve(): Syncbird<void>;
public static resolve<R>(value: Resolvable<R>): Syncbird<R>;
public static resolve<R>(value?: Resolvable<R>): Syncbird<R> {
return new Syncbird(
resolve => resolve(value)
);
export interface Syncbird<R> extends Bluebird<R> {
valueOrPromise(): R | PromiseLike<R>;
then<U>(onFulfill?: (value: R) => Resolvable<U>, onReject?: (error: any) => Resolvable<U>): Syncbird<U>; // For simpler signature help.
then<TResult1 = R, TResult2 = never>(
onfulfilled?: ((value: R) => Resolvable<TResult1>) | null,
onrejected?: ((reason: any) => Resolvable<TResult2>) | null
): Syncbird<TResult1 | TResult2>;
}
static try<R>(fn: () => Resolvable<R>): Syncbird<R> {
return Syncbird.resolve(fn());
interface SyncbirdStatic {
/**
* Create a promise that is resolved with the given `value`. If `value` is a thenable or promise, the returned promise will assume its state.
*/
resolve(): Syncbird<void>;
resolve<R>(value: Resolvable<R>): Syncbird<R>;
try<R>(fn: () => Resolvable<R>): Syncbird<R>;
attempt<R>(fn: () => Resolvable<R>): Syncbird<R>;
new <R>(callback: (resolve: (thenableOrResult?: Resolvable<R>) => void, reject: (error?: any) => void, onCancel?: (callback: () => void) => void) => void): Syncbird<R>;
}
public then<TResult1 = T, TResult2 = never>(
export const Syncbird: SyncbirdStatic = Bluebird.getNewLibraryCopy() as any;
const _then = Bluebird.prototype.then;
Syncbird.prototype.then = function <T, TResult1 = T, TResult2 = never>(
this: Bluebird<T>,
onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null,
onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null
): Syncbird<TResult1 | TResult2> {
@ -23,18 +37,17 @@ export class Syncbird<T> extends Bluebird<T> implements PromiseLike<T> {
if (!onfulfilled) {
return this as unknown as Syncbird<TResult1>;
} else {
return Syncbird.resolve(onfulfilled(this.value()));
return Syncbird.resolve(onfulfilled(this.value())) as Syncbird<TResult1 | TResult2>;
}
} else {
return Syncbird.resolve(super.then(onfulfilled, onrejected));
}
return _then.call(this, onfulfilled, onrejected) as Syncbird<TResult1 | TResult2>;
}
};
public valueOrPromise(): T | Promise<T> {
(Syncbird.prototype as any).valueOrPromise = function <T>(this: Bluebird<T>): T | PromiseLike<T> {
if (this.isFulfilled()) {
return this.value();
} else {
return this as Promise<T>;
}
}
}
};

View file

@ -148,7 +148,7 @@ export abstract class ArrayBufferLikeFieldDefinition<
stream: StructDeserializeStream | StructAsyncDeserializeStream,
struct: StructValue,
): ValueOrPromise<ArrayBufferLikeFieldValue<this>> {
return Syncbird.resolve().then(() => {
return Syncbird.try(() => {
const size = this.getDeserializeSize(struct);
if (size === 0) {
return EmptyArrayBuffer;

View file

@ -39,9 +39,7 @@ export type OmitNever<T> = Pick<T, { [K in keyof T]: [T[K]] extends [never] ? ne
export type KeysOfType<T, TValue> =
{ [TKey in keyof T]: T[TKey] extends TValue ? TKey : never }[keyof T];
export type ValueOrPromise<T> = T | Promise<T>;
export type Awaited<T> = T extends Promise<infer R> ? Awaited<R> : T;
export type ValueOrPromise<T> = T | PromiseLike<T>;
/**
* Returns a (fake) value of the given type.