Skip to content

Instantly share code, notes, and snippets.

View browser-gzip.ts
declare const DecompressionStream: any;
declare const CompressionStream: any;
const encoder = new TextEncoder();
const decoder = new TextDecoder();
async function compress(str: string): Promise<ArrayBuffer> {
const cs = new CompressionStream("gzip");
const buf = encoder.encode(str);
const stream = new Response(buf).body!.pipeThrough(cs);
return new Response(stream as any).arrayBuffer();
@mizchi
mizchi / portal-guest.html
Created Jun 4, 2021
portal communication
View portal-guest.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
</head>
<body style="height: 200vh">
<h1>portal guest</h1>
<script>
portalHost.postMessage("foo");
portalHost.onmessage = (ev) => {
View index.js
export function __test__({ test }) {
test("xxx", () => {
console.log("ok");
});
}
console.log("...");
View deno_code_reading_20210516.md

Deno の コードリーディング

動機

cloudflare worker, deno deploy 等で v8 isolates を前提にしたホスティングプラットフォームが増えている。これを自分で実装してみたいと思った。

denoland/rusty_v8 を読んだが、SnapshotCreator の使い方がよくわからなかった。これを deno 本体を読んで使い方を調べた。

ついでに、rusty_v8、というか v8 にはメインループやスケジューラが含まれていないので、 Tokio のメインループで、どのように deno が非同期メインループを実装しているか調べた。

View rusty_v8_minimum_snapshot.rs
use rusty_v8 as v8;
use std::mem::forget;
fn main() {
let platform = v8::new_default_platform().unwrap();
v8::V8::initialize_platform(platform);
v8::V8::initialize();
let snapshot;
// --- create snapshot ---
{
View how_to_use_deno_snapshot.rs
// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
use deno_core::{JsRuntime, RuntimeOptions, Snapshot};
fn main() {
// create snapshot
let mut runtime = JsRuntime::new(RuntimeOptions {
will_snapshot: true,
..Default::default()
});
View context_store.ts
type EventBase = {
__uid?: string;
__ts?: number;
};
type PubSub<Event> = {
dispatch: (ev: Event) => void;
subscribe: (fn: (ev: Event) => void) => void;
};
View select-frontend-tech.md

フロントエンドの技術選定で考えること

Frontend Study 用

前提: フロントエンドは式年遷宮が有効である

  • DB を持たないため、表層の技術を交換するだけで済む
    • JSON API が実質的な分解点になっている
    • 近年ではモバイルアプリのために JSON API が切り離されていることが多く、ここの利用者になるだけでよい
    • Rails や PHP で ORM ヘルパーにべったりな場合に困難になる(クライアントで同等のバリデーションを再現する必要)
View runGraphqlCodegen.ts
import { graphql, parse } from "graphql";
import gql from "graphql-tag";
import type { DocumentNode } from "graphql";
const documentNode = gql`
type Query {
userData(q: UserDataQuery!): UserData!
template(source: String!, args: [UserDataQuery!]!): ExpandedTemplate!
}