summaryrefslogtreecommitdiff
path: root/runtime/js/30_os.js
blob: 15df6f5549b39d66ec53c54dbd2d2f6b1e3fb5be (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
"use strict";

((window) => {
  const core = window.Deno.core;
  const {
    Error,
    SymbolFor,
  } = window.__bootstrap.primordials;

  function loadavg() {
    return core.opSync("op_loadavg");
  }

  function hostname() {
    return core.opSync("op_hostname");
  }

  function osRelease() {
    return core.opSync("op_os_release");
  }

  function systemMemoryInfo() {
    return core.opSync("op_system_memory_info");
  }

  // This is an internal only method used by the test harness to override the
  // behavior of exit when the exit sanitizer is enabled.
  let exitHandler = null;
  function setExitHandler(fn) {
    exitHandler = fn;
  }

  function exit(code = 0) {
    // Dispatches `unload` only when it's not dispatched yet.
    if (!window[SymbolFor("isUnloadDispatched")]) {
      // Invokes the `unload` hooks before exiting
      // ref: https://github.com/denoland/deno/issues/3603
      window.dispatchEvent(new Event("unload"));
    }

    if (exitHandler) {
      exitHandler(code);
      return;
    }

    core.opSync("op_exit", code);
    throw new Error("Code not reachable");
  }

  function setEnv(key, value) {
    core.opSync("op_set_env", key, value);
  }

  function getEnv(key) {
    return core.opSync("op_get_env", key) ?? undefined;
  }

  function deleteEnv(key) {
    core.opSync("op_delete_env", key);
  }

  const env = {
    get: getEnv,
    toObject() {
      return core.opSync("op_env");
    },
    set: setEnv,
    delete: deleteEnv,
  };

  function execPath() {
    return core.opSync("op_exec_path");
  }

  window.__bootstrap.os = {
    env,
    execPath,
    setExitHandler,
    exit,
    osRelease,
    systemMemoryInfo,
    hostname,
    loadavg,
  };
})(this);