From 7751969326d87b880a0367867185ad45998a4b21 Mon Sep 17 00:00:00 2001 From: x1unix Date: Mon, 15 Jul 2024 21:28:10 -0400 Subject: [PATCH] chore: remove unused 'lib/gowasm' package --- internal/gowasm/IMPORTS.md | 67 ------ web/src/lib/go/types/spec.ts | 2 +- web/src/lib/gowasm/binder.ts | 89 -------- .../lib/gowasm/bindings/browserfs/binding.ts | 210 ------------------ .../gowasm/bindings/browserfs/filestore.ts | 57 ----- .../lib/gowasm/bindings/browserfs/index.ts | 3 - .../lib/gowasm/bindings/browserfs/types.ts | 42 ---- .../lib/gowasm/bindings/packagedb/binding.ts | 126 ----------- .../lib/gowasm/bindings/packagedb/index.ts | 2 - .../lib/gowasm/bindings/packagedb/pkgindex.ts | 28 --- web/src/lib/gowasm/bindings/stdio/binding.ts | 30 --- web/src/lib/gowasm/bindings/stdio/console.ts | 9 - web/src/lib/gowasm/bindings/stdio/index.ts | 2 - web/src/lib/gowasm/bindings/wlog/binding.ts | 30 --- web/src/lib/gowasm/bindings/wlog/index.ts | 2 - web/src/lib/gowasm/bindings/wlog/logger.ts | 12 - web/src/lib/gowasm/bindings/worker/binding.ts | 27 --- web/src/lib/gowasm/bindings/worker/index.ts | 2 - web/src/lib/gowasm/bindings/worker/types.ts | 7 - web/src/lib/gowasm/index.ts | 1 - web/src/lib/gowasm/syscall.ts | 86 ------- web/src/lib/gowasm/utils.ts | 6 - 22 files changed, 1 insertion(+), 839 deletions(-) delete mode 100644 internal/gowasm/IMPORTS.md delete mode 100644 web/src/lib/gowasm/binder.ts delete mode 100644 web/src/lib/gowasm/bindings/browserfs/binding.ts delete mode 100644 web/src/lib/gowasm/bindings/browserfs/filestore.ts delete mode 100644 web/src/lib/gowasm/bindings/browserfs/index.ts delete mode 100644 web/src/lib/gowasm/bindings/browserfs/types.ts delete mode 100644 web/src/lib/gowasm/bindings/packagedb/binding.ts delete mode 100644 web/src/lib/gowasm/bindings/packagedb/index.ts delete mode 100644 web/src/lib/gowasm/bindings/packagedb/pkgindex.ts delete mode 100644 web/src/lib/gowasm/bindings/stdio/binding.ts delete mode 100644 web/src/lib/gowasm/bindings/stdio/console.ts delete mode 100644 web/src/lib/gowasm/bindings/stdio/index.ts delete mode 100644 web/src/lib/gowasm/bindings/wlog/binding.ts delete mode 100644 web/src/lib/gowasm/bindings/wlog/index.ts delete mode 100644 web/src/lib/gowasm/bindings/wlog/logger.ts delete mode 100644 web/src/lib/gowasm/bindings/worker/binding.ts delete mode 100644 web/src/lib/gowasm/bindings/worker/index.ts delete mode 100644 web/src/lib/gowasm/bindings/worker/types.ts delete mode 100644 web/src/lib/gowasm/index.ts delete mode 100644 web/src/lib/gowasm/syscall.ts delete mode 100644 web/src/lib/gowasm/utils.ts diff --git a/internal/gowasm/IMPORTS.md b/internal/gowasm/IMPORTS.md deleted file mode 100644 index 2c0d78bf..00000000 --- a/internal/gowasm/IMPORTS.md +++ /dev/null @@ -1,67 +0,0 @@ -# WebAssembly Imports List - -Here is a list of WASM module imports that the package expects from WASM host. - -Each function has a prefix of package name in format: `path/to/package.functionName` - -## Core - -List of core functions required for all gowasm-based functionality. - -**Import name prefix:** `github.com/x1unix/go-playground/internal/gowasm` - -**Imports:** - -* `func registerCallbackHandler(fn js.Func)` -* `func wasmConsoleWrite(fd int, data []byte)` - -See: - -* [callback_js.s](callback_js.s) - -## Wlog - -Wlog is logging interface for WASM workers. Used by other wasm-related packages. - -**Import name prefix:** `github.com/x1unix/go-playground/internal/gowasm/wlog` - -* `func logWrite(level uint8, data []byte)` - -See: - -* * [logger_js.s](wlog/writer_js.s) - -## BrowserFS - -BrowserFS package implements `fs.FS` interface for IndexedDB-based file system. - -**Import name prefix:** `github.com/x1unix/go-playground/internal/gowasm/browserfs` - -**Imports:** - - * `func stat(name string, out *inode, cb int)` - * `func readDir(name string, out []inode, cb int)` - * `func readFile(f inode, out []byte, cb int)` - * `func writeFile(name string, data []byte, cb int)` - * `func makeDir(name string, cb int)` - * `func unlink(name string, cb int)` - -See: - -* [browserfs/syscall_js.s](browserfs/syscall_js.s) - -## PackageDB - -Interface to access Go modules cache stored in IndexedDB. - -**Import name prefix:** `github.com/x1unix/go-playground/internal/gowasm/packagedb` - -**Imports:** - -* `func lookupPackage(pkgName string, out []byte, cb int)` -* `func registerPackage(pkgName, version string, cb int)` -* `func removePackage(okgName string, cb int)` - -See: - -* [packagedb/syscall_js.s](packagedb/syscall_js.s) diff --git a/web/src/lib/go/types/spec.ts b/web/src/lib/go/types/spec.ts index e73d8345..15c03781 100644 --- a/web/src/lib/go/types/spec.ts +++ b/web/src/lib/go/types/spec.ts @@ -24,7 +24,7 @@ export abstract class AbstractTypeSpec { private _size = 0 private _align = 1 private _skip = 0 - private readonly _name = '' + private readonly _name: string = '' /** * @param name Original type name. diff --git a/web/src/lib/gowasm/binder.ts b/web/src/lib/gowasm/binder.ts deleted file mode 100644 index 0b2c6402..00000000 --- a/web/src/lib/gowasm/binder.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { type CallImportHandler, type GoWrapper } from '~/lib/go/wrapper/wrapper' - -const goExportMetadataKey = Symbol('@GoExportMetadata') - -/** - * Base class for all classes who export methods to Go. - */ -// eslint-disable-next-line @typescript-eslint/no-extraneous-class -export class PackageBinding { - private static [goExportMetadataKey]?: GoExportMetadata -} - -interface GoExportMetadata { - packageName: string - symbols: Array<[string, CallImportHandler]> -} - -const defineExportMetadata = (target: any, meta: GoExportMetadata) => { - Object.defineProperty(target, goExportMetadataKey, { - configurable: false, - enumerable: false, - writable: false, - value: meta, - }) -} - -const getGoExportMetadata = (target): GoExportMetadata | undefined => { - return target[goExportMetadataKey] -} - -/** - * Package decorator adds base package name for all exported class methods. - * @param pkgName Go package name - * @constructor - */ -export const Package = - (pkgName: string): ClassDecorator => - (constructor: Function) => { - const meta = getGoExportMetadata(constructor.prototype) - if (meta) { - meta.packageName = pkgName - return - } - - defineExportMetadata(constructor.prototype, { - packageName: pkgName, - symbols: [], - }) - } - -/** - * WasmExport decorator adds class method to exports with given symbol name. - * @param funcName Go function name to be linked with. - * @constructor - */ -export const WasmExport = - (funcName: string): MethodDecorator => - (target, propertyKey, descriptor) => { - const func = descriptor.value! as unknown as CallImportHandler - const meta = getGoExportMetadata(target) - - if (meta) { - meta.symbols.push([funcName, func]) - return - } - - defineExportMetadata(target, { - packageName: '', - symbols: [[funcName, func]], - }) - } - -/** - * Adds exports to Go from given class instance. - * - * @param go Go wrapper instance - * @param srcObj instance - */ -export const registerExportObject = (go: GoWrapper, srcObj: PackageBinding) => { - const meta = getGoExportMetadata(srcObj) - if (!meta) { - throw new Error(`Go export metadata is missing.`) - } - - const { packageName, symbols } = meta - for (const [funcName, func] of symbols) { - go.exportFunction(`${packageName}.${funcName}`, (sp, reader, mem) => func.call(srcObj, sp, reader, mem)) - } -} diff --git a/web/src/lib/gowasm/bindings/browserfs/binding.ts b/web/src/lib/gowasm/bindings/browserfs/binding.ts deleted file mode 100644 index 87fe448e..00000000 --- a/web/src/lib/gowasm/bindings/browserfs/binding.ts +++ /dev/null @@ -1,210 +0,0 @@ -import { - Int, - UintPtr, - ArrayTypeSpec, - GoStringType, - type MemoryView, - type SliceHeader, - SliceHeaderType, - type StackReader, - stringEncoder, -} from '~/lib/go' -import { Errno, SyscallError } from '~/lib/go/pkg/syscall' -import { Package, PackageBinding, WasmExport } from '../../binder' -import { type Inode, MAX_FILE_NAME_LEN, TInode } from './types' -import type SyscallHelper from '../../syscall' -import { type FileStore } from './filestore' - -const checkFileNameLimit = (strLen: number) => { - if (!strLen) { - throw new SyscallError(Errno.EINVAL) - } - - if (strLen > MAX_FILE_NAME_LEN) { - throw new SyscallError(Errno.ENAMETOOLONG) - } -} - -const validateFileName = (name: string) => { - checkFileNameLimit(name.length) -} - -/** - * WASM imports binding for emulated package cache filesystem. - * - * @see internal/gowasm/browserfs/syscall_js.go - */ -@Package('github.com/x1unix/go-playground/internal/gowasm/browserfs') -export class BrowserFSBinding extends PackageBinding { - constructor( - private readonly helper: SyscallHelper, - private readonly store: FileStore, - ) { - super() - } - - // func stat(name string, out *inode, cb int) - @WasmExport('stat') - stat(sp: number, reader: StackReader, mem: MemoryView) { - reader.skipHeader() - const fileName = reader.next(GoStringType) - const outPtr = reader.next(UintPtr) - const cbId = reader.next(Int) - - if (!cbId) { - throw new SyscallError(Errno.EBADSLT) - } - - this.helper.doAsync(cbId, async () => { - validateFileName(fileName) - - if (!outPtr) { - throw new SyscallError(Errno.EFAULT) - } - - const { name, ...result } = await this.store.stat(fileName) - mem.write(outPtr, TInode, { - ...result, - name: { - len: name.length, - data: stringEncoder.encode(name), - }, - }) - }) - } - - // func readDir(name string, out *[]inode, cb int) - @WasmExport('readDir') - readDir(sp: number, reader: StackReader, mem: MemoryView) { - reader.skipHeader() - const dirName = reader.next(GoStringType) - const outSlicePtr = reader.next(UintPtr) - const cbId = reader.next(Int) - - if (!cbId) { - throw new SyscallError(Errno.EBADSLT) - } - - this.helper.doAsync(cbId, async () => { - validateFileName(dirName) - - if (!outSlicePtr) { - throw new SyscallError(Errno.EFAULT) - } - - const outSlice = mem.read(outSlicePtr, SliceHeaderType) - const items = await this.store.readDir(dirName) - if (items.length > outSlice.cap) { - throw new SyscallError(Errno.ENOMEM) - } - - const inodes = items.map(({ name, ...props }) => { - const encodedName = stringEncoder.encode(name) - return { - ...props, - name: { - len: encodedName.length, - data: encodedName, - }, - } - }) - - // Update slice length - outSlice.len = items.length - mem.write(outSlicePtr, SliceHeaderType, outSlice) - mem.write(outSlice.data, new ArrayTypeSpec(TInode, items.length), inodes) - }) - } - - // func readFile(f inode, out *[]byte, cb int) - @WasmExport('readFile') - readFile(sp: number, reader: StackReader, mem: MemoryView) { - reader.skipHeader() - const fileId = reader.next(UintPtr) - const slicePtr = reader.next(UintPtr) - const cbId = reader.next(Int) - - if (!cbId) { - throw new SyscallError(Errno.EBADSLT) - } - - this.helper.doAsync(cbId, async () => { - if (!slicePtr) { - throw new SyscallError(Errno.EFAULT) - } - - const data = await this.store.readFile(fileId) - - const dstSlice = mem.read(slicePtr, SliceHeaderType) - if (data.length > dstSlice.cap) { - throw new SyscallError(Errno.ENOMEM) - } - - // Update slice length - dstSlice.len = data.length - mem.write(slicePtr, SliceHeaderType, dstSlice) - mem.set(dstSlice.data, data) - }) - } - - // func writeFile(name string, data []byte, cb int) - @WasmExport('writeFile') - writeFile(sp: number, reader: StackReader, mem: MemoryView) { - reader.skipHeader() - const fname = reader.next(GoStringType) - const srcSlice = reader.next(SliceHeaderType) - const cbId = reader.next(Int) - - if (!cbId) { - throw new SyscallError(Errno.EBADSLT) - } - - this.helper.doAsync(cbId, async () => { - validateFileName(fname) - let data: Uint8Array - if (srcSlice.len > 0) { - if (!srcSlice.data) { - throw new SyscallError(Errno.EFAULT) - } - - data = mem.get(srcSlice.data, srcSlice.len) - } else { - data = new Uint8Array() - } - - await this.store.writeFile(fname, data) - }) - } - - // func makeDir(name string, cb int) - @WasmExport('makeDir') - makeDir(sp: number, reader: StackReader) { - reader.skipHeader() - const fname = reader.next(GoStringType) - const cbId = reader.next(Int) - if (!cbId) { - throw new SyscallError(Errno.EBADSLT) - } - - this.helper.doAsync(cbId, async () => { - validateFileName(fname) - await this.store.makeDir(fname) - }) - } - - // func unlink(name string, cb int) - @WasmExport('unlink') - unlink(sp: number, reader: StackReader) { - reader.skipHeader() - const fname = reader.next(GoStringType) - const cbId = reader.next(Int) - if (!cbId) { - throw new SyscallError(Errno.EBADSLT) - } - - this.helper.doAsync(cbId, async () => { - validateFileName(fname) - await this.store.unlink(fname) - }) - } -} diff --git a/web/src/lib/gowasm/bindings/browserfs/filestore.ts b/web/src/lib/gowasm/bindings/browserfs/filestore.ts deleted file mode 100644 index 3a61c72b..00000000 --- a/web/src/lib/gowasm/bindings/browserfs/filestore.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { type Inode } from './types' - -export interface FileInfo extends Omit { - name: string -} - -/** - * FileStore is abstract implementation of file store. - */ -export interface FileStore { - /** - * Checks if file entry exists and returns information about a file. - * - * @throws SyscallError(Errno.ENOENT) if file doesn't exist. - * @param name - */ - stat: (name: string) => Promise - - /** - * Returns a list of entries in directory. - * - * @throws SyscallError(Errno.ENOENT) if directory doesn't exist. - * @param name - */ - readDir: (name: string) => Promise - - /** - * Returns file contents. - * - * @throws SyscallError(Errno.ENOENT) if file doesn't exist. - * @param fileId - */ - readFile: (fileId: number) => Promise - - /** - * Creates a new or overwrites an existing file with specified contents. - * - * @param name File name - * @param data New contents - */ - writeFile: (name: string, data: Uint8Array) => Promise - - /** - * Creates a new directory, including its parent. - * - * @param name Directory name. - */ - makeDir: (name: string) => Promise - - /** - * Removes file or directory, including its contents. - * - * @throws SyscallError(Errno.ENOENT) if file doesn't exist. - * @param name - */ - unlink: (name: string) => Promise -} diff --git a/web/src/lib/gowasm/bindings/browserfs/index.ts b/web/src/lib/gowasm/bindings/browserfs/index.ts deleted file mode 100644 index 3a6820f7..00000000 --- a/web/src/lib/gowasm/bindings/browserfs/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './binding' -export * from './filestore' -export * from './types' diff --git a/web/src/lib/gowasm/bindings/browserfs/types.ts b/web/src/lib/gowasm/bindings/browserfs/types.ts deleted file mode 100644 index 70472254..00000000 --- a/web/src/lib/gowasm/bindings/browserfs/types.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { UInt8ArrayTypeSpec, Int64, Struct, Uint8, UintPtr } from '~/lib/go' -import { newPackageSymbolFunc } from '../../utils' - -export const MAX_FILE_NAME_LEN = 128 -export const PKG_NAME = 'github.com/x1unix/go-playground/internal/gowasm/browserfs' - -export const sym = newPackageSymbolFunc(PKG_NAME) - -export interface SizedFileName { - len: number - data: Uint8Array -} - -export enum FileType { - Zero = 0, - Regular = 1, - Directory = 2, - SymLink = 3, -} - -export interface Inode { - id: number - parentId: number - fileType: FileType - size: number - createdAt: number - name: SizedFileName -} - -export const TSizedFileName = Struct(sym('sizedFileName'), [ - { key: 'len', type: Uint8 }, - { key: 'data', type: new UInt8ArrayTypeSpec(MAX_FILE_NAME_LEN) }, -]) - -export const TInode = Struct(sym('inode'), [ - { key: 'id', type: UintPtr }, - { key: 'parentId', type: UintPtr }, - { key: 'fileType', type: Uint8 }, - { key: 'size', type: Int64 }, - { key: 'createdAt', type: Int64 }, - { key: 'name', type: TSizedFileName }, -]) diff --git a/web/src/lib/gowasm/bindings/packagedb/binding.ts b/web/src/lib/gowasm/bindings/packagedb/binding.ts deleted file mode 100644 index e83522f0..00000000 --- a/web/src/lib/gowasm/bindings/packagedb/binding.ts +++ /dev/null @@ -1,126 +0,0 @@ -import { Package, PackageBinding, WasmExport } from '../../binder' -import type SyscallHelper from '../../syscall' -import { type PackageIndex } from './pkgindex' -import { Errno, SyscallError } from '~/lib/go/pkg/syscall' -import { - GoStringType, - Int, - type MemoryView, - type SliceHeader, - SliceHeaderType, - type StackReader, - stringEncoder, - UintPtr, -} from '~/lib/go' - -/** - * @see internal/gowasm/packagedb/index.go - */ -const MAX_PACKAGE_VERSION_LENGTH = 50 - -const checkVersionStringLimit = (version: string) => { - if (!version.length) { - throw new SyscallError(Errno.EINVAL) - } - - if (version.length > MAX_PACKAGE_VERSION_LENGTH) { - throw new SyscallError(Errno.ENAMETOOLONG) - } -} - -/** - * WASM imports binding to Go packages registry. - * - * @see internal/gowasm/packagedb/syscall_js.go - */ -@Package('github.com/x1unix/go-playground/internal/gowasm/packagedb') -export class PackageDBBinding extends PackageBinding { - constructor( - private readonly helper: SyscallHelper, - private readonly index: PackageIndex, - ) { - super() - } - - // func lookupPackage(pkgName string, out *[]byte, cb int) - @WasmExport('lookupPackage') - lookupPackage(sp: number, stack: StackReader, mem: MemoryView) { - stack.skipHeader() - const pkgName = stack.next(GoStringType) - const outPtr = stack.next(UintPtr) - const cbId = stack.next(Int) - if (!cbId) { - throw new SyscallError(Errno.EBADSLT) - } - - this.helper.doAsync(cbId, async () => { - if (!outPtr) { - throw new SyscallError(Errno.EFAULT) - } - - const dstSlice = mem.read(outPtr, SliceHeaderType) - const version = await this.index.lookupPackage(pkgName) - if (!version) { - throw new SyscallError(Errno.ENOENT) - } - - if (dstSlice.cap < version.length) { - throw new SyscallError(Errno.ENOMEM) - } - - if (!dstSlice.data) { - throw new SyscallError(Errno.EFAULT) - } - - const versionBytes = stringEncoder.encode(version) - - // Update slice length - dstSlice.len = versionBytes.length - mem.write(outPtr, SliceHeaderType, dstSlice) - mem.set(dstSlice.data, versionBytes) - }) - } - - // func registerPackage(pkgName, version string, cb int) - @WasmExport('registerPackage') - registerPackage(sp: number, stack: StackReader, mem: MemoryView) { - stack.skipHeader() - const pkgName = stack.next(GoStringType) - const version = stack.next(GoStringType) - const cbId = stack.next(Int) - if (!cbId) { - throw new SyscallError(Errno.EBADSLT) - } - - this.helper.doAsync(cbId, async () => { - checkVersionStringLimit(version) - if (!pkgName.length) { - throw new SyscallError(Errno.EINVAL) - } - - await this.index.registerPackage(pkgName, version) - }) - } - - // func removePackage(pkgName string, cb int) - @WasmExport('removePackage') - removePackage(sp: number, stack: StackReader, mem: MemoryView) { - stack.skipHeader() - const pkgName = stack.next(GoStringType) - const cbId = stack.next(Int) - if (!cbId) { - throw new SyscallError(Errno.EBADSLT) - } - - this.helper.doAsync(cbId, async () => { - if (!pkgName.length) { - throw new SyscallError(Errno.EINVAL) - } - - const ok = await this.index.removePackage(pkgName) - if (!ok) { - throw new SyscallError(Errno.ENOENT) - } - }) - } -} diff --git a/web/src/lib/gowasm/bindings/packagedb/index.ts b/web/src/lib/gowasm/bindings/packagedb/index.ts deleted file mode 100644 index d2558b91..00000000 --- a/web/src/lib/gowasm/bindings/packagedb/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './binding' -export * from './pkgindex' diff --git a/web/src/lib/gowasm/bindings/packagedb/pkgindex.ts b/web/src/lib/gowasm/bindings/packagedb/pkgindex.ts deleted file mode 100644 index 4b1b40d2..00000000 --- a/web/src/lib/gowasm/bindings/packagedb/pkgindex.ts +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Package index interface - */ -export interface PackageIndex { - /** - * Looks up for a package and returns its version. - * Returns null if no package was found in cache. - * - * @param name Package name - */ - lookupPackage: (name: string) => Promise - - /** - * Registers or updates an existing package information in index. - * - * @param pkgName Package name - * @param version Version - */ - registerPackage: (pkgName: string, version: string) => Promise - - /** - * Removes package from index. - * Returns false if package didn't exist. - * - * @param pkgName Package name - */ - removePackage: (pkgName: string) => Promise -} diff --git a/web/src/lib/gowasm/bindings/stdio/binding.ts b/web/src/lib/gowasm/bindings/stdio/binding.ts deleted file mode 100644 index 03053a29..00000000 --- a/web/src/lib/gowasm/bindings/stdio/binding.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Package, PackageBinding, WasmExport } from '~/lib/gowasm' -import { Int, type MemoryView, type SliceHeader, SliceHeaderType, type StackReader, stringDecoder } from '~/lib/go' -import { type ConsoleHandler, type ConsoleStreamType } from './console' - -/** - * WASM imports binding to console input/output. - * - * @see internal/gowasm/stdio_js.go - */ -@Package('github.com/x1unix/go-playground/internal/gowasm') -export class ConsoleBinding extends PackageBinding { - constructor(private readonly handler: ConsoleHandler) { - super() - } - - // func wasmConsoleWrite(fd int, data []byte) - @WasmExport('wasmConsoleWrite') - consoleWrite(sp: number, stack: StackReader, mem: MemoryView) { - stack.skipHeader() - const fd = stack.next(Int) - const slice = stack.next(SliceHeaderType) - - if (!slice.len || !slice.data) { - return - } - - const msg = stringDecoder.decode(mem.get(slice.data, slice.len, false)) - this.handler.write(fd, msg) - } -} diff --git a/web/src/lib/gowasm/bindings/stdio/console.ts b/web/src/lib/gowasm/bindings/stdio/console.ts deleted file mode 100644 index b66975a6..00000000 --- a/web/src/lib/gowasm/bindings/stdio/console.ts +++ /dev/null @@ -1,9 +0,0 @@ -export enum ConsoleStreamType { - Stdin = 0, - Stdout = 1, - Stderr = 2, -} - -export interface ConsoleHandler { - write: (fd: ConsoleStreamType, msg: string) => any -} diff --git a/web/src/lib/gowasm/bindings/stdio/index.ts b/web/src/lib/gowasm/bindings/stdio/index.ts deleted file mode 100644 index e44d61b5..00000000 --- a/web/src/lib/gowasm/bindings/stdio/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './binding' -export * from './console' diff --git a/web/src/lib/gowasm/bindings/wlog/binding.ts b/web/src/lib/gowasm/bindings/wlog/binding.ts deleted file mode 100644 index fb778e3a..00000000 --- a/web/src/lib/gowasm/bindings/wlog/binding.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Package, PackageBinding, WasmExport } from '~/lib/gowasm' -import { type MemoryView, type SliceHeader, SliceHeaderType, type StackReader, stringDecoder, Uint8 } from '~/lib/go' -import { ConsoleLogger, type Logger } from '~/lib/gowasm/bindings/wlog/logger' - -enum LogLevel { - Debug = 0, - Info = 1, -} - -@Package('github.com/x1unix/go-playground/internal/gowasm/wlog') -export class LoggerBinding extends PackageBinding { - constructor(private readonly logger: Logger = ConsoleLogger) { - super() - } - - @WasmExport('logWrite') - logWrite(sp: number, stack: StackReader, mem: MemoryView) { - stack.skipHeader() - const level = stack.next(Uint8) - const msgSlice = stack.next(SliceHeaderType) - const msg = stringDecoder.decode(mem.get(msgSlice.data, msgSlice.len, false)) - - if (level === LogLevel.Debug) { - this.logger.debug(msg) - return - } - - this.logger.info(msg) - } -} diff --git a/web/src/lib/gowasm/bindings/wlog/index.ts b/web/src/lib/gowasm/bindings/wlog/index.ts deleted file mode 100644 index 31a5a39b..00000000 --- a/web/src/lib/gowasm/bindings/wlog/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './binding' -export * from './logger' diff --git a/web/src/lib/gowasm/bindings/wlog/logger.ts b/web/src/lib/gowasm/bindings/wlog/logger.ts deleted file mode 100644 index 8732abc8..00000000 --- a/web/src/lib/gowasm/bindings/wlog/logger.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Logger implements service logger interface - */ -export interface Logger { - info: (msg: string) => any - debug: (msg: string) => any -} - -export const ConsoleLogger: Logger = { - info: console.log, - debug: console.log, -} diff --git a/web/src/lib/gowasm/bindings/worker/binding.ts b/web/src/lib/gowasm/bindings/worker/binding.ts deleted file mode 100644 index 3f7fb1bb..00000000 --- a/web/src/lib/gowasm/bindings/worker/binding.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Package, PackageBinding, WasmExport } from '~/lib/gowasm' -import { type Func, FuncType } from '~/lib/go/pkg/syscall/js' -import { type MemoryView, type StackReader, SliceOf, GoStringType, type GoWrapper } from '~/lib/go' -import { type Worker, type WorkerListener } from './types' - -@Package('github.com/x1unix/go-playground/internal/gowasm') -export class WorkerBinding extends PackageBinding { - constructor( - private readonly go: GoWrapper, - private readonly handler: WorkerListener, - ) { - super() - } - - // func registerWorkerEntrypoint(methods []string, handler js.Func) - @WasmExport('registerWorkerEntrypoint') - registerWorkerEntrypoint(sp: number, stack: StackReader, mem: MemoryView) { - // TODO: figure out why js.Func is not valid (Go: 24 but calculated size is 20) - stack.skipHeader() - const methods = stack.next(SliceOf(GoStringType)) - const callbackHandler = stack.next(FuncType) - const exportObj: T = Object.fromEntries( - methods.map((m) => [m, (...args) => this.go.callFunc(callbackHandler, [m, ...args])]), - ) as any - this.handler.onWorkerRegister(exportObj) - } -} diff --git a/web/src/lib/gowasm/bindings/worker/index.ts b/web/src/lib/gowasm/bindings/worker/index.ts deleted file mode 100644 index c49a0e76..00000000 --- a/web/src/lib/gowasm/bindings/worker/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './binding' -export * from './types' diff --git a/web/src/lib/gowasm/bindings/worker/types.ts b/web/src/lib/gowasm/bindings/worker/types.ts deleted file mode 100644 index 3d4c617a..00000000 --- a/web/src/lib/gowasm/bindings/worker/types.ts +++ /dev/null @@ -1,7 +0,0 @@ -export interface Worker { - exit: () => any -} - -export interface WorkerListener { - onWorkerRegister: (worker: T) => any -} diff --git a/web/src/lib/gowasm/index.ts b/web/src/lib/gowasm/index.ts deleted file mode 100644 index c341bac0..00000000 --- a/web/src/lib/gowasm/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './binder' diff --git a/web/src/lib/gowasm/syscall.ts b/web/src/lib/gowasm/syscall.ts deleted file mode 100644 index 32c77be3..00000000 --- a/web/src/lib/gowasm/syscall.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { WasmExport, Package, PackageBinding } from '~/lib/gowasm/binder' -import { type GoWrapper, js, type StackReader } from '~/lib/go' -import { Errno, SyscallError } from '~/lib/go/pkg/syscall' - -// list of syscall errors which should not be logged. -const suppressedErrors = new Set([Errno.ENOENT]) - -/** - * SyscallHelper contains extensions required for "gowasm" package. - * - * See: internal/gowasm/callback_js.go - */ -@Package('github.com/x1unix/go-playground/internal/gowasm') -export default class SyscallHelper extends PackageBinding { - private callbackFunc?: js.Func - - constructor( - private readonly go: GoWrapper, - private readonly debug = false, - ) { - super() - } - - @WasmExport('registerCallbackHandler') - private registerCallbackHandler(sp: number, reader: StackReader) { - reader.skipHeader() - const callbackFunc = reader.next(js.FuncType) - console.log('js: registered callback handler', callbackFunc) - this.callbackFunc = callbackFunc - } - - /** - * Send and notify Go about callback result. - * @param callbackId Callback ID - * @param result Result - */ - sendCallbackResult(callbackId: number, result: number) { - if (!this.callbackFunc) { - throw new Error('SyscallHelper: callback handler not registered.') - } - - if (this.debug) { - console.log('SyscallHelper: sendCallbackResult', { callbackId, result }) - } - - this.go.callFunc(this.callbackFunc, [callbackId, result]) - } - - /** - * Reports async error back to Go caller. - * - * If passed error is SyscallError, it will use its origin error code. - * @param callbackId - * @param err - */ - sendErrorResult(callbackId: number, err: Error | DOMException | Errno) { - const sysErr = SyscallError.fromError(err) - if (!suppressedErrors.has(sysErr.errno)) { - // eslint-disable-next-line @typescript-eslint/no-base-to-string - console.error(`gowasm: async callback thrown an error: ${err} (errno: ${sysErr.errno}, id: ${callbackId})`) - } - this.sendCallbackResult(callbackId, sysErr.errno) - } - - /** - * Perform async operation and return result to the Go worker by callback ID. - * - * Any throw error will be sent as error code back to Go worker. - * - * @param callbackId Callback ID - * @param fn Async function - */ - doAsync(callbackId: number, fn: () => Promise) { - try { - fn() - .then(() => { - this.sendCallbackResult(callbackId, 0) - }) - .catch((err: Error) => { - this.sendErrorResult(callbackId, err) - }) - } catch (err) { - this.sendErrorResult(callbackId, err as Error) - } - } -} diff --git a/web/src/lib/gowasm/utils.ts b/web/src/lib/gowasm/utils.ts deleted file mode 100644 index 3df5b167..00000000 --- a/web/src/lib/gowasm/utils.ts +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Returns a new function which appends package name to function/symbol name. - * - * @param pkgName Go Package name - */ -export const newPackageSymbolFunc = (pkgName) => (fnName) => `${pkgName}.${fnName}`