Merge pull request #28626 from element-hq/t3chguy/web-friendly-buffers
Remove usages of Buffer so we don't need to ship the polyfill
This commit is contained in:
commit
085854b125
17 changed files with 24 additions and 34 deletions
|
@ -42,6 +42,10 @@ module.exports = {
|
||||||
name: "setImmediate",
|
name: "setImmediate",
|
||||||
message: "Use setTimeout instead.",
|
message: "Use setTimeout instead.",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "Buffer",
|
||||||
|
message: "Buffer is not available in the web.",
|
||||||
|
},
|
||||||
],
|
],
|
||||||
|
|
||||||
"import/no-duplicates": ["error"],
|
"import/no-duplicates": ["error"],
|
||||||
|
@ -255,6 +259,9 @@ module.exports = {
|
||||||
additionalTestBlockFunctions: ["beforeAll", "beforeEach", "oldBackendOnly"],
|
additionalTestBlockFunctions: ["beforeAll", "beforeEach", "oldBackendOnly"],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
|
||||||
|
// These are fine in tests
|
||||||
|
"no-restricted-globals": "off",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
@ -216,7 +216,6 @@
|
||||||
"babel-loader": "^9.0.0",
|
"babel-loader": "^9.0.0",
|
||||||
"babel-plugin-jsx-remove-data-test-id": "^3.0.0",
|
"babel-plugin-jsx-remove-data-test-id": "^3.0.0",
|
||||||
"blob-polyfill": "^9.0.0",
|
"blob-polyfill": "^9.0.0",
|
||||||
"buffer": "^6.0.3",
|
|
||||||
"chokidar": "^4.0.0",
|
"chokidar": "^4.0.0",
|
||||||
"concurrently": "^9.0.0",
|
"concurrently": "^9.0.0",
|
||||||
"copy-webpack-plugin": "^12.0.0",
|
"copy-webpack-plugin": "^12.0.0",
|
||||||
|
|
|
@ -102,7 +102,7 @@ test.describe("Device verification", () => {
|
||||||
// feed the QR code into the verification request.
|
// feed the QR code into the verification request.
|
||||||
const qrData = await readQrCode(infoDialog);
|
const qrData = await readQrCode(infoDialog);
|
||||||
const verifier = await verificationRequest.evaluateHandle(
|
const verifier = await verificationRequest.evaluateHandle(
|
||||||
(request, qrData) => request.scanQRCode(new Uint8Array(qrData)),
|
(request, qrData) => request.scanQRCode(new Uint8ClampedArray(qrData)),
|
||||||
[...qrData],
|
[...qrData],
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
2
src/@types/png-chunks-extract.d.ts
vendored
2
src/@types/png-chunks-extract.d.ts
vendored
|
@ -12,7 +12,7 @@ declare module "png-chunks-extract" {
|
||||||
data: Uint8Array;
|
data: Uint8Array;
|
||||||
}
|
}
|
||||||
|
|
||||||
function extractPngChunks(data: Uint8Array | Buffer): IChunk[];
|
function extractPngChunks(data: Uint8Array): IChunk[];
|
||||||
|
|
||||||
export default extractPngChunks;
|
export default extractPngChunks;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
|
||||||
Please see LICENSE files in the repository root for full details.
|
Please see LICENSE files in the repository root for full details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { ScalableBloomFilter } from "bloom-filters";
|
import ScalableBloomFilter from "bloom-filters/dist/bloom/scalable-bloom-filter";
|
||||||
import { HttpApiEvent, MatrixClient, MatrixEventEvent, MatrixEvent } from "matrix-js-sdk/src/matrix";
|
import { HttpApiEvent, MatrixClient, MatrixEventEvent, MatrixEvent } from "matrix-js-sdk/src/matrix";
|
||||||
import { Error as ErrorEvent } from "@matrix-org/analytics-events/types/typescript/Error";
|
import { Error as ErrorEvent } from "@matrix-org/analytics-events/types/typescript/Error";
|
||||||
import { DecryptionFailureCode, CryptoEvent } from "matrix-js-sdk/src/crypto-api";
|
import { DecryptionFailureCode, CryptoEvent } from "matrix-js-sdk/src/crypto-api";
|
||||||
|
|
|
@ -37,7 +37,6 @@ interface IState {
|
||||||
userCode?: string;
|
userCode?: string;
|
||||||
checkCode?: string;
|
checkCode?: string;
|
||||||
failureReason?: FailureReason;
|
failureReason?: FailureReason;
|
||||||
lastScannedCode?: Buffer;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum LoginWithQRFailureReason {
|
export enum LoginWithQRFailureReason {
|
||||||
|
@ -154,7 +153,7 @@ export default class LoginWithQR extends React.Component<IProps, IState> {
|
||||||
throw new Error("Rendezvous not found");
|
throw new Error("Rendezvous not found");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this.state.lastScannedCode && this.state.rendezvous?.checkCode !== checkCode) {
|
if (this.state.rendezvous?.checkCode !== checkCode) {
|
||||||
this.setState({ failureReason: LoginWithQRFailureReason.CheckCodeMismatch });
|
this.setState({ failureReason: LoginWithQRFailureReason.CheckCodeMismatch });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -201,7 +200,6 @@ export default class LoginWithQR extends React.Component<IProps, IState> {
|
||||||
failureReason: undefined,
|
failureReason: undefined,
|
||||||
userCode: undefined,
|
userCode: undefined,
|
||||||
checkCode: undefined,
|
checkCode: undefined,
|
||||||
lastScannedCode: undefined,
|
|
||||||
mediaPermissionError: false,
|
mediaPermissionError: false,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@ import QRCode from "../QRCode";
|
||||||
|
|
||||||
interface IProps {
|
interface IProps {
|
||||||
/** The data for the QR code. If `undefined`, a spinner is shown. */
|
/** The data for the QR code. If `undefined`, a spinner is shown. */
|
||||||
qrCodeBytes: undefined | Buffer;
|
qrCodeBytes: undefined | Uint8ClampedArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default class VerificationQRCode extends React.PureComponent<IProps> {
|
export default class VerificationQRCode extends React.PureComponent<IProps> {
|
||||||
|
|
|
@ -46,7 +46,7 @@ interface IState {
|
||||||
* We attempt to calculate this once the verification request transitions into the "Ready" phase. If the other
|
* We attempt to calculate this once the verification request transitions into the "Ready" phase. If the other
|
||||||
* side cannot scan QR codes, it will remain `undefined`.
|
* side cannot scan QR codes, it will remain `undefined`.
|
||||||
*/
|
*/
|
||||||
qrCodeBytes: Buffer | undefined;
|
qrCodeBytes: Uint8ClampedArray | undefined;
|
||||||
|
|
||||||
sasEvent: ShowSasCallbacks | null;
|
sasEvent: ShowSasCallbacks | null;
|
||||||
emojiButtonClicked?: boolean;
|
emojiButtonClicked?: boolean;
|
||||||
|
|
|
@ -99,7 +99,7 @@ export default class ThreepidInviteStore extends EventEmitter {
|
||||||
|
|
||||||
private generateIdOf(persisted: IPersistedThreepidInvite): string {
|
private generateIdOf(persisted: IPersistedThreepidInvite): string {
|
||||||
// Use a consistent "hash" to form an ID.
|
// Use a consistent "hash" to form an ID.
|
||||||
return base32.stringify(Buffer.from(JSON.stringify(persisted)));
|
return base32.stringify(new TextEncoder().encode(JSON.stringify(persisted)));
|
||||||
}
|
}
|
||||||
|
|
||||||
private translateInvite(persisted: IPersistedThreepidInvite): IThreepidInvite {
|
private translateInvite(persisted: IPersistedThreepidInvite): IThreepidInvite {
|
||||||
|
|
|
@ -445,7 +445,7 @@ export default class WidgetUtils {
|
||||||
// For compatibility with Jitsi, use base32 without padding.
|
// For compatibility with Jitsi, use base32 without padding.
|
||||||
// More details here:
|
// More details here:
|
||||||
// https://github.com/matrix-org/prosody-mod-auth-matrix-user-verification
|
// https://github.com/matrix-org/prosody-mod-auth-matrix-user-verification
|
||||||
confId = base32.stringify(Buffer.from(roomId), { pad: false });
|
confId = base32.stringify(new TextEncoder().encode(roomId), { pad: false });
|
||||||
} else {
|
} else {
|
||||||
// Create a random conference ID
|
// Create a random conference ID
|
||||||
confId = `Jitsi${randomUppercaseString(1)}${randomLowercaseString(23)}`;
|
confId = `Jitsi${randomUppercaseString(1)}${randomLowercaseString(23)}`;
|
||||||
|
|
|
@ -431,7 +431,7 @@ export default class HTMLExporter extends Exporter {
|
||||||
!this.needsDateSeparator(event, prevEvent) &&
|
!this.needsDateSeparator(event, prevEvent) &&
|
||||||
shouldFormContinuation(prevEvent, event, this.room.client, false);
|
shouldFormContinuation(prevEvent, event, this.room.client, false);
|
||||||
const body = await this.createMessageBody(event, shouldBeJoined);
|
const body = await this.createMessageBody(event, shouldBeJoined);
|
||||||
this.totalSize += Buffer.byteLength(body);
|
this.totalSize += new TextEncoder().encode(body).byteLength;
|
||||||
content += body;
|
content += body;
|
||||||
prevEvent = event;
|
prevEvent = event;
|
||||||
}
|
}
|
||||||
|
|
|
@ -118,7 +118,7 @@ export async function buildAndEncodePickleKey(
|
||||||
data.encrypted,
|
data.encrypted,
|
||||||
);
|
);
|
||||||
if (pickleKeyBuf) {
|
if (pickleKeyBuf) {
|
||||||
return encodeUnpaddedBase64(pickleKeyBuf);
|
return encodeUnpaddedBase64(new Uint8Array(pickleKeyBuf));
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
logger.error("Error decrypting pickle key");
|
logger.error("Error decrypting pickle key");
|
||||||
|
|
|
@ -418,7 +418,7 @@ describe("Lifecycle", () => {
|
||||||
undefined,
|
undefined,
|
||||||
);
|
);
|
||||||
|
|
||||||
expect(MatrixClientPeg.start).toHaveBeenCalledWith({ rustCryptoStoreKey: expect.any(Buffer) });
|
expect(MatrixClientPeg.start).toHaveBeenCalledWith({ rustCryptoStoreKey: expect.any(Uint8Array) });
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("with a refresh token", () => {
|
describe("with a refresh token", () => {
|
||||||
|
|
|
@ -17,7 +17,9 @@ describe("<VerificationQRCode />", () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it("renders a QR code", async () => {
|
it("renders a QR code", async () => {
|
||||||
const { container, getAllByAltText } = render(<VerificationQRCode qrCodeBytes={Buffer.from("asd")} />);
|
const { container, getAllByAltText } = render(
|
||||||
|
<VerificationQRCode qrCodeBytes={new Uint8ClampedArray(Buffer.from("asd"))} />,
|
||||||
|
);
|
||||||
// wait for the spinner to go away
|
// wait for the spinner to go away
|
||||||
await waitFor(() => getAllByAltText("QR Code").length === 1);
|
await waitFor(() => getAllByAltText("QR Code").length === 1);
|
||||||
expect(container).toMatchSnapshot();
|
expect(container).toMatchSnapshot();
|
||||||
|
|
|
@ -46,7 +46,7 @@ describe("<VerificationPanel />", () => {
|
||||||
const request = makeMockVerificationRequest({
|
const request = makeMockVerificationRequest({
|
||||||
phase: Phase.Ready,
|
phase: Phase.Ready,
|
||||||
});
|
});
|
||||||
request.generateQRCode.mockResolvedValue(Buffer.from("test", "utf-8"));
|
request.generateQRCode.mockResolvedValue(new Uint8ClampedArray(Buffer.from("test", "utf-8")));
|
||||||
const container = renderComponent({
|
const container = renderComponent({
|
||||||
request: request,
|
request: request,
|
||||||
layout: "dialog",
|
layout: "dialog",
|
||||||
|
@ -71,7 +71,7 @@ describe("<VerificationPanel />", () => {
|
||||||
const request = makeMockVerificationRequest({
|
const request = makeMockVerificationRequest({
|
||||||
phase: Phase.Ready,
|
phase: Phase.Ready,
|
||||||
});
|
});
|
||||||
request.generateQRCode.mockResolvedValue(Buffer.from("test", "utf-8"));
|
request.generateQRCode.mockResolvedValue(new Uint8ClampedArray(Buffer.from("test", "utf-8")));
|
||||||
const container = renderComponent({
|
const container = renderComponent({
|
||||||
request: request,
|
request: request,
|
||||||
member: new User("@other:user"),
|
member: new User("@other:user"),
|
||||||
|
|
|
@ -231,8 +231,6 @@ module.exports = (env, argv) => {
|
||||||
|
|
||||||
// Polyfill needed by counterpart
|
// Polyfill needed by counterpart
|
||||||
"util": require.resolve("util/"),
|
"util": require.resolve("util/"),
|
||||||
// Polyfill needed by matrix-js-sdk/src/crypto
|
|
||||||
"buffer": require.resolve("buffer/"),
|
|
||||||
// Polyfill needed by sentry
|
// Polyfill needed by sentry
|
||||||
"process/browser": require.resolve("process/browser"),
|
"process/browser": require.resolve("process/browser"),
|
||||||
},
|
},
|
||||||
|
@ -679,7 +677,6 @@ module.exports = (env, argv) => {
|
||||||
// Automatically load buffer & process modules as we use them without explicitly
|
// Automatically load buffer & process modules as we use them without explicitly
|
||||||
// importing them
|
// importing them
|
||||||
new webpack.ProvidePlugin({
|
new webpack.ProvidePlugin({
|
||||||
Buffer: ["buffer", "Buffer"],
|
|
||||||
process: "process/browser",
|
process: "process/browser",
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
|
15
yarn.lock
15
yarn.lock
|
@ -4054,11 +4054,6 @@ base64-arraybuffer@^1.0.2:
|
||||||
resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc"
|
resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc"
|
||||||
integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==
|
integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==
|
||||||
|
|
||||||
base64-js@^1.3.1:
|
|
||||||
version "1.5.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
|
|
||||||
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
|
|
||||||
|
|
||||||
batch@0.6.1:
|
batch@0.6.1:
|
||||||
version "0.6.1"
|
version "0.6.1"
|
||||||
resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
|
resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
|
||||||
|
@ -4180,14 +4175,6 @@ buffer-from@^1.0.0:
|
||||||
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
|
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
|
||||||
integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
|
integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
|
||||||
|
|
||||||
buffer@^6.0.3:
|
|
||||||
version "6.0.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6"
|
|
||||||
integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==
|
|
||||||
dependencies:
|
|
||||||
base64-js "^1.3.1"
|
|
||||||
ieee754 "^1.2.1"
|
|
||||||
|
|
||||||
builtin-modules@^3.3.0:
|
builtin-modules@^3.3.0:
|
||||||
version "3.3.0"
|
version "3.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6"
|
resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6"
|
||||||
|
@ -6787,7 +6774,7 @@ icss-utils@^5.0.0, icss-utils@^5.1.0:
|
||||||
resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae"
|
resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae"
|
||||||
integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==
|
integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==
|
||||||
|
|
||||||
ieee754@^1.1.12, ieee754@^1.2.1:
|
ieee754@^1.1.12:
|
||||||
version "1.2.1"
|
version "1.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
|
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
|
||||||
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
|
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue