├── .editorconfig ├── .eslintignore ├── .eslintrc.json ├── .github └── workflows │ └── gatsby.yml ├── .gitignore ├── .prettierrc ├── LICENSE ├── README.md ├── csv.js ├── gatsby-config.js ├── gatsby-node.js ├── lessons ├── assembly-script │ ├── assembly-script.md │ ├── exercises │ │ ├── 1 │ │ │ └── iwasm │ │ │ │ ├── asconfig.json │ │ │ │ ├── assembly │ │ │ │ ├── index.ts │ │ │ │ └── tsconfig.json │ │ │ │ ├── build │ │ │ │ ├── .gitignore │ │ │ │ ├── optimized.wat │ │ │ │ └── untouched.wat │ │ │ │ ├── index.js │ │ │ │ ├── package-lock.json │ │ │ │ ├── package.json │ │ │ │ └── tests │ │ │ │ └── index.js │ │ ├── 2 │ │ │ └── iwasm │ │ │ │ ├── asconfig.json │ │ │ │ ├── assembly │ │ │ │ ├── index.ts │ │ │ │ └── tsconfig.json │ │ │ │ ├── build │ │ │ │ ├── .gitignore │ │ │ │ ├── optimized.wat │ │ │ │ └── untouched.wat │ │ │ │ ├── index.html │ │ │ │ ├── index.js │ │ │ │ ├── js │ │ │ │ └── loader.js │ │ │ │ ├── package-lock.json │ │ │ │ ├── package.json │ │ │ │ ├── server.js │ │ │ │ └── tests │ │ │ │ └── index.js │ │ ├── 3 │ │ │ └── iwasm │ │ │ │ ├── asconfig.json │ │ │ │ ├── assembly │ │ │ │ ├── index.ts │ │ │ │ └── tsconfig.json │ │ │ │ ├── build │ │ │ │ ├── .gitignore │ │ │ │ ├── optimized.wat │ │ │ │ └── untouched.wat │ │ │ │ ├── index.html │ │ │ │ ├── index.js │ │ │ │ ├── js │ │ │ │ └── loader.js │ │ │ │ ├── package-lock.json │ │ │ │ ├── package.json │ │ │ │ ├── server.js │ │ │ │ └── tests │ │ │ │ └── index.js │ │ ├── 4 │ │ │ └── iwasm │ │ │ │ ├── asconfig.json │ │ │ │ ├── assembly │ │ │ │ ├── index.ts │ │ │ │ └── tsconfig.json │ │ │ │ ├── build │ │ │ │ ├── .gitignore │ │ │ │ ├── optimized.wat │ │ │ │ └── untouched.wat │ │ │ │ ├── index.html │ │ │ │ ├── index.js │ │ │ │ ├── js │ │ │ │ └── loader.js │ │ │ │ ├── package-lock.json │ │ │ │ ├── package.json │ │ │ │ ├── server.js │ │ │ │ └── tests │ │ │ │ └── index.js │ │ ├── 5 │ │ │ └── iwasm │ │ │ │ ├── asconfig.json │ │ │ │ ├── assembly │ │ │ │ ├── index.ts │ │ │ │ └── tsconfig.json │ │ │ │ ├── build │ │ │ │ ├── .gitignore │ │ │ │ ├── optimized.wat │ │ │ │ └── untouched.wat │ │ │ │ ├── index.html │ │ │ │ ├── index.js │ │ │ │ ├── js │ │ │ │ └── loader.js │ │ │ │ ├── package-lock.json │ │ │ │ ├── package.json │ │ │ │ ├── server.js │ │ │ │ └── tests │ │ │ │ └── index.js │ │ ├── 6 │ │ │ └── iwasm │ │ │ │ ├── asconfig.json │ │ │ │ ├── assembly │ │ │ │ ├── index.ts │ │ │ │ └── tsconfig.json │ │ │ │ ├── build │ │ │ │ ├── .gitignore │ │ │ │ ├── optimized.wat │ │ │ │ └── untouched.wat │ │ │ │ ├── index.html │ │ │ │ ├── index.js │ │ │ │ ├── js │ │ │ │ └── loader.js │ │ │ │ ├── package-lock.json │ │ │ │ ├── package.json │ │ │ │ ├── server.js │ │ │ │ └── tests │ │ │ │ └── index.js │ │ └── 7 │ │ │ └── iwasm │ │ │ ├── asconfig.json │ │ │ ├── assembly │ │ │ ├── index.ts │ │ │ └── tsconfig.json │ │ │ ├── build │ │ │ ├── .gitignore │ │ │ ├── optimized.wat │ │ │ └── untouched.wat │ │ │ ├── index.html │ │ │ ├── index.js │ │ │ ├── js │ │ │ └── loader.js │ │ │ ├── package-lock.json │ │ │ ├── package.json │ │ │ ├── server.js │ │ │ └── tests │ │ │ └── index.js │ ├── images │ │ ├── as.png │ │ └── memory.png │ ├── imports.md │ ├── js-vs-wasm.md │ ├── loader.md │ ├── loading-browser.md │ ├── loading-node.md │ ├── memory.md │ ├── setup.md │ ├── using-loader.md │ └── writing.md ├── closing.md ├── images │ ├── course.png │ ├── lasercat.png │ ├── lowhigh.png │ └── title.png ├── intro-to-wasm.md ├── intro.md ├── low-level │ ├── binary-contd.md │ ├── binary.md │ ├── hex.md │ ├── images │ │ ├── 0and1.png │ │ ├── 32bits.png │ │ ├── bit.png │ │ ├── byte.png │ │ ├── counting.png │ │ ├── endian.png │ │ ├── hex.png │ │ └── pointer.png │ ├── memory.md │ ├── tostring.md │ └── types.md └── wasm │ ├── images │ ├── intro.png │ ├── opcode-table.png │ ├── opcodes.png │ ├── wasm-v-wat.png │ └── wasmmodule.png │ ├── stack-and-opcode.md │ ├── wasm-intro-contd.md │ ├── wasm-intro.md │ └── writing-wasm.md ├── package-lock.json ├── package.json ├── postcss.config.js ├── src ├── components │ └── TOCCard.js ├── layouts │ └── index.js ├── pages │ ├── 404.js │ └── index.js ├── styles │ └── global.css ├── templates │ └── lessonTemplate.js └── util │ └── helpers.js ├── tailwind.config.js └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | end_of_line = lf 5 | insert_final_newline = true 6 | charset = utf-8 7 | indent_style = space 8 | indent_size = 2 -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | lessons/**/** 2 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "extends": [ 4 | "eslint:recommended", 5 | "plugin:import/errors", 6 | "plugin:react/recommended", 7 | "plugin:jsx-a11y/recommended", 8 | "prettier", 9 | "prettier/react" 10 | ], 11 | "rules": { 12 | "react/prop-types": 0, 13 | "jsx-a11y/label-has-for": 0, 14 | "no-console": 1 15 | }, 16 | "plugins": ["react", "import", "jsx-a11y", "@typescript-eslint"], 17 | "parser": "@typescript-eslint/parser", 18 | "parserOptions": { 19 | "ecmaVersion": 2018, 20 | "sourceType": "module", 21 | "ecmaFeatures": { 22 | "jsx": true 23 | } 24 | }, 25 | "env": { 26 | "es6": true, 27 | "browser": true, 28 | "node": true 29 | }, 30 | "settings": { 31 | "react": { 32 | "version": "16.5.2" 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /.github/workflows/gatsby.yml: -------------------------------------------------------------------------------- 1 | name: Deploy Gatsby Site to GitHub Pages 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | deploy: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@master 13 | - name: npm install, build, and csv 14 | run: | 15 | npm install 16 | npm run build 17 | npm run csv 18 | - name: Deploy site to gh-pages branch 19 | uses: alex-page/blazing-fast-gh-pages-deploy@v1.1.0 20 | with: 21 | repo-token: ${{ secrets.ACCESS_TOKEN }} 22 | site-directory: public 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Project dependencies 2 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git 3 | node_modules 4 | .cache/ 5 | # Build directory 6 | public/ 7 | .DS_Store 8 | yarn-error.log 9 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
4 | Introduction to Web Assembly 5 |
6 | -------------------------------------------------------------------------------- /csv.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs").promises; 2 | const path = require("path"); 3 | const fm = require("front-matter"); 4 | const isUrl = require("is-url-superb"); 5 | const parseLinks = require("parse-markdown-links"); 6 | const { sorter } = require("./src/util/helpers"); 7 | const mdDir = process.env.MARKDOWN_DIR || path.join(__dirname, "lessons/"); 8 | const outputPath = 9 | process.env.OUTPUT_CSV_PATH || path.join(__dirname, "public/lessons.csv"); 10 | const linksOutputPath = 11 | process.env.LINKS_CSV_PATH || path.join(__dirname, "public/links.csv"); 12 | 13 | async function createCsv() { 14 | console.log(`making the markdown files into a CSV from ${mdDir}`); 15 | 16 | // get paths 17 | const allFiles = await fs.readdir(mdDir); 18 | const files = allFiles.filter(filePath => filePath.endsWith(".md")); 19 | 20 | // read paths, get buffers 21 | const buffers = await Promise.all( 22 | files.map(filePath => fs.readFile(path.join(mdDir, filePath))) 23 | ); 24 | 25 | // make buffers strings 26 | const contents = buffers.map(content => content.toString()); 27 | 28 | // make strings objects 29 | let frontmatters = contents.map(fm); 30 | 31 | // find all attribute keys 32 | const seenAttributes = new Set(); 33 | frontmatters.forEach(item => { 34 | Object.keys(item.attributes).forEach(attr => seenAttributes.add(attr)); 35 | }); 36 | const attributes = Array.from(seenAttributes.values()); 37 | 38 | if (attributes.includes("order")) { 39 | frontmatters = frontmatters.sort(sorter); 40 | } 41 | 42 | // get all data into an array 43 | let rows = frontmatters.map(item => { 44 | const row = attributes.map(attr => 45 | item.attributes[attr] ? JSON.stringify(item.attributes[attr]) : "" 46 | ); 47 | return row; 48 | }); 49 | 50 | // header row must be first row 51 | rows.unshift(attributes); 52 | 53 | // join into CSV string 54 | const csv = rows.map(row => row.join(",")).join("\n"); 55 | 56 | // write file out 57 | await fs.writeFile(outputPath, csv); 58 | 59 | console.log(`Wrote ${rows.length} rows to ${outputPath}`); 60 | 61 | // make links csv 62 | let longestLength = 0; 63 | let linksArray = frontmatters.map(row => { 64 | const links = parseLinks(row.body).filter(isUrl); 65 | longestLength = longestLength > links.length ? longestLength : links.length; 66 | const newRow = [row.attributes.order, row.attributes.title, ...links]; 67 | return newRow; 68 | }); 69 | 70 | if (longestLength) { 71 | // add title row 72 | linksArray = linksArray.map(array => { 73 | const lengthToFill = longestLength + 2 - array.length; 74 | return array.concat(Array.from({ length: lengthToFill }).fill("")); 75 | }); 76 | 77 | linksArray.unshift( 78 | ["order", "title"].concat( 79 | Array.from({ length: longestLength }).map((_, index) => `link${index}`) 80 | ) 81 | ); 82 | 83 | // join into CSV string 84 | const linksCsv = linksArray.map(row => row.join(",")).join("\n"); 85 | 86 | // write file out 87 | await fs.writeFile(linksOutputPath, linksCsv); 88 | 89 | console.log(`Wrote ${linksArray.length} rows to ${linksOutputPath}`); 90 | } 91 | } 92 | 93 | createCsv(); 94 | -------------------------------------------------------------------------------- /gatsby-config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | siteMetadata: { 3 | title: "Introduction to Web Assembly", 4 | subtitle: "Jem Young", 5 | description: 6 | "Jem Young - Introduction to Web Assembly - Frontend Masters", 7 | keywords: [ 8 | "web assembly", 9 | "frontend masters", 10 | "wasm", 11 | "jem young" 12 | ] 13 | }, 14 | pathPrefix: "/intro-to-web-assembly", 15 | plugins: [ 16 | `gatsby-plugin-layout`, 17 | { 18 | resolve: `gatsby-source-filesystem`, 19 | options: { 20 | path: `${__dirname}/lessons`, 21 | name: "markdown-pages" 22 | } 23 | }, 24 | `gatsby-plugin-react-helmet`, 25 | `gatsby-plugin-postcss`, 26 | { 27 | resolve: `gatsby-transformer-remark`, 28 | options: { 29 | plugins: [ 30 | `gatsby-remark-autolink-headers`, 31 | `gatsby-remark-copy-linked-files`, 32 | `gatsby-remark-prismjs`, 33 | { 34 | resolve: `gatsby-remark-images`, 35 | options: { 36 | maxWidth: 800, 37 | linkImagesToOriginal: true, 38 | sizeByPixelDensity: false 39 | } 40 | } 41 | ] 42 | } 43 | }, 44 | { 45 | resolve: `gatsby-plugin-sharp`, 46 | options: { 47 | // Available options and their defaults: 48 | base64Width: 20, 49 | forceBase64Format: `png`, // valid formats: png,jpg,webp 50 | useMozJpeg: process.env.GATSBY_JPEG_ENCODER === `MOZJPEG`, 51 | stripMetadata: true, 52 | defaultQuality: 50, 53 | failOnError: true, 54 | }, 55 | }, 56 | ] 57 | }; 58 | -------------------------------------------------------------------------------- /gatsby-node.js: -------------------------------------------------------------------------------- 1 | const path = require("path"); 2 | 3 | exports.createPages = ({ actions, graphql }) => { 4 | const { createPage } = actions; 5 | 6 | const lessonTemplate = path.resolve(`src/templates/lessonTemplate.js`); 7 | 8 | return graphql(` 9 | { 10 | allMarkdownRemark( 11 | sort: { order: DESC, fields: [frontmatter___order] } 12 | limit: 1000 13 | ) { 14 | edges { 15 | node { 16 | excerpt(pruneLength: 250) 17 | html 18 | id 19 | frontmatter { 20 | order 21 | path 22 | title 23 | } 24 | } 25 | } 26 | } 27 | } 28 | `).then(result => { 29 | if (result.errors) { 30 | return Promise.reject(result.errors); 31 | } 32 | 33 | result.data.allMarkdownRemark.edges.forEach(({ node }) => { 34 | createPage({ 35 | path: node.frontmatter.path, 36 | component: lessonTemplate 37 | }); 38 | }); 39 | }); 40 | }; 41 | -------------------------------------------------------------------------------- /lessons/assembly-script/assembly-script.md: -------------------------------------------------------------------------------- 1 | --- 2 | path: "/assembly-script" 3 | section: "AssemblyScript" 4 | order: "3A" 5 | title: "What is AssemblyScript" 6 | description: "" 7 | 8 | --- 9 |  10 | 11 | [AssemblyScript](https://www.assemblyscript.org/introduction.html) at high level is a TypeScript to WebAssembly compiler. It provides both high-level language features such as loops but also allows for low-level memory access. 12 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/1/iwasm/asconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "targets": { 3 | "debug": { 4 | "binaryFile": "build/untouched.wasm", 5 | "textFile": "build/untouched.wat", 6 | "sourceMap": true, 7 | "debug": true 8 | }, 9 | "release": { 10 | "binaryFile": "build/optimized.wasm", 11 | "textFile": "build/optimized.wat", 12 | "sourceMap": true, 13 | "optimizeLevel": 3, 14 | "shrinkLevel": 1, 15 | "converge": false, 16 | "noAssert": false 17 | } 18 | }, 19 | "options": {} 20 | } -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/1/iwasm/assembly/index.ts: -------------------------------------------------------------------------------- 1 | export function minusOne(n: i32): i32 { 2 | return n - 1 3 | } 4 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/1/iwasm/assembly/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "assemblyscript/std/assembly.json", 3 | "include": [ 4 | "./**/*.ts" 5 | ] 6 | } -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/1/iwasm/build/.gitignore: -------------------------------------------------------------------------------- 1 | *.wasm 2 | *.wasm.map 3 | *.asm.js 4 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/1/iwasm/build/optimized.wat: -------------------------------------------------------------------------------- 1 | (module 2 | (type $i32_=>_i32 (func (param i32) (result i32))) 3 | (memory $0 0) 4 | (export "minusOne" (func $assembly/index/minusOne)) 5 | (export "memory" (memory $0)) 6 | (func $assembly/index/minusOne (param $0 i32) (result i32) 7 | local.get $0 8 | i32.const 1 9 | i32.sub 10 | ) 11 | ) 12 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/1/iwasm/build/untouched.wat: -------------------------------------------------------------------------------- 1 | (module 2 | (type $i32_=>_i32 (func (param i32) (result i32))) 3 | (memory $0 0) 4 | (table $0 1 funcref) 5 | (global $~lib/memory/__data_end i32 (i32.const 8)) 6 | (global $~lib/memory/__stack_pointer (mut i32) (i32.const 16392)) 7 | (global $~lib/memory/__heap_base i32 (i32.const 16392)) 8 | (export "minusOne" (func $assembly/index/minusOne)) 9 | (export "memory" (memory $0)) 10 | (func $assembly/index/minusOne (param $0 i32) (result i32) 11 | local.get $0 12 | i32.const 1 13 | i32.sub 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/1/iwasm/index.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const loader = require("@assemblyscript/loader"); 3 | const imports = { /* imports go here */ }; 4 | const wasmModule = loader.instantiateSync(fs.readFileSync(__dirname + "/build/optimized.wasm"), imports); 5 | module.exports = wasmModule.exports; 6 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/1/iwasm/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "requires": true, 3 | "lockfileVersion": 1, 4 | "dependencies": { 5 | "@assemblyscript/loader": { 6 | "version": "0.18.7", 7 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/@assemblyscript/loader/-/loader-0.18.7.tgz", 8 | "integrity": "sha1-o7r6YudH3cjXdUnFKIzXbql2xqA=" 9 | }, 10 | "assemblyscript": { 11 | "version": "0.18.7", 12 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/assemblyscript/-/assemblyscript-0.18.7.tgz", 13 | "integrity": "sha1-tV9EKf82J88xL0c1Uht9xSQ5nMU=", 14 | "dev": true, 15 | "requires": { 16 | "binaryen": "98.0.0-nightly.20210106", 17 | "long": "^4.0.0" 18 | } 19 | }, 20 | "binaryen": { 21 | "version": "98.0.0-nightly.20210106", 22 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/binaryen/-/binaryen-98.0.0-nightly.20210106.tgz", 23 | "integrity": "sha1-x7xjfiIjqDvzyunZiWn1ae+rQGI=", 24 | "dev": true 25 | }, 26 | "long": { 27 | "version": "4.0.0", 28 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/long/-/long-4.0.0.tgz", 29 | "integrity": "sha1-mntxz7fTYaGU6lVSQckvdGjVvyg=", 30 | "dev": true 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/1/iwasm/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "scripts": { 3 | "asbuild:untouched": "asc assembly/index.ts --target debug", 4 | "asbuild:optimized": "asc assembly/index.ts --target release", 5 | "asbuild": "npm run asbuild:untouched && npm run asbuild:optimized", 6 | "test": "node tests" 7 | }, 8 | "dependencies": { 9 | "@assemblyscript/loader": "^0.18.7" 10 | }, 11 | "devDependencies": { 12 | "assemblyscript": "^0.18.7" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/1/iwasm/tests/index.js: -------------------------------------------------------------------------------- 1 | const assert = require("assert"); 2 | const myModule = require(".."); 3 | assert.equal(myModule.minusOne(2), 1); 4 | console.log("ok"); 5 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/2/iwasm/asconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "targets": { 3 | "debug": { 4 | "binaryFile": "build/untouched.wasm", 5 | "textFile": "build/untouched.wat", 6 | "sourceMap": true, 7 | "debug": true 8 | }, 9 | "release": { 10 | "binaryFile": "build/optimized.wasm", 11 | "textFile": "build/optimized.wat", 12 | "sourceMap": true, 13 | "optimizeLevel": 3, 14 | "shrinkLevel": 1, 15 | "converge": false, 16 | "noAssert": false 17 | } 18 | }, 19 | "options": {} 20 | } -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/2/iwasm/assembly/index.ts: -------------------------------------------------------------------------------- 1 | export function minusOne(n: i32): i32 { 2 | return n - 1; 3 | } 4 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/2/iwasm/assembly/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "assemblyscript/std/assembly.json", 3 | "include": [ 4 | "./**/*.ts" 5 | ] 6 | } -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/2/iwasm/build/.gitignore: -------------------------------------------------------------------------------- 1 | *.wasm 2 | *.wasm.map 3 | *.asm.js 4 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/2/iwasm/build/optimized.wat: -------------------------------------------------------------------------------- 1 | (module 2 | (type $i32_=>_i32 (func (param i32) (result i32))) 3 | (memory $0 0) 4 | (export "minusOne" (func $assembly/index/minusOne)) 5 | (export "memory" (memory $0)) 6 | (func $assembly/index/minusOne (param $0 i32) (result i32) 7 | local.get $0 8 | i32.const 1 9 | i32.sub 10 | ) 11 | ) 12 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/2/iwasm/build/untouched.wat: -------------------------------------------------------------------------------- 1 | (module 2 | (type $i32_=>_i32 (func (param i32) (result i32))) 3 | (memory $0 0) 4 | (table $0 1 funcref) 5 | (global $~lib/memory/__data_end i32 (i32.const 8)) 6 | (global $~lib/memory/__stack_pointer (mut i32) (i32.const 16392)) 7 | (global $~lib/memory/__heap_base i32 (i32.const 16392)) 8 | (export "minusOne" (func $assembly/index/minusOne)) 9 | (export "memory" (memory $0)) 10 | (func $assembly/index/minusOne (param $0 i32) (result i32) 11 | local.get $0 12 | i32.const 1 13 | i32.sub 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/2/iwasm/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/2/iwasm/index.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const loader = require("@assemblyscript/loader"); 3 | const imports = { /* imports go here */ }; 4 | const wasmModule = loader.instantiateSync(fs.readFileSync(__dirname + "/build/optimized.wasm"), imports); 5 | module.exports = wasmModule.exports; 6 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/2/iwasm/js/loader.js: -------------------------------------------------------------------------------- 1 | class WasmLoader { 2 | constructor() { 3 | } 4 | 5 | async wasm(path) { 6 | console.log(`fetching ${path}`); 7 | 8 | if (!WebAssembly.instantiateStreaming) { 9 | return this.wasmFallback(path); 10 | } 11 | 12 | const { instance } = await WebAssembly.instantiateStreaming(fetch(path)); 13 | 14 | return instance?.exports; 15 | } 16 | 17 | async wasmFallback(path) { 18 | console.log('using fallback'); 19 | const response = await fetch(path); 20 | const bytes = await response?.arrayBuffer(); 21 | const { instance } = await WebAssembly.instantiate(bytes); 22 | 23 | return instance?.exports; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/2/iwasm/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "requires": true, 3 | "lockfileVersion": 1, 4 | "dependencies": { 5 | "@assemblyscript/loader": { 6 | "version": "0.18.7", 7 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/@assemblyscript/loader/-/loader-0.18.7.tgz", 8 | "integrity": "sha1-o7r6YudH3cjXdUnFKIzXbql2xqA=" 9 | }, 10 | "accepts": { 11 | "version": "1.3.7", 12 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/accepts/-/accepts-1.3.7.tgz", 13 | "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", 14 | "requires": { 15 | "mime-types": "~2.1.24", 16 | "negotiator": "0.6.2" 17 | } 18 | }, 19 | "array-flatten": { 20 | "version": "1.1.1", 21 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/array-flatten/-/array-flatten-1.1.1.tgz", 22 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 23 | }, 24 | "assemblyscript": { 25 | "version": "0.18.7", 26 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/assemblyscript/-/assemblyscript-0.18.7.tgz", 27 | "integrity": "sha1-tV9EKf82J88xL0c1Uht9xSQ5nMU=", 28 | "dev": true, 29 | "requires": { 30 | "binaryen": "98.0.0-nightly.20210106", 31 | "long": "^4.0.0" 32 | } 33 | }, 34 | "binaryen": { 35 | "version": "98.0.0-nightly.20210106", 36 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/binaryen/-/binaryen-98.0.0-nightly.20210106.tgz", 37 | "integrity": "sha1-x7xjfiIjqDvzyunZiWn1ae+rQGI=", 38 | "dev": true 39 | }, 40 | "body-parser": { 41 | "version": "1.19.0", 42 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/body-parser/-/body-parser-1.19.0.tgz", 43 | "integrity": "sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io=", 44 | "requires": { 45 | "bytes": "3.1.0", 46 | "content-type": "~1.0.4", 47 | "debug": "2.6.9", 48 | "depd": "~1.1.2", 49 | "http-errors": "1.7.2", 50 | "iconv-lite": "0.4.24", 51 | "on-finished": "~2.3.0", 52 | "qs": "6.7.0", 53 | "raw-body": "2.4.0", 54 | "type-is": "~1.6.17" 55 | } 56 | }, 57 | "bytes": { 58 | "version": "3.1.0", 59 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/bytes/-/bytes-3.1.0.tgz", 60 | "integrity": "sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY=" 61 | }, 62 | "content-disposition": { 63 | "version": "0.5.3", 64 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/content-disposition/-/content-disposition-0.5.3.tgz", 65 | "integrity": "sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70=", 66 | "requires": { 67 | "safe-buffer": "5.1.2" 68 | } 69 | }, 70 | "content-type": { 71 | "version": "1.0.4", 72 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/content-type/-/content-type-1.0.4.tgz", 73 | "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=" 74 | }, 75 | "cookie": { 76 | "version": "0.4.0", 77 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/cookie/-/cookie-0.4.0.tgz", 78 | "integrity": "sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo=" 79 | }, 80 | "cookie-signature": { 81 | "version": "1.0.6", 82 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/cookie-signature/-/cookie-signature-1.0.6.tgz", 83 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 84 | }, 85 | "debug": { 86 | "version": "2.6.9", 87 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/debug/-/debug-2.6.9.tgz", 88 | "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", 89 | "requires": { 90 | "ms": "2.0.0" 91 | } 92 | }, 93 | "depd": { 94 | "version": "1.1.2", 95 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/depd/-/depd-1.1.2.tgz", 96 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 97 | }, 98 | "destroy": { 99 | "version": "1.0.4", 100 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/destroy/-/destroy-1.0.4.tgz", 101 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 102 | }, 103 | "ee-first": { 104 | "version": "1.1.1", 105 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/ee-first/-/ee-first-1.1.1.tgz", 106 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 107 | }, 108 | "encodeurl": { 109 | "version": "1.0.2", 110 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/encodeurl/-/encodeurl-1.0.2.tgz", 111 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 112 | }, 113 | "escape-html": { 114 | "version": "1.0.3", 115 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/escape-html/-/escape-html-1.0.3.tgz", 116 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 117 | }, 118 | "etag": { 119 | "version": "1.8.1", 120 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/etag/-/etag-1.8.1.tgz", 121 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 122 | }, 123 | "express": { 124 | "version": "4.17.1", 125 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/express/-/express-4.17.1.tgz", 126 | "integrity": "sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ=", 127 | "requires": { 128 | "accepts": "~1.3.7", 129 | "array-flatten": "1.1.1", 130 | "body-parser": "1.19.0", 131 | "content-disposition": "0.5.3", 132 | "content-type": "~1.0.4", 133 | "cookie": "0.4.0", 134 | "cookie-signature": "1.0.6", 135 | "debug": "2.6.9", 136 | "depd": "~1.1.2", 137 | "encodeurl": "~1.0.2", 138 | "escape-html": "~1.0.3", 139 | "etag": "~1.8.1", 140 | "finalhandler": "~1.1.2", 141 | "fresh": "0.5.2", 142 | "merge-descriptors": "1.0.1", 143 | "methods": "~1.1.2", 144 | "on-finished": "~2.3.0", 145 | "parseurl": "~1.3.3", 146 | "path-to-regexp": "0.1.7", 147 | "proxy-addr": "~2.0.5", 148 | "qs": "6.7.0", 149 | "range-parser": "~1.2.1", 150 | "safe-buffer": "5.1.2", 151 | "send": "0.17.1", 152 | "serve-static": "1.14.1", 153 | "setprototypeof": "1.1.1", 154 | "statuses": "~1.5.0", 155 | "type-is": "~1.6.18", 156 | "utils-merge": "1.0.1", 157 | "vary": "~1.1.2" 158 | } 159 | }, 160 | "finalhandler": { 161 | "version": "1.1.2", 162 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/finalhandler/-/finalhandler-1.1.2.tgz", 163 | "integrity": "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=", 164 | "requires": { 165 | "debug": "2.6.9", 166 | "encodeurl": "~1.0.2", 167 | "escape-html": "~1.0.3", 168 | "on-finished": "~2.3.0", 169 | "parseurl": "~1.3.3", 170 | "statuses": "~1.5.0", 171 | "unpipe": "~1.0.0" 172 | } 173 | }, 174 | "forwarded": { 175 | "version": "0.1.2", 176 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/forwarded/-/forwarded-0.1.2.tgz", 177 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 178 | }, 179 | "fresh": { 180 | "version": "0.5.2", 181 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/fresh/-/fresh-0.5.2.tgz", 182 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 183 | }, 184 | "http-errors": { 185 | "version": "1.7.2", 186 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/http-errors/-/http-errors-1.7.2.tgz", 187 | "integrity": "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=", 188 | "requires": { 189 | "depd": "~1.1.2", 190 | "inherits": "2.0.3", 191 | "setprototypeof": "1.1.1", 192 | "statuses": ">= 1.5.0 < 2", 193 | "toidentifier": "1.0.0" 194 | } 195 | }, 196 | "iconv-lite": { 197 | "version": "0.4.24", 198 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/iconv-lite/-/iconv-lite-0.4.24.tgz", 199 | "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", 200 | "requires": { 201 | "safer-buffer": ">= 2.1.2 < 3" 202 | } 203 | }, 204 | "inherits": { 205 | "version": "2.0.3", 206 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/inherits/-/inherits-2.0.3.tgz", 207 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 208 | }, 209 | "ipaddr.js": { 210 | "version": "1.9.1", 211 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 212 | "integrity": "sha1-v/OFQ+64mEglB5/zoqjmy9RngbM=" 213 | }, 214 | "long": { 215 | "version": "4.0.0", 216 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/long/-/long-4.0.0.tgz", 217 | "integrity": "sha1-mntxz7fTYaGU6lVSQckvdGjVvyg=", 218 | "dev": true 219 | }, 220 | "media-typer": { 221 | "version": "0.3.0", 222 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/media-typer/-/media-typer-0.3.0.tgz", 223 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 224 | }, 225 | "merge-descriptors": { 226 | "version": "1.0.1", 227 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 228 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 229 | }, 230 | "methods": { 231 | "version": "1.1.2", 232 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/methods/-/methods-1.1.2.tgz", 233 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 234 | }, 235 | "mime": { 236 | "version": "1.6.0", 237 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/mime/-/mime-1.6.0.tgz", 238 | "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=" 239 | }, 240 | "mime-db": { 241 | "version": "1.45.0", 242 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/mime-db/-/mime-db-1.45.0.tgz", 243 | "integrity": "sha1-zO7aIczXw6dF66LezVXUtz54eeo=" 244 | }, 245 | "mime-types": { 246 | "version": "2.1.28", 247 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/mime-types/-/mime-types-2.1.28.tgz", 248 | "integrity": "sha1-EWDEdX6rLFNjiI4AUnPs950qDs0=", 249 | "requires": { 250 | "mime-db": "1.45.0" 251 | } 252 | }, 253 | "ms": { 254 | "version": "2.0.0", 255 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/ms/-/ms-2.0.0.tgz", 256 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 257 | }, 258 | "negotiator": { 259 | "version": "0.6.2", 260 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/negotiator/-/negotiator-0.6.2.tgz", 261 | "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=" 262 | }, 263 | "on-finished": { 264 | "version": "2.3.0", 265 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/on-finished/-/on-finished-2.3.0.tgz", 266 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 267 | "requires": { 268 | "ee-first": "1.1.1" 269 | } 270 | }, 271 | "parseurl": { 272 | "version": "1.3.3", 273 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/parseurl/-/parseurl-1.3.3.tgz", 274 | "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=" 275 | }, 276 | "path-to-regexp": { 277 | "version": "0.1.7", 278 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 279 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 280 | }, 281 | "proxy-addr": { 282 | "version": "2.0.6", 283 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/proxy-addr/-/proxy-addr-2.0.6.tgz", 284 | "integrity": "sha1-/cIzZQVEfT8vLGOO0nLK9hS7sr8=", 285 | "requires": { 286 | "forwarded": "~0.1.2", 287 | "ipaddr.js": "1.9.1" 288 | } 289 | }, 290 | "qs": { 291 | "version": "6.7.0", 292 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/qs/-/qs-6.7.0.tgz", 293 | "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=" 294 | }, 295 | "range-parser": { 296 | "version": "1.2.1", 297 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/range-parser/-/range-parser-1.2.1.tgz", 298 | "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=" 299 | }, 300 | "raw-body": { 301 | "version": "2.4.0", 302 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/raw-body/-/raw-body-2.4.0.tgz", 303 | "integrity": "sha1-oc5vucm8NWylLoklarWQWeE9AzI=", 304 | "requires": { 305 | "bytes": "3.1.0", 306 | "http-errors": "1.7.2", 307 | "iconv-lite": "0.4.24", 308 | "unpipe": "1.0.0" 309 | } 310 | }, 311 | "safe-buffer": { 312 | "version": "5.1.2", 313 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/safe-buffer/-/safe-buffer-5.1.2.tgz", 314 | "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" 315 | }, 316 | "safer-buffer": { 317 | "version": "2.1.2", 318 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/safer-buffer/-/safer-buffer-2.1.2.tgz", 319 | "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=" 320 | }, 321 | "send": { 322 | "version": "0.17.1", 323 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/send/-/send-0.17.1.tgz", 324 | "integrity": "sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg=", 325 | "requires": { 326 | "debug": "2.6.9", 327 | "depd": "~1.1.2", 328 | "destroy": "~1.0.4", 329 | "encodeurl": "~1.0.2", 330 | "escape-html": "~1.0.3", 331 | "etag": "~1.8.1", 332 | "fresh": "0.5.2", 333 | "http-errors": "~1.7.2", 334 | "mime": "1.6.0", 335 | "ms": "2.1.1", 336 | "on-finished": "~2.3.0", 337 | "range-parser": "~1.2.1", 338 | "statuses": "~1.5.0" 339 | }, 340 | "dependencies": { 341 | "ms": { 342 | "version": "2.1.1", 343 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/ms/-/ms-2.1.1.tgz", 344 | "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=" 345 | } 346 | } 347 | }, 348 | "serve-static": { 349 | "version": "1.14.1", 350 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/serve-static/-/serve-static-1.14.1.tgz", 351 | "integrity": "sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=", 352 | "requires": { 353 | "encodeurl": "~1.0.2", 354 | "escape-html": "~1.0.3", 355 | "parseurl": "~1.3.3", 356 | "send": "0.17.1" 357 | } 358 | }, 359 | "setprototypeof": { 360 | "version": "1.1.1", 361 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/setprototypeof/-/setprototypeof-1.1.1.tgz", 362 | "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=" 363 | }, 364 | "statuses": { 365 | "version": "1.5.0", 366 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/statuses/-/statuses-1.5.0.tgz", 367 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 368 | }, 369 | "toidentifier": { 370 | "version": "1.0.0", 371 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/toidentifier/-/toidentifier-1.0.0.tgz", 372 | "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=" 373 | }, 374 | "type-is": { 375 | "version": "1.6.18", 376 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/type-is/-/type-is-1.6.18.tgz", 377 | "integrity": "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=", 378 | "requires": { 379 | "media-typer": "0.3.0", 380 | "mime-types": "~2.1.24" 381 | } 382 | }, 383 | "unpipe": { 384 | "version": "1.0.0", 385 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/unpipe/-/unpipe-1.0.0.tgz", 386 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 387 | }, 388 | "utils-merge": { 389 | "version": "1.0.1", 390 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/utils-merge/-/utils-merge-1.0.1.tgz", 391 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 392 | }, 393 | "vary": { 394 | "version": "1.1.2", 395 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/vary/-/vary-1.1.2.tgz", 396 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 397 | } 398 | } 399 | } 400 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/2/iwasm/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "scripts": { 3 | "asbuild:untouched": "asc assembly/index.ts --target debug", 4 | "asbuild:optimized": "asc assembly/index.ts --target release", 5 | "asbuild": "npm run asbuild:untouched && npm run asbuild:optimized", 6 | "test": "node tests", 7 | "server": "node server.js" 8 | }, 9 | "dependencies": { 10 | "@assemblyscript/loader": "^0.18.7", 11 | "express": "^4.17.1" 12 | }, 13 | "devDependencies": { 14 | "assemblyscript": "^0.18.7" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/2/iwasm/server.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const app = express(); 3 | 4 | app.use(express.static('./')) 5 | 6 | app.listen(3000, () => console.log('Server up on port 3000!')); 7 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/2/iwasm/tests/index.js: -------------------------------------------------------------------------------- 1 | const assert = require("assert"); 2 | const myModule = require(".."); 3 | assert.equal(myModule.minusOne(2), 1); 4 | console.log("ok"); 5 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/3/iwasm/asconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "targets": { 3 | "debug": { 4 | "binaryFile": "build/untouched.wasm", 5 | "textFile": "build/untouched.wat", 6 | "sourceMap": true, 7 | "debug": true 8 | }, 9 | "release": { 10 | "binaryFile": "build/optimized.wasm", 11 | "textFile": "build/optimized.wat", 12 | "sourceMap": true, 13 | "optimizeLevel": 3, 14 | "shrinkLevel": 1, 15 | "converge": false, 16 | "noAssert": false 17 | } 18 | }, 19 | "options": {} 20 | } -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/3/iwasm/assembly/index.ts: -------------------------------------------------------------------------------- 1 | export function minusOne(n: i32): i32 { 2 | return n - 1; 3 | } 4 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/3/iwasm/assembly/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "assemblyscript/std/assembly.json", 3 | "include": [ 4 | "./**/*.ts" 5 | ] 6 | } -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/3/iwasm/build/.gitignore: -------------------------------------------------------------------------------- 1 | *.wasm 2 | *.wasm.map 3 | *.asm.js 4 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/3/iwasm/build/optimized.wat: -------------------------------------------------------------------------------- 1 | (module 2 | (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) 3 | (type $i32_=>_i32 (func (param i32) (result i32))) 4 | (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) 5 | (memory $0 0) 6 | (export "minusOne" (func $assembly/index/minusOne)) 7 | (export "memory" (memory $0)) 8 | (func $assembly/index/minusOne (param $0 i32) (result i32) 9 | local.get $0 10 | i32.const 44 11 | i32.eq 12 | if 13 | i32.const 0 14 | i32.const 0 15 | i32.const 0 16 | i32.const 0 17 | call $~lib/builtins/abort 18 | end 19 | local.get $0 20 | i32.const 1 21 | i32.sub 22 | ) 23 | ) 24 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/3/iwasm/build/untouched.wat: -------------------------------------------------------------------------------- 1 | (module 2 | (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) 3 | (type $i32_=>_i32 (func (param i32) (result i32))) 4 | (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) 5 | (memory $0 0) 6 | (table $0 1 funcref) 7 | (global $~lib/memory/__data_end i32 (i32.const 8)) 8 | (global $~lib/memory/__stack_pointer (mut i32) (i32.const 16392)) 9 | (global $~lib/memory/__heap_base i32 (i32.const 16392)) 10 | (export "minusOne" (func $assembly/index/minusOne)) 11 | (export "memory" (memory $0)) 12 | (func $assembly/index/minusOne (param $0 i32) (result i32) 13 | local.get $0 14 | i32.const 44 15 | i32.eq 16 | if 17 | i32.const 0 18 | i32.const 0 19 | i32.const 0 20 | i32.const 0 21 | call $~lib/builtins/abort 22 | end 23 | local.get $0 24 | i32.const 1 25 | i32.sub 26 | ) 27 | ) 28 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/3/iwasm/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/3/iwasm/index.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const loader = require("@assemblyscript/loader"); 3 | const imports = { /* imports go here */ }; 4 | const wasmModule = loader.instantiateSync(fs.readFileSync(__dirname + "/build/optimized.wasm"), imports); 5 | module.exports = wasmModule.exports; 6 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/3/iwasm/js/loader.js: -------------------------------------------------------------------------------- 1 | class WasmLoader { 2 | constructor() { 3 | this._imports = { 4 | env: { 5 | abort() { 6 | throw new Error('Abort called from wasm file'); 7 | } 8 | } 9 | }; 10 | } 11 | 12 | async wasm(path, imports = this._imports) { 13 | console.log(`fetching ${path}`); 14 | 15 | if (!WebAssembly.instantiateStreaming) { 16 | return this.wasmFallback(path, imports); 17 | } 18 | 19 | const { instance } = await WebAssembly.instantiateStreaming(fetch(path), imports); 20 | 21 | return instance?.exports; 22 | } 23 | 24 | async wasmFallback(path, imports) { 25 | console.log('using fallback'); 26 | const response = await fetch(path); 27 | const bytes = await response?.arrayBuffer(); 28 | const { instance } = await WebAssembly.instantiate(bytes, imports); 29 | 30 | return instance?.exports; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/3/iwasm/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "requires": true, 3 | "lockfileVersion": 1, 4 | "dependencies": { 5 | "@assemblyscript/loader": { 6 | "version": "0.18.7", 7 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/@assemblyscript/loader/-/loader-0.18.7.tgz", 8 | "integrity": "sha1-o7r6YudH3cjXdUnFKIzXbql2xqA=" 9 | }, 10 | "accepts": { 11 | "version": "1.3.7", 12 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/accepts/-/accepts-1.3.7.tgz", 13 | "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", 14 | "requires": { 15 | "mime-types": "~2.1.24", 16 | "negotiator": "0.6.2" 17 | } 18 | }, 19 | "array-flatten": { 20 | "version": "1.1.1", 21 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/array-flatten/-/array-flatten-1.1.1.tgz", 22 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 23 | }, 24 | "assemblyscript": { 25 | "version": "0.18.7", 26 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/assemblyscript/-/assemblyscript-0.18.7.tgz", 27 | "integrity": "sha1-tV9EKf82J88xL0c1Uht9xSQ5nMU=", 28 | "dev": true, 29 | "requires": { 30 | "binaryen": "98.0.0-nightly.20210106", 31 | "long": "^4.0.0" 32 | } 33 | }, 34 | "binaryen": { 35 | "version": "98.0.0-nightly.20210106", 36 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/binaryen/-/binaryen-98.0.0-nightly.20210106.tgz", 37 | "integrity": "sha1-x7xjfiIjqDvzyunZiWn1ae+rQGI=", 38 | "dev": true 39 | }, 40 | "body-parser": { 41 | "version": "1.19.0", 42 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/body-parser/-/body-parser-1.19.0.tgz", 43 | "integrity": "sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io=", 44 | "requires": { 45 | "bytes": "3.1.0", 46 | "content-type": "~1.0.4", 47 | "debug": "2.6.9", 48 | "depd": "~1.1.2", 49 | "http-errors": "1.7.2", 50 | "iconv-lite": "0.4.24", 51 | "on-finished": "~2.3.0", 52 | "qs": "6.7.0", 53 | "raw-body": "2.4.0", 54 | "type-is": "~1.6.17" 55 | } 56 | }, 57 | "bytes": { 58 | "version": "3.1.0", 59 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/bytes/-/bytes-3.1.0.tgz", 60 | "integrity": "sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY=" 61 | }, 62 | "content-disposition": { 63 | "version": "0.5.3", 64 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/content-disposition/-/content-disposition-0.5.3.tgz", 65 | "integrity": "sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70=", 66 | "requires": { 67 | "safe-buffer": "5.1.2" 68 | } 69 | }, 70 | "content-type": { 71 | "version": "1.0.4", 72 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/content-type/-/content-type-1.0.4.tgz", 73 | "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=" 74 | }, 75 | "cookie": { 76 | "version": "0.4.0", 77 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/cookie/-/cookie-0.4.0.tgz", 78 | "integrity": "sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo=" 79 | }, 80 | "cookie-signature": { 81 | "version": "1.0.6", 82 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/cookie-signature/-/cookie-signature-1.0.6.tgz", 83 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 84 | }, 85 | "debug": { 86 | "version": "2.6.9", 87 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/debug/-/debug-2.6.9.tgz", 88 | "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", 89 | "requires": { 90 | "ms": "2.0.0" 91 | } 92 | }, 93 | "depd": { 94 | "version": "1.1.2", 95 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/depd/-/depd-1.1.2.tgz", 96 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 97 | }, 98 | "destroy": { 99 | "version": "1.0.4", 100 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/destroy/-/destroy-1.0.4.tgz", 101 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 102 | }, 103 | "ee-first": { 104 | "version": "1.1.1", 105 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/ee-first/-/ee-first-1.1.1.tgz", 106 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 107 | }, 108 | "encodeurl": { 109 | "version": "1.0.2", 110 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/encodeurl/-/encodeurl-1.0.2.tgz", 111 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 112 | }, 113 | "escape-html": { 114 | "version": "1.0.3", 115 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/escape-html/-/escape-html-1.0.3.tgz", 116 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 117 | }, 118 | "etag": { 119 | "version": "1.8.1", 120 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/etag/-/etag-1.8.1.tgz", 121 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 122 | }, 123 | "express": { 124 | "version": "4.17.1", 125 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/express/-/express-4.17.1.tgz", 126 | "integrity": "sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ=", 127 | "requires": { 128 | "accepts": "~1.3.7", 129 | "array-flatten": "1.1.1", 130 | "body-parser": "1.19.0", 131 | "content-disposition": "0.5.3", 132 | "content-type": "~1.0.4", 133 | "cookie": "0.4.0", 134 | "cookie-signature": "1.0.6", 135 | "debug": "2.6.9", 136 | "depd": "~1.1.2", 137 | "encodeurl": "~1.0.2", 138 | "escape-html": "~1.0.3", 139 | "etag": "~1.8.1", 140 | "finalhandler": "~1.1.2", 141 | "fresh": "0.5.2", 142 | "merge-descriptors": "1.0.1", 143 | "methods": "~1.1.2", 144 | "on-finished": "~2.3.0", 145 | "parseurl": "~1.3.3", 146 | "path-to-regexp": "0.1.7", 147 | "proxy-addr": "~2.0.5", 148 | "qs": "6.7.0", 149 | "range-parser": "~1.2.1", 150 | "safe-buffer": "5.1.2", 151 | "send": "0.17.1", 152 | "serve-static": "1.14.1", 153 | "setprototypeof": "1.1.1", 154 | "statuses": "~1.5.0", 155 | "type-is": "~1.6.18", 156 | "utils-merge": "1.0.1", 157 | "vary": "~1.1.2" 158 | } 159 | }, 160 | "finalhandler": { 161 | "version": "1.1.2", 162 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/finalhandler/-/finalhandler-1.1.2.tgz", 163 | "integrity": "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=", 164 | "requires": { 165 | "debug": "2.6.9", 166 | "encodeurl": "~1.0.2", 167 | "escape-html": "~1.0.3", 168 | "on-finished": "~2.3.0", 169 | "parseurl": "~1.3.3", 170 | "statuses": "~1.5.0", 171 | "unpipe": "~1.0.0" 172 | } 173 | }, 174 | "forwarded": { 175 | "version": "0.1.2", 176 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/forwarded/-/forwarded-0.1.2.tgz", 177 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 178 | }, 179 | "fresh": { 180 | "version": "0.5.2", 181 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/fresh/-/fresh-0.5.2.tgz", 182 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 183 | }, 184 | "http-errors": { 185 | "version": "1.7.2", 186 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/http-errors/-/http-errors-1.7.2.tgz", 187 | "integrity": "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=", 188 | "requires": { 189 | "depd": "~1.1.2", 190 | "inherits": "2.0.3", 191 | "setprototypeof": "1.1.1", 192 | "statuses": ">= 1.5.0 < 2", 193 | "toidentifier": "1.0.0" 194 | } 195 | }, 196 | "iconv-lite": { 197 | "version": "0.4.24", 198 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/iconv-lite/-/iconv-lite-0.4.24.tgz", 199 | "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", 200 | "requires": { 201 | "safer-buffer": ">= 2.1.2 < 3" 202 | } 203 | }, 204 | "inherits": { 205 | "version": "2.0.3", 206 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/inherits/-/inherits-2.0.3.tgz", 207 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 208 | }, 209 | "ipaddr.js": { 210 | "version": "1.9.1", 211 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 212 | "integrity": "sha1-v/OFQ+64mEglB5/zoqjmy9RngbM=" 213 | }, 214 | "long": { 215 | "version": "4.0.0", 216 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/long/-/long-4.0.0.tgz", 217 | "integrity": "sha1-mntxz7fTYaGU6lVSQckvdGjVvyg=", 218 | "dev": true 219 | }, 220 | "media-typer": { 221 | "version": "0.3.0", 222 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/media-typer/-/media-typer-0.3.0.tgz", 223 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 224 | }, 225 | "merge-descriptors": { 226 | "version": "1.0.1", 227 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 228 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 229 | }, 230 | "methods": { 231 | "version": "1.1.2", 232 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/methods/-/methods-1.1.2.tgz", 233 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 234 | }, 235 | "mime": { 236 | "version": "1.6.0", 237 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/mime/-/mime-1.6.0.tgz", 238 | "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=" 239 | }, 240 | "mime-db": { 241 | "version": "1.45.0", 242 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/mime-db/-/mime-db-1.45.0.tgz", 243 | "integrity": "sha1-zO7aIczXw6dF66LezVXUtz54eeo=" 244 | }, 245 | "mime-types": { 246 | "version": "2.1.28", 247 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/mime-types/-/mime-types-2.1.28.tgz", 248 | "integrity": "sha1-EWDEdX6rLFNjiI4AUnPs950qDs0=", 249 | "requires": { 250 | "mime-db": "1.45.0" 251 | } 252 | }, 253 | "ms": { 254 | "version": "2.0.0", 255 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/ms/-/ms-2.0.0.tgz", 256 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 257 | }, 258 | "negotiator": { 259 | "version": "0.6.2", 260 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/negotiator/-/negotiator-0.6.2.tgz", 261 | "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=" 262 | }, 263 | "on-finished": { 264 | "version": "2.3.0", 265 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/on-finished/-/on-finished-2.3.0.tgz", 266 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 267 | "requires": { 268 | "ee-first": "1.1.1" 269 | } 270 | }, 271 | "parseurl": { 272 | "version": "1.3.3", 273 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/parseurl/-/parseurl-1.3.3.tgz", 274 | "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=" 275 | }, 276 | "path-to-regexp": { 277 | "version": "0.1.7", 278 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 279 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 280 | }, 281 | "proxy-addr": { 282 | "version": "2.0.6", 283 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/proxy-addr/-/proxy-addr-2.0.6.tgz", 284 | "integrity": "sha1-/cIzZQVEfT8vLGOO0nLK9hS7sr8=", 285 | "requires": { 286 | "forwarded": "~0.1.2", 287 | "ipaddr.js": "1.9.1" 288 | } 289 | }, 290 | "qs": { 291 | "version": "6.7.0", 292 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/qs/-/qs-6.7.0.tgz", 293 | "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=" 294 | }, 295 | "range-parser": { 296 | "version": "1.2.1", 297 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/range-parser/-/range-parser-1.2.1.tgz", 298 | "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=" 299 | }, 300 | "raw-body": { 301 | "version": "2.4.0", 302 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/raw-body/-/raw-body-2.4.0.tgz", 303 | "integrity": "sha1-oc5vucm8NWylLoklarWQWeE9AzI=", 304 | "requires": { 305 | "bytes": "3.1.0", 306 | "http-errors": "1.7.2", 307 | "iconv-lite": "0.4.24", 308 | "unpipe": "1.0.0" 309 | } 310 | }, 311 | "safe-buffer": { 312 | "version": "5.1.2", 313 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/safe-buffer/-/safe-buffer-5.1.2.tgz", 314 | "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" 315 | }, 316 | "safer-buffer": { 317 | "version": "2.1.2", 318 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/safer-buffer/-/safer-buffer-2.1.2.tgz", 319 | "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=" 320 | }, 321 | "send": { 322 | "version": "0.17.1", 323 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/send/-/send-0.17.1.tgz", 324 | "integrity": "sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg=", 325 | "requires": { 326 | "debug": "2.6.9", 327 | "depd": "~1.1.2", 328 | "destroy": "~1.0.4", 329 | "encodeurl": "~1.0.2", 330 | "escape-html": "~1.0.3", 331 | "etag": "~1.8.1", 332 | "fresh": "0.5.2", 333 | "http-errors": "~1.7.2", 334 | "mime": "1.6.0", 335 | "ms": "2.1.1", 336 | "on-finished": "~2.3.0", 337 | "range-parser": "~1.2.1", 338 | "statuses": "~1.5.0" 339 | }, 340 | "dependencies": { 341 | "ms": { 342 | "version": "2.1.1", 343 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/ms/-/ms-2.1.1.tgz", 344 | "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=" 345 | } 346 | } 347 | }, 348 | "serve-static": { 349 | "version": "1.14.1", 350 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/serve-static/-/serve-static-1.14.1.tgz", 351 | "integrity": "sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=", 352 | "requires": { 353 | "encodeurl": "~1.0.2", 354 | "escape-html": "~1.0.3", 355 | "parseurl": "~1.3.3", 356 | "send": "0.17.1" 357 | } 358 | }, 359 | "setprototypeof": { 360 | "version": "1.1.1", 361 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/setprototypeof/-/setprototypeof-1.1.1.tgz", 362 | "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=" 363 | }, 364 | "statuses": { 365 | "version": "1.5.0", 366 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/statuses/-/statuses-1.5.0.tgz", 367 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 368 | }, 369 | "toidentifier": { 370 | "version": "1.0.0", 371 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/toidentifier/-/toidentifier-1.0.0.tgz", 372 | "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=" 373 | }, 374 | "type-is": { 375 | "version": "1.6.18", 376 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/type-is/-/type-is-1.6.18.tgz", 377 | "integrity": "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=", 378 | "requires": { 379 | "media-typer": "0.3.0", 380 | "mime-types": "~2.1.24" 381 | } 382 | }, 383 | "unpipe": { 384 | "version": "1.0.0", 385 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/unpipe/-/unpipe-1.0.0.tgz", 386 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 387 | }, 388 | "utils-merge": { 389 | "version": "1.0.1", 390 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/utils-merge/-/utils-merge-1.0.1.tgz", 391 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 392 | }, 393 | "vary": { 394 | "version": "1.1.2", 395 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/vary/-/vary-1.1.2.tgz", 396 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 397 | } 398 | } 399 | } 400 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/3/iwasm/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "scripts": { 3 | "asbuild:untouched": "asc assembly/index.ts --target debug", 4 | "asbuild:optimized": "asc assembly/index.ts --target release", 5 | "asbuild": "npm run asbuild:untouched && npm run asbuild:optimized", 6 | "test": "node tests", 7 | "server": "node server.js" 8 | }, 9 | "dependencies": { 10 | "@assemblyscript/loader": "^0.18.7", 11 | "express": "^4.17.1" 12 | }, 13 | "devDependencies": { 14 | "assemblyscript": "^0.18.7" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/3/iwasm/server.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const app = express(); 3 | 4 | app.use(express.static('./')) 5 | 6 | app.listen(3000, () => console.log('Server up on port 3000!')); 7 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/3/iwasm/tests/index.js: -------------------------------------------------------------------------------- 1 | const assert = require("assert"); 2 | const myModule = require(".."); 3 | assert.equal(myModule.minusOne(2), 1); 4 | console.log("ok"); 5 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/4/iwasm/asconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "targets": { 3 | "debug": { 4 | "binaryFile": "build/untouched.wasm", 5 | "textFile": "build/untouched.wat", 6 | "sourceMap": true, 7 | "debug": true 8 | }, 9 | "release": { 10 | "binaryFile": "build/optimized.wasm", 11 | "textFile": "build/optimized.wat", 12 | "sourceMap": true, 13 | "optimizeLevel": 3, 14 | "shrinkLevel": 1, 15 | "converge": false, 16 | "noAssert": false 17 | } 18 | }, 19 | "options": {} 20 | } -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/4/iwasm/assembly/index.ts: -------------------------------------------------------------------------------- 1 | declare function log(n: i32): void 2 | 3 | export function minusOne(n: i32): i32 { 4 | log(n); 5 | return n - 1; 6 | } 7 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/4/iwasm/assembly/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "assemblyscript/std/assembly.json", 3 | "include": [ 4 | "./**/*.ts" 5 | ] 6 | } -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/4/iwasm/build/.gitignore: -------------------------------------------------------------------------------- 1 | *.wasm 2 | *.wasm.map 3 | *.asm.js 4 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/4/iwasm/build/optimized.wat: -------------------------------------------------------------------------------- 1 | (module 2 | (type $i32_=>_none (func (param i32))) 3 | (type $i32_=>_i32 (func (param i32) (result i32))) 4 | (import "index" "log" (func $assembly/index/log (param i32))) 5 | (memory $0 0) 6 | (export "minusOne" (func $assembly/index/minusOne)) 7 | (export "memory" (memory $0)) 8 | (func $assembly/index/minusOne (param $0 i32) (result i32) 9 | local.get $0 10 | call $assembly/index/log 11 | local.get $0 12 | i32.const 1 13 | i32.sub 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/4/iwasm/build/untouched.wat: -------------------------------------------------------------------------------- 1 | (module 2 | (type $i32_=>_none (func (param i32))) 3 | (type $i32_=>_i32 (func (param i32) (result i32))) 4 | (import "index" "log" (func $assembly/index/log (param i32))) 5 | (memory $0 0) 6 | (table $0 1 funcref) 7 | (global $~lib/memory/__data_end i32 (i32.const 8)) 8 | (global $~lib/memory/__stack_pointer (mut i32) (i32.const 16392)) 9 | (global $~lib/memory/__heap_base i32 (i32.const 16392)) 10 | (export "minusOne" (func $assembly/index/minusOne)) 11 | (export "memory" (memory $0)) 12 | (func $assembly/index/minusOne (param $0 i32) (result i32) 13 | local.get $0 14 | call $assembly/index/log 15 | local.get $0 16 | i32.const 1 17 | i32.sub 18 | ) 19 | ) 20 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/4/iwasm/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/4/iwasm/index.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const loader = require("@assemblyscript/loader"); 3 | const imports = { /* imports go here */ }; 4 | const wasmModule = loader.instantiateSync(fs.readFileSync(__dirname + "/build/optimized.wasm"), imports); 5 | module.exports = wasmModule.exports; 6 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/4/iwasm/js/loader.js: -------------------------------------------------------------------------------- 1 | class WasmLoader { 2 | constructor() { 3 | this._imports = { 4 | env: { 5 | abort() { 6 | throw new Error('Abort called from wasm file'); 7 | } 8 | }, 9 | index: { 10 | log(n) { 11 | console.log(n); 12 | } 13 | } 14 | }; 15 | } 16 | 17 | async wasm(path, imports = this._imports) { 18 | console.log(`fetching ${path}`); 19 | 20 | if (!WebAssembly.instantiateStreaming) { 21 | return this.wasmFallback(path, imports); 22 | } 23 | 24 | const { instance } = await WebAssembly.instantiateStreaming(fetch(path), imports); 25 | 26 | return instance?.exports; 27 | } 28 | 29 | async wasmFallback(path, imports) { 30 | console.log('using fallback'); 31 | const response = await fetch(path); 32 | const bytes = await response?.arrayBuffer(); 33 | const { instance } = await WebAssembly.instantiate(bytes, imports); 34 | 35 | return instance?.exports; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/4/iwasm/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "requires": true, 3 | "lockfileVersion": 1, 4 | "dependencies": { 5 | "@assemblyscript/loader": { 6 | "version": "0.18.7", 7 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/@assemblyscript/loader/-/loader-0.18.7.tgz", 8 | "integrity": "sha1-o7r6YudH3cjXdUnFKIzXbql2xqA=" 9 | }, 10 | "accepts": { 11 | "version": "1.3.7", 12 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/accepts/-/accepts-1.3.7.tgz", 13 | "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", 14 | "requires": { 15 | "mime-types": "~2.1.24", 16 | "negotiator": "0.6.2" 17 | } 18 | }, 19 | "array-flatten": { 20 | "version": "1.1.1", 21 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/array-flatten/-/array-flatten-1.1.1.tgz", 22 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 23 | }, 24 | "assemblyscript": { 25 | "version": "0.18.7", 26 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/assemblyscript/-/assemblyscript-0.18.7.tgz", 27 | "integrity": "sha1-tV9EKf82J88xL0c1Uht9xSQ5nMU=", 28 | "dev": true, 29 | "requires": { 30 | "binaryen": "98.0.0-nightly.20210106", 31 | "long": "^4.0.0" 32 | } 33 | }, 34 | "binaryen": { 35 | "version": "98.0.0-nightly.20210106", 36 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/binaryen/-/binaryen-98.0.0-nightly.20210106.tgz", 37 | "integrity": "sha1-x7xjfiIjqDvzyunZiWn1ae+rQGI=", 38 | "dev": true 39 | }, 40 | "body-parser": { 41 | "version": "1.19.0", 42 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/body-parser/-/body-parser-1.19.0.tgz", 43 | "integrity": "sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io=", 44 | "requires": { 45 | "bytes": "3.1.0", 46 | "content-type": "~1.0.4", 47 | "debug": "2.6.9", 48 | "depd": "~1.1.2", 49 | "http-errors": "1.7.2", 50 | "iconv-lite": "0.4.24", 51 | "on-finished": "~2.3.0", 52 | "qs": "6.7.0", 53 | "raw-body": "2.4.0", 54 | "type-is": "~1.6.17" 55 | } 56 | }, 57 | "bytes": { 58 | "version": "3.1.0", 59 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/bytes/-/bytes-3.1.0.tgz", 60 | "integrity": "sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY=" 61 | }, 62 | "content-disposition": { 63 | "version": "0.5.3", 64 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/content-disposition/-/content-disposition-0.5.3.tgz", 65 | "integrity": "sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70=", 66 | "requires": { 67 | "safe-buffer": "5.1.2" 68 | } 69 | }, 70 | "content-type": { 71 | "version": "1.0.4", 72 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/content-type/-/content-type-1.0.4.tgz", 73 | "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=" 74 | }, 75 | "cookie": { 76 | "version": "0.4.0", 77 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/cookie/-/cookie-0.4.0.tgz", 78 | "integrity": "sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo=" 79 | }, 80 | "cookie-signature": { 81 | "version": "1.0.6", 82 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/cookie-signature/-/cookie-signature-1.0.6.tgz", 83 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 84 | }, 85 | "debug": { 86 | "version": "2.6.9", 87 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/debug/-/debug-2.6.9.tgz", 88 | "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", 89 | "requires": { 90 | "ms": "2.0.0" 91 | } 92 | }, 93 | "depd": { 94 | "version": "1.1.2", 95 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/depd/-/depd-1.1.2.tgz", 96 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 97 | }, 98 | "destroy": { 99 | "version": "1.0.4", 100 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/destroy/-/destroy-1.0.4.tgz", 101 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 102 | }, 103 | "ee-first": { 104 | "version": "1.1.1", 105 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/ee-first/-/ee-first-1.1.1.tgz", 106 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 107 | }, 108 | "encodeurl": { 109 | "version": "1.0.2", 110 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/encodeurl/-/encodeurl-1.0.2.tgz", 111 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 112 | }, 113 | "escape-html": { 114 | "version": "1.0.3", 115 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/escape-html/-/escape-html-1.0.3.tgz", 116 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 117 | }, 118 | "etag": { 119 | "version": "1.8.1", 120 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/etag/-/etag-1.8.1.tgz", 121 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 122 | }, 123 | "express": { 124 | "version": "4.17.1", 125 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/express/-/express-4.17.1.tgz", 126 | "integrity": "sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ=", 127 | "requires": { 128 | "accepts": "~1.3.7", 129 | "array-flatten": "1.1.1", 130 | "body-parser": "1.19.0", 131 | "content-disposition": "0.5.3", 132 | "content-type": "~1.0.4", 133 | "cookie": "0.4.0", 134 | "cookie-signature": "1.0.6", 135 | "debug": "2.6.9", 136 | "depd": "~1.1.2", 137 | "encodeurl": "~1.0.2", 138 | "escape-html": "~1.0.3", 139 | "etag": "~1.8.1", 140 | "finalhandler": "~1.1.2", 141 | "fresh": "0.5.2", 142 | "merge-descriptors": "1.0.1", 143 | "methods": "~1.1.2", 144 | "on-finished": "~2.3.0", 145 | "parseurl": "~1.3.3", 146 | "path-to-regexp": "0.1.7", 147 | "proxy-addr": "~2.0.5", 148 | "qs": "6.7.0", 149 | "range-parser": "~1.2.1", 150 | "safe-buffer": "5.1.2", 151 | "send": "0.17.1", 152 | "serve-static": "1.14.1", 153 | "setprototypeof": "1.1.1", 154 | "statuses": "~1.5.0", 155 | "type-is": "~1.6.18", 156 | "utils-merge": "1.0.1", 157 | "vary": "~1.1.2" 158 | } 159 | }, 160 | "finalhandler": { 161 | "version": "1.1.2", 162 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/finalhandler/-/finalhandler-1.1.2.tgz", 163 | "integrity": "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=", 164 | "requires": { 165 | "debug": "2.6.9", 166 | "encodeurl": "~1.0.2", 167 | "escape-html": "~1.0.3", 168 | "on-finished": "~2.3.0", 169 | "parseurl": "~1.3.3", 170 | "statuses": "~1.5.0", 171 | "unpipe": "~1.0.0" 172 | } 173 | }, 174 | "forwarded": { 175 | "version": "0.1.2", 176 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/forwarded/-/forwarded-0.1.2.tgz", 177 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 178 | }, 179 | "fresh": { 180 | "version": "0.5.2", 181 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/fresh/-/fresh-0.5.2.tgz", 182 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 183 | }, 184 | "http-errors": { 185 | "version": "1.7.2", 186 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/http-errors/-/http-errors-1.7.2.tgz", 187 | "integrity": "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=", 188 | "requires": { 189 | "depd": "~1.1.2", 190 | "inherits": "2.0.3", 191 | "setprototypeof": "1.1.1", 192 | "statuses": ">= 1.5.0 < 2", 193 | "toidentifier": "1.0.0" 194 | } 195 | }, 196 | "iconv-lite": { 197 | "version": "0.4.24", 198 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/iconv-lite/-/iconv-lite-0.4.24.tgz", 199 | "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", 200 | "requires": { 201 | "safer-buffer": ">= 2.1.2 < 3" 202 | } 203 | }, 204 | "inherits": { 205 | "version": "2.0.3", 206 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/inherits/-/inherits-2.0.3.tgz", 207 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 208 | }, 209 | "ipaddr.js": { 210 | "version": "1.9.1", 211 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 212 | "integrity": "sha1-v/OFQ+64mEglB5/zoqjmy9RngbM=" 213 | }, 214 | "long": { 215 | "version": "4.0.0", 216 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/long/-/long-4.0.0.tgz", 217 | "integrity": "sha1-mntxz7fTYaGU6lVSQckvdGjVvyg=", 218 | "dev": true 219 | }, 220 | "media-typer": { 221 | "version": "0.3.0", 222 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/media-typer/-/media-typer-0.3.0.tgz", 223 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 224 | }, 225 | "merge-descriptors": { 226 | "version": "1.0.1", 227 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 228 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 229 | }, 230 | "methods": { 231 | "version": "1.1.2", 232 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/methods/-/methods-1.1.2.tgz", 233 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 234 | }, 235 | "mime": { 236 | "version": "1.6.0", 237 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/mime/-/mime-1.6.0.tgz", 238 | "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=" 239 | }, 240 | "mime-db": { 241 | "version": "1.45.0", 242 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/mime-db/-/mime-db-1.45.0.tgz", 243 | "integrity": "sha1-zO7aIczXw6dF66LezVXUtz54eeo=" 244 | }, 245 | "mime-types": { 246 | "version": "2.1.28", 247 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/mime-types/-/mime-types-2.1.28.tgz", 248 | "integrity": "sha1-EWDEdX6rLFNjiI4AUnPs950qDs0=", 249 | "requires": { 250 | "mime-db": "1.45.0" 251 | } 252 | }, 253 | "ms": { 254 | "version": "2.0.0", 255 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/ms/-/ms-2.0.0.tgz", 256 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 257 | }, 258 | "negotiator": { 259 | "version": "0.6.2", 260 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/negotiator/-/negotiator-0.6.2.tgz", 261 | "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=" 262 | }, 263 | "on-finished": { 264 | "version": "2.3.0", 265 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/on-finished/-/on-finished-2.3.0.tgz", 266 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 267 | "requires": { 268 | "ee-first": "1.1.1" 269 | } 270 | }, 271 | "parseurl": { 272 | "version": "1.3.3", 273 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/parseurl/-/parseurl-1.3.3.tgz", 274 | "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=" 275 | }, 276 | "path-to-regexp": { 277 | "version": "0.1.7", 278 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 279 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 280 | }, 281 | "proxy-addr": { 282 | "version": "2.0.6", 283 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/proxy-addr/-/proxy-addr-2.0.6.tgz", 284 | "integrity": "sha1-/cIzZQVEfT8vLGOO0nLK9hS7sr8=", 285 | "requires": { 286 | "forwarded": "~0.1.2", 287 | "ipaddr.js": "1.9.1" 288 | } 289 | }, 290 | "qs": { 291 | "version": "6.7.0", 292 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/qs/-/qs-6.7.0.tgz", 293 | "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=" 294 | }, 295 | "range-parser": { 296 | "version": "1.2.1", 297 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/range-parser/-/range-parser-1.2.1.tgz", 298 | "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=" 299 | }, 300 | "raw-body": { 301 | "version": "2.4.0", 302 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/raw-body/-/raw-body-2.4.0.tgz", 303 | "integrity": "sha1-oc5vucm8NWylLoklarWQWeE9AzI=", 304 | "requires": { 305 | "bytes": "3.1.0", 306 | "http-errors": "1.7.2", 307 | "iconv-lite": "0.4.24", 308 | "unpipe": "1.0.0" 309 | } 310 | }, 311 | "safe-buffer": { 312 | "version": "5.1.2", 313 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/safe-buffer/-/safe-buffer-5.1.2.tgz", 314 | "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" 315 | }, 316 | "safer-buffer": { 317 | "version": "2.1.2", 318 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/safer-buffer/-/safer-buffer-2.1.2.tgz", 319 | "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=" 320 | }, 321 | "send": { 322 | "version": "0.17.1", 323 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/send/-/send-0.17.1.tgz", 324 | "integrity": "sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg=", 325 | "requires": { 326 | "debug": "2.6.9", 327 | "depd": "~1.1.2", 328 | "destroy": "~1.0.4", 329 | "encodeurl": "~1.0.2", 330 | "escape-html": "~1.0.3", 331 | "etag": "~1.8.1", 332 | "fresh": "0.5.2", 333 | "http-errors": "~1.7.2", 334 | "mime": "1.6.0", 335 | "ms": "2.1.1", 336 | "on-finished": "~2.3.0", 337 | "range-parser": "~1.2.1", 338 | "statuses": "~1.5.0" 339 | }, 340 | "dependencies": { 341 | "ms": { 342 | "version": "2.1.1", 343 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/ms/-/ms-2.1.1.tgz", 344 | "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=" 345 | } 346 | } 347 | }, 348 | "serve-static": { 349 | "version": "1.14.1", 350 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/serve-static/-/serve-static-1.14.1.tgz", 351 | "integrity": "sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=", 352 | "requires": { 353 | "encodeurl": "~1.0.2", 354 | "escape-html": "~1.0.3", 355 | "parseurl": "~1.3.3", 356 | "send": "0.17.1" 357 | } 358 | }, 359 | "setprototypeof": { 360 | "version": "1.1.1", 361 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/setprototypeof/-/setprototypeof-1.1.1.tgz", 362 | "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=" 363 | }, 364 | "statuses": { 365 | "version": "1.5.0", 366 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/statuses/-/statuses-1.5.0.tgz", 367 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 368 | }, 369 | "toidentifier": { 370 | "version": "1.0.0", 371 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/toidentifier/-/toidentifier-1.0.0.tgz", 372 | "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=" 373 | }, 374 | "type-is": { 375 | "version": "1.6.18", 376 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/type-is/-/type-is-1.6.18.tgz", 377 | "integrity": "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=", 378 | "requires": { 379 | "media-typer": "0.3.0", 380 | "mime-types": "~2.1.24" 381 | } 382 | }, 383 | "unpipe": { 384 | "version": "1.0.0", 385 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/unpipe/-/unpipe-1.0.0.tgz", 386 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 387 | }, 388 | "utils-merge": { 389 | "version": "1.0.1", 390 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/utils-merge/-/utils-merge-1.0.1.tgz", 391 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 392 | }, 393 | "vary": { 394 | "version": "1.1.2", 395 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/vary/-/vary-1.1.2.tgz", 396 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 397 | } 398 | } 399 | } 400 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/4/iwasm/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "scripts": { 3 | "asbuild:untouched": "asc assembly/index.ts --target debug", 4 | "asbuild:optimized": "asc assembly/index.ts --target release", 5 | "asbuild": "npm run asbuild:untouched && npm run asbuild:optimized", 6 | "test": "node tests", 7 | "server": "node server.js" 8 | }, 9 | "dependencies": { 10 | "@assemblyscript/loader": "^0.18.7", 11 | "express": "^4.17.1" 12 | }, 13 | "devDependencies": { 14 | "assemblyscript": "^0.18.7" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/4/iwasm/server.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const app = express(); 3 | 4 | app.use(express.static('./')) 5 | 6 | app.listen(3000, () => console.log('Server up on port 3000!')); 7 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/4/iwasm/tests/index.js: -------------------------------------------------------------------------------- 1 | const assert = require("assert"); 2 | const myModule = require(".."); 3 | assert.equal(myModule.minusOne(2), 1); 4 | console.log("ok"); 5 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/5/iwasm/asconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "targets": { 3 | "debug": { 4 | "binaryFile": "build/untouched.wasm", 5 | "textFile": "build/untouched.wat", 6 | "sourceMap": true, 7 | "debug": true 8 | }, 9 | "release": { 10 | "binaryFile": "build/optimized.wasm", 11 | "textFile": "build/optimized.wat", 12 | "sourceMap": true, 13 | "optimizeLevel": 3, 14 | "shrinkLevel": 1, 15 | "converge": false, 16 | "noAssert": false 17 | } 18 | }, 19 | "options": {} 20 | } -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/5/iwasm/assembly/index.ts: -------------------------------------------------------------------------------- 1 | declare function log(n: i32): void 2 | 3 | export function minusOne(n: i32): i32 { 4 | log(n); 5 | return n - 1; 6 | } 7 | 8 | export function fizzbuzz(n: i32): String | null { 9 | 10 | if (n % 15 === 0) { 11 | return 'fizzbuzz'; 12 | } 13 | 14 | if (n % 3 === 0) { 15 | return 'fizz'; 16 | } 17 | 18 | if (n % 5 === 0) { 19 | return 'buzz'; 20 | } 21 | 22 | return null; 23 | } 24 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/5/iwasm/assembly/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "assemblyscript/std/assembly.json", 3 | "include": [ 4 | "./**/*.ts" 5 | ] 6 | } -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/5/iwasm/build/.gitignore: -------------------------------------------------------------------------------- 1 | *.wasm 2 | *.wasm.map 3 | *.asm.js 4 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/5/iwasm/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/5/iwasm/index.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const loader = require("@assemblyscript/loader"); 3 | const imports = { /* imports go here */ }; 4 | const wasmModule = loader.instantiateSync(fs.readFileSync(__dirname + "/build/optimized.wasm"), imports); 5 | module.exports = wasmModule.exports; 6 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/5/iwasm/js/loader.js: -------------------------------------------------------------------------------- 1 | class WasmLoader { 2 | constructor() { 3 | this._imports = { 4 | env: { 5 | abort() { 6 | throw new Error('Abort called from wasm file'); 7 | } 8 | }, 9 | index: { 10 | log(n) { 11 | console.log(n); 12 | } 13 | } 14 | }; 15 | } 16 | 17 | async wasm(path, imports = this._imports) { 18 | console.log(`fetching ${path}`); 19 | 20 | if (!loader.instantiateStreaming) { 21 | return this.wasmFallback(path, imports); 22 | } 23 | 24 | const instance = await loader.instantiateStreaming(fetch(path), imports); 25 | 26 | return instance?.exports; 27 | } 28 | 29 | async wasmFallback(path, imports) { 30 | console.log('using fallback'); 31 | const response = await fetch(path); 32 | const bytes = await response?.arrayBuffer(); 33 | const instance = await loader.instantiate(bytes, imports); 34 | 35 | return instance?.exports; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/5/iwasm/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "requires": true, 3 | "lockfileVersion": 1, 4 | "dependencies": { 5 | "@assemblyscript/loader": { 6 | "version": "0.18.7", 7 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/@assemblyscript/loader/-/loader-0.18.7.tgz", 8 | "integrity": "sha1-o7r6YudH3cjXdUnFKIzXbql2xqA=" 9 | }, 10 | "accepts": { 11 | "version": "1.3.7", 12 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/accepts/-/accepts-1.3.7.tgz", 13 | "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", 14 | "requires": { 15 | "mime-types": "~2.1.24", 16 | "negotiator": "0.6.2" 17 | } 18 | }, 19 | "array-flatten": { 20 | "version": "1.1.1", 21 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/array-flatten/-/array-flatten-1.1.1.tgz", 22 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 23 | }, 24 | "assemblyscript": { 25 | "version": "0.18.7", 26 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/assemblyscript/-/assemblyscript-0.18.7.tgz", 27 | "integrity": "sha1-tV9EKf82J88xL0c1Uht9xSQ5nMU=", 28 | "dev": true, 29 | "requires": { 30 | "binaryen": "98.0.0-nightly.20210106", 31 | "long": "^4.0.0" 32 | } 33 | }, 34 | "binaryen": { 35 | "version": "98.0.0-nightly.20210106", 36 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/binaryen/-/binaryen-98.0.0-nightly.20210106.tgz", 37 | "integrity": "sha1-x7xjfiIjqDvzyunZiWn1ae+rQGI=", 38 | "dev": true 39 | }, 40 | "body-parser": { 41 | "version": "1.19.0", 42 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/body-parser/-/body-parser-1.19.0.tgz", 43 | "integrity": "sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io=", 44 | "requires": { 45 | "bytes": "3.1.0", 46 | "content-type": "~1.0.4", 47 | "debug": "2.6.9", 48 | "depd": "~1.1.2", 49 | "http-errors": "1.7.2", 50 | "iconv-lite": "0.4.24", 51 | "on-finished": "~2.3.0", 52 | "qs": "6.7.0", 53 | "raw-body": "2.4.0", 54 | "type-is": "~1.6.17" 55 | } 56 | }, 57 | "bytes": { 58 | "version": "3.1.0", 59 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/bytes/-/bytes-3.1.0.tgz", 60 | "integrity": "sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY=" 61 | }, 62 | "content-disposition": { 63 | "version": "0.5.3", 64 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/content-disposition/-/content-disposition-0.5.3.tgz", 65 | "integrity": "sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70=", 66 | "requires": { 67 | "safe-buffer": "5.1.2" 68 | } 69 | }, 70 | "content-type": { 71 | "version": "1.0.4", 72 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/content-type/-/content-type-1.0.4.tgz", 73 | "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=" 74 | }, 75 | "cookie": { 76 | "version": "0.4.0", 77 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/cookie/-/cookie-0.4.0.tgz", 78 | "integrity": "sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo=" 79 | }, 80 | "cookie-signature": { 81 | "version": "1.0.6", 82 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/cookie-signature/-/cookie-signature-1.0.6.tgz", 83 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 84 | }, 85 | "debug": { 86 | "version": "2.6.9", 87 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/debug/-/debug-2.6.9.tgz", 88 | "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", 89 | "requires": { 90 | "ms": "2.0.0" 91 | } 92 | }, 93 | "depd": { 94 | "version": "1.1.2", 95 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/depd/-/depd-1.1.2.tgz", 96 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 97 | }, 98 | "destroy": { 99 | "version": "1.0.4", 100 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/destroy/-/destroy-1.0.4.tgz", 101 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 102 | }, 103 | "ee-first": { 104 | "version": "1.1.1", 105 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/ee-first/-/ee-first-1.1.1.tgz", 106 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 107 | }, 108 | "encodeurl": { 109 | "version": "1.0.2", 110 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/encodeurl/-/encodeurl-1.0.2.tgz", 111 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 112 | }, 113 | "escape-html": { 114 | "version": "1.0.3", 115 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/escape-html/-/escape-html-1.0.3.tgz", 116 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 117 | }, 118 | "etag": { 119 | "version": "1.8.1", 120 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/etag/-/etag-1.8.1.tgz", 121 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 122 | }, 123 | "express": { 124 | "version": "4.17.1", 125 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/express/-/express-4.17.1.tgz", 126 | "integrity": "sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ=", 127 | "requires": { 128 | "accepts": "~1.3.7", 129 | "array-flatten": "1.1.1", 130 | "body-parser": "1.19.0", 131 | "content-disposition": "0.5.3", 132 | "content-type": "~1.0.4", 133 | "cookie": "0.4.0", 134 | "cookie-signature": "1.0.6", 135 | "debug": "2.6.9", 136 | "depd": "~1.1.2", 137 | "encodeurl": "~1.0.2", 138 | "escape-html": "~1.0.3", 139 | "etag": "~1.8.1", 140 | "finalhandler": "~1.1.2", 141 | "fresh": "0.5.2", 142 | "merge-descriptors": "1.0.1", 143 | "methods": "~1.1.2", 144 | "on-finished": "~2.3.0", 145 | "parseurl": "~1.3.3", 146 | "path-to-regexp": "0.1.7", 147 | "proxy-addr": "~2.0.5", 148 | "qs": "6.7.0", 149 | "range-parser": "~1.2.1", 150 | "safe-buffer": "5.1.2", 151 | "send": "0.17.1", 152 | "serve-static": "1.14.1", 153 | "setprototypeof": "1.1.1", 154 | "statuses": "~1.5.0", 155 | "type-is": "~1.6.18", 156 | "utils-merge": "1.0.1", 157 | "vary": "~1.1.2" 158 | } 159 | }, 160 | "finalhandler": { 161 | "version": "1.1.2", 162 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/finalhandler/-/finalhandler-1.1.2.tgz", 163 | "integrity": "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=", 164 | "requires": { 165 | "debug": "2.6.9", 166 | "encodeurl": "~1.0.2", 167 | "escape-html": "~1.0.3", 168 | "on-finished": "~2.3.0", 169 | "parseurl": "~1.3.3", 170 | "statuses": "~1.5.0", 171 | "unpipe": "~1.0.0" 172 | } 173 | }, 174 | "forwarded": { 175 | "version": "0.1.2", 176 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/forwarded/-/forwarded-0.1.2.tgz", 177 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 178 | }, 179 | "fresh": { 180 | "version": "0.5.2", 181 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/fresh/-/fresh-0.5.2.tgz", 182 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 183 | }, 184 | "http-errors": { 185 | "version": "1.7.2", 186 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/http-errors/-/http-errors-1.7.2.tgz", 187 | "integrity": "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=", 188 | "requires": { 189 | "depd": "~1.1.2", 190 | "inherits": "2.0.3", 191 | "setprototypeof": "1.1.1", 192 | "statuses": ">= 1.5.0 < 2", 193 | "toidentifier": "1.0.0" 194 | } 195 | }, 196 | "iconv-lite": { 197 | "version": "0.4.24", 198 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/iconv-lite/-/iconv-lite-0.4.24.tgz", 199 | "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", 200 | "requires": { 201 | "safer-buffer": ">= 2.1.2 < 3" 202 | } 203 | }, 204 | "inherits": { 205 | "version": "2.0.3", 206 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/inherits/-/inherits-2.0.3.tgz", 207 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 208 | }, 209 | "ipaddr.js": { 210 | "version": "1.9.1", 211 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 212 | "integrity": "sha1-v/OFQ+64mEglB5/zoqjmy9RngbM=" 213 | }, 214 | "long": { 215 | "version": "4.0.0", 216 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/long/-/long-4.0.0.tgz", 217 | "integrity": "sha1-mntxz7fTYaGU6lVSQckvdGjVvyg=", 218 | "dev": true 219 | }, 220 | "media-typer": { 221 | "version": "0.3.0", 222 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/media-typer/-/media-typer-0.3.0.tgz", 223 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 224 | }, 225 | "merge-descriptors": { 226 | "version": "1.0.1", 227 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 228 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 229 | }, 230 | "methods": { 231 | "version": "1.1.2", 232 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/methods/-/methods-1.1.2.tgz", 233 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 234 | }, 235 | "mime": { 236 | "version": "1.6.0", 237 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/mime/-/mime-1.6.0.tgz", 238 | "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=" 239 | }, 240 | "mime-db": { 241 | "version": "1.45.0", 242 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/mime-db/-/mime-db-1.45.0.tgz", 243 | "integrity": "sha1-zO7aIczXw6dF66LezVXUtz54eeo=" 244 | }, 245 | "mime-types": { 246 | "version": "2.1.28", 247 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/mime-types/-/mime-types-2.1.28.tgz", 248 | "integrity": "sha1-EWDEdX6rLFNjiI4AUnPs950qDs0=", 249 | "requires": { 250 | "mime-db": "1.45.0" 251 | } 252 | }, 253 | "ms": { 254 | "version": "2.0.0", 255 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/ms/-/ms-2.0.0.tgz", 256 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 257 | }, 258 | "negotiator": { 259 | "version": "0.6.2", 260 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/negotiator/-/negotiator-0.6.2.tgz", 261 | "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=" 262 | }, 263 | "on-finished": { 264 | "version": "2.3.0", 265 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/on-finished/-/on-finished-2.3.0.tgz", 266 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 267 | "requires": { 268 | "ee-first": "1.1.1" 269 | } 270 | }, 271 | "parseurl": { 272 | "version": "1.3.3", 273 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/parseurl/-/parseurl-1.3.3.tgz", 274 | "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=" 275 | }, 276 | "path-to-regexp": { 277 | "version": "0.1.7", 278 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 279 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 280 | }, 281 | "proxy-addr": { 282 | "version": "2.0.6", 283 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/proxy-addr/-/proxy-addr-2.0.6.tgz", 284 | "integrity": "sha1-/cIzZQVEfT8vLGOO0nLK9hS7sr8=", 285 | "requires": { 286 | "forwarded": "~0.1.2", 287 | "ipaddr.js": "1.9.1" 288 | } 289 | }, 290 | "qs": { 291 | "version": "6.7.0", 292 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/qs/-/qs-6.7.0.tgz", 293 | "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=" 294 | }, 295 | "range-parser": { 296 | "version": "1.2.1", 297 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/range-parser/-/range-parser-1.2.1.tgz", 298 | "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=" 299 | }, 300 | "raw-body": { 301 | "version": "2.4.0", 302 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/raw-body/-/raw-body-2.4.0.tgz", 303 | "integrity": "sha1-oc5vucm8NWylLoklarWQWeE9AzI=", 304 | "requires": { 305 | "bytes": "3.1.0", 306 | "http-errors": "1.7.2", 307 | "iconv-lite": "0.4.24", 308 | "unpipe": "1.0.0" 309 | } 310 | }, 311 | "safe-buffer": { 312 | "version": "5.1.2", 313 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/safe-buffer/-/safe-buffer-5.1.2.tgz", 314 | "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" 315 | }, 316 | "safer-buffer": { 317 | "version": "2.1.2", 318 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/safer-buffer/-/safer-buffer-2.1.2.tgz", 319 | "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=" 320 | }, 321 | "send": { 322 | "version": "0.17.1", 323 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/send/-/send-0.17.1.tgz", 324 | "integrity": "sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg=", 325 | "requires": { 326 | "debug": "2.6.9", 327 | "depd": "~1.1.2", 328 | "destroy": "~1.0.4", 329 | "encodeurl": "~1.0.2", 330 | "escape-html": "~1.0.3", 331 | "etag": "~1.8.1", 332 | "fresh": "0.5.2", 333 | "http-errors": "~1.7.2", 334 | "mime": "1.6.0", 335 | "ms": "2.1.1", 336 | "on-finished": "~2.3.0", 337 | "range-parser": "~1.2.1", 338 | "statuses": "~1.5.0" 339 | }, 340 | "dependencies": { 341 | "ms": { 342 | "version": "2.1.1", 343 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/ms/-/ms-2.1.1.tgz", 344 | "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=" 345 | } 346 | } 347 | }, 348 | "serve-static": { 349 | "version": "1.14.1", 350 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/serve-static/-/serve-static-1.14.1.tgz", 351 | "integrity": "sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=", 352 | "requires": { 353 | "encodeurl": "~1.0.2", 354 | "escape-html": "~1.0.3", 355 | "parseurl": "~1.3.3", 356 | "send": "0.17.1" 357 | } 358 | }, 359 | "setprototypeof": { 360 | "version": "1.1.1", 361 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/setprototypeof/-/setprototypeof-1.1.1.tgz", 362 | "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=" 363 | }, 364 | "statuses": { 365 | "version": "1.5.0", 366 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/statuses/-/statuses-1.5.0.tgz", 367 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 368 | }, 369 | "toidentifier": { 370 | "version": "1.0.0", 371 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/toidentifier/-/toidentifier-1.0.0.tgz", 372 | "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=" 373 | }, 374 | "type-is": { 375 | "version": "1.6.18", 376 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/type-is/-/type-is-1.6.18.tgz", 377 | "integrity": "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=", 378 | "requires": { 379 | "media-typer": "0.3.0", 380 | "mime-types": "~2.1.24" 381 | } 382 | }, 383 | "unpipe": { 384 | "version": "1.0.0", 385 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/unpipe/-/unpipe-1.0.0.tgz", 386 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 387 | }, 388 | "utils-merge": { 389 | "version": "1.0.1", 390 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/utils-merge/-/utils-merge-1.0.1.tgz", 391 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 392 | }, 393 | "vary": { 394 | "version": "1.1.2", 395 | "resolved": "https://artifacts.netflix.com/api/npm/npm-netflix/vary/-/vary-1.1.2.tgz", 396 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 397 | } 398 | } 399 | } 400 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/5/iwasm/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "scripts": { 3 | "asbuild:untouched": "asc assembly/index.ts --target debug --exportRuntime", 4 | "asbuild:optimized": "asc assembly/index.ts --target release --exportRuntime", 5 | "asbuild": "npm run asbuild:untouched && npm run asbuild:optimized", 6 | "test": "node tests", 7 | "server": "node server.js" 8 | }, 9 | "dependencies": { 10 | "@assemblyscript/loader": "^0.18.7", 11 | "express": "^4.17.1" 12 | }, 13 | "devDependencies": { 14 | "assemblyscript": "^0.18.7" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/5/iwasm/server.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const app = express(); 3 | 4 | app.use(express.static('./')) 5 | 6 | app.listen(3000, () => console.log('Server up on port 3000!')); 7 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/5/iwasm/tests/index.js: -------------------------------------------------------------------------------- 1 | const assert = require("assert"); 2 | const myModule = require(".."); 3 | assert.equal(myModule.minusOne(2), 1); 4 | console.log("ok"); 5 | -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/6/iwasm/asconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "targets": { 3 | "debug": { 4 | "binaryFile": "build/untouched.wasm", 5 | "textFile": "build/untouched.wat", 6 | "sourceMap": true, 7 | "debug": true 8 | }, 9 | "release": { 10 | "binaryFile": "build/optimized.wasm", 11 | "textFile": "build/optimized.wat", 12 | "sourceMap": true, 13 | "optimizeLevel": 3, 14 | "shrinkLevel": 1, 15 | "converge": false, 16 | "noAssert": false 17 | } 18 | }, 19 | "options": {} 20 | } -------------------------------------------------------------------------------- /lessons/assembly-script/exercises/6/iwasm/assembly/index.ts: -------------------------------------------------------------------------------- 1 | declare function log(n: i32): void 2 | 3 | memory.grow(2); 4 | storeBy Jem Young
66 | 67 | {/* {!frontmatter ? null : ( 68 |You just hit a route that doesn't exist... the sadness.
7 |