feat: use version meta

fixes #150
This commit is contained in:
2025-02-13 16:16:33 +01:00
parent 4d73dad780
commit 7ca9e04dd3
20 changed files with 349 additions and 648 deletions

View File

@@ -1,6 +0,0 @@
{
"CHARACHORDER ONE M0": {
"latest": "1.1.3",
"next": null
}
}

View File

@@ -1,8 +1,8 @@
import type { PageLoad } from "./$types";
import type { DirectoryListing } from "./listing";
import type { DirectoryListing } from "$lib/meta/types/listing";
export const load = (async ({ fetch }) => {
const result = await fetch(import.meta.env.VITE_FIRMWARE_URL);
const result = await fetch(`${import.meta.env.VITE_FIRMWARE_URL}/`);
const data = await result.json();
return { devices: data as DirectoryListing[] };

View File

@@ -1,5 +1,5 @@
import type { PageLoad } from "./$types";
import type { DirectoryListing } from "../listing";
import type { DirectoryListing } from "$lib/meta/types/listing";
export const load = (async ({ fetch, params }) => {
const result = await fetch(

View File

@@ -27,7 +27,7 @@
$serialPort = undefined;
try {
const file = await fetch(
`${data.meta.path}/${data.meta.update.ota?.name}`,
`${data.meta.path}/${data.meta.update.ota}`,
).then((it) => it.blob());
await port.updateFirmware(file);
@@ -46,7 +46,7 @@
: undefined,
);
let isCorrectDevice = $derived(
currentDevice ? currentDevice === data.meta.target : undefined,
currentDevice ? currentDevice === data.meta.device : undefined,
);
/**
@@ -84,11 +84,11 @@
async function getFileSystem() {
if (!data.meta.update.uf2) return;
const uf2Promise = fetch(
`${data.meta.path}/${data.meta.update.uf2.name}`,
).then((it) => it.blob());
const uf2Promise = fetch(`${data.meta.path}/${data.meta.update.uf2}`).then(
(it) => it.blob(),
);
const handle = await window.showSaveFilePicker({
id: `${data.meta.target}-update`,
id: `${data.meta.device}-update`,
suggestedName: "CURRENT.UF2",
excludeAcceptAllOption: true,
types: [
@@ -172,7 +172,7 @@
const port = await navigator.serial.requestPort();
try {
console.log(data.meta);
const spiFlash = data.meta.spi_flash!;
const spiFlash = data.meta.spiFlash!;
espLoader = await connectEsp(port);
/*espLoader.flashSpiAttach(
@@ -189,7 +189,7 @@
</script>
<div class="container">
{#if data.meta.update.ota && !data.meta.target.endsWith("m0")}
{#if data.meta.update.ota && !data.meta.device.endsWith("m0")}
{@const buttonError = error || (!success && isCorrectDevice === false)}
<section>
<button

View File

@@ -1,50 +1,14 @@
import type { PageLoad } from "./$types";
import type { FileListing, Listing } from "../../listing";
import type { VersionMeta } from "$lib/meta";
import { getMeta } from "$lib/meta/meta-storage";
import { error } from "@sveltejs/kit";
export const load = (async ({ fetch, params }) => {
const result = await fetch(
`${import.meta.env.VITE_FIRMWARE_URL}/${params.device}/${params.version}/`,
);
const data: Listing[] = await result.json();
const meta: VersionMeta | undefined = data.some(
(entry) => entry.type === "file" && entry.name === "meta.json",
)
? await fetch(
`${import.meta.env.VITE_FIRMWARE_URL}/${params.device}/${params.version}/meta.json`,
).then((res) => res.json())
: undefined;
return {
meta: {
version: meta?.version ?? params.version,
target: meta?.target ?? params.device,
path: `${import.meta.env.VITE_FIRMWARE_URL}${params.device}/${params.version}`,
git_commit: meta?.git_commit ?? "",
git_is_dirty: meta?.git_is_dirty ?? false,
git_date: meta?.git_date ?? data[0]?.mtime ?? "",
public_build: meta?.public_build ?? !params.version.includes("+"),
development_mode: meta?.development_mode ?? 0,
update: {
uf2:
(data.find(
(entry) =>
entry.type === "file" &&
entry.name === (meta?.update?.uf2 ?? "CURRENT.UF2"),
) as FileListing) ?? undefined,
ota:
data.find(
(entry) =>
entry.type === "file" &&
entry.name === (meta?.update?.ota ?? "firmware.bin"),
) ?? undefined,
esptool: meta?.update?.esptool ?? undefined,
},
files: data.filter(
(entry) =>
entry.type === "file" && (!meta?.files || entry.name in meta.files),
) as FileListing[],
spi_flash: meta?.spi_flash ?? undefined,
},
};
const meta = await getMeta(params.device, params.version, fetch);
if (meta === undefined) {
error(
404,
`The version ${params.version} for device ${params.device} does not exist.`,
);
}
return { meta };
}) satisfies PageLoad;

View File

@@ -1,14 +0,0 @@
export type Listing = FileListing | DirectoryListing;
export interface DirectoryListing {
name: string;
type: "directory";
mtime: string;
}
export interface FileListing {
name: string;
type: "file";
mtime: string;
size: number;
}

View File

@@ -1,5 +1,5 @@
<script lang="ts">
import { initMatrixClient, isLoggedIn, matrix } from "$lib/chat/chat";
import { initMatrixClient, isLoggedIn, matrix } from "$lib/chat/chat-rx";
import { flip } from "svelte/animate";
import { slide } from "svelte/transition";
import Login from "./Login.svelte";

View File

@@ -1,5 +1,5 @@
<script lang="ts">
import { KEYMAP_CODES } from "$lib/serial/keymap-codes";
import { KEYMAP_CODES, type KeyInfo } from "$lib/serial/keymap-codes";
import FlexSearch from "flexsearch";
import LL from "$i18n/i18n-svelte";
import { action } from "$lib/title";
@@ -40,16 +40,21 @@
$effect(() => {
abortIndexing?.();
progress = 0;
buildIndex($chords, $osLayout).then(searchIndex.set);
buildIndex($chords, $osLayout, $KEYMAP_CODES).then(searchIndex.set);
});
function encodeChord(chord: ChordInfo, osLayout: Map<string, string>, onlyPhrase: boolean = false) {
function encodeChord(
chord: ChordInfo,
osLayout: Map<string, string>,
codes: Map<number, KeyInfo>,
onlyPhrase: boolean = false,
) {
const plainPhrase: string[] = [""];
const extraActions: string[] = [];
const extraCodes: string[] = [];
for (const actionCode of chord.phrase ?? []) {
const action = KEYMAP_CODES.get(actionCode);
const action = codes.get(actionCode);
if (!action) {
extraCodes.push(`0x${actionCode.toString(16)}`);
continue;
@@ -96,7 +101,7 @@
const input = chord.actions
.slice(chord.actions.lastIndexOf(0) + 1)
.map((it) => {
const info = KEYMAP_CODES.get(it);
const info = codes.get(it);
if (!info) return `0x${it.toString(16)}`;
const osCode = info.keyCode && osLayout.get(info.keyCode);
const result = osCode?.length === 1 ? osCode : info.id;
@@ -118,6 +123,7 @@
async function buildIndex(
chords: ChordInfo[],
osLayout: Map<string, string>,
codes: Map<number, KeyInfo>,
): Promise<FlexSearch.Index> {
if (chords.length === 0 || !browser) return index;
index = new FlexSearch.Index({
@@ -148,7 +154,7 @@
progress = i;
if ("phrase" in chord) {
await index.addAsync(i, encodeChord(chord, osLayout));
await index.addAsync(i, encodeChord(chord, osLayout, codes));
}
}
return index;
@@ -186,7 +192,9 @@
function downloadVocabulary() {
const vocabulary = new Set(
$chords.map((it) =>
"phrase" in it ? encodeChord(it, $osLayout, true).trim() : "",
"phrase" in it
? encodeChord(it, $osLayout, $KEYMAP_CODES, true).trim()
: "",
),
);
vocabulary.delete("");