From 8c7a10bb9b72708a2fec2b27193b7fcbc914dadb Mon Sep 17 00:00:00 2001 From: Jeongho Nam Date: Mon, 6 May 2024 22:16:32 +0900 Subject: [PATCH] Writing #68: guide documents again --- .vscode/settings.json | 3 + package.json | 2 - website/.gitignore | 2 + website/.prettierignore | 1 + website/.vscode/settings.json | 27 + website/build/deploy.js | 18 + website/diagrams/sequences.vsdx | Bin 0 -> 130990 bytes website/next-env.d.ts | 5 + website/next-sitemap.config.js | 5 + website/next.config.js | 20 + website/package.json | 58 + website/pages/_app.js | 22 + website/pages/_meta.json | 15 + website/pages/docs/_meta.json | 20 + website/pages/docs/examples/_meta.json | 6 + website/pages/docs/examples/nestjs.mdx | 0 .../docs/examples/object-oriented-network.mdx | 0 .../docs/examples/remote-function-call.mdx | 0 .../docs/examples/remote-object-call.mdx | 0 website/pages/docs/features/_meta.json | 6 + website/pages/docs/features/components.mdx | 49 + website/pages/docs/features/nestjs.mdx | 0 website/pages/docs/features/websocket.mdx | 5 + website/pages/docs/features/worker.mdx | 0 website/pages/docs/index.mdx | 0 website/pages/docs/projects/_meta.json | 4 + website/pages/docs/projects/chat.mdx | 0 website/pages/docs/projects/market.mdx | 0 website/pages/index.mdx | 0 website/prettier.config.js | 10 + website/public/api/.nojekyll | 1 + website/public/api/assets/highlight.css | 99 ++ website/public/api/assets/icons.js | 15 + website/public/api/assets/icons.svg | 1 + website/public/api/assets/main.js | 59 + website/public/api/assets/navigation.js | 1 + website/public/api/assets/search.js | 1 + website/public/api/assets/style.css | 1412 +++++++++++++++++ website/public/api/classes/Communicator.html | 72 + .../api/classes/SharedWorkerAcceptor-1.html | 91 ++ .../api/classes/SharedWorkerConnector-1.html | 113 ++ .../api/classes/SharedWorkerServer-1.html | 56 + website/public/api/classes/WebAcceptor-1.html | 90 ++ .../public/api/classes/WebConnector-1.html | 98 ++ website/public/api/classes/WebError.html | 26 + website/public/api/classes/WebServer-1.html | 57 + .../public/api/classes/WorkerConnector-1.html | 113 ++ .../public/api/classes/WorkerServer-1.html | 85 + .../public/api/enums/WebAcceptor.State.html | 8 + .../public/api/enums/WebConnector.State.html | 7 + website/public/api/enums/WebServer.State.html | 6 + .../SharedWorkerConnector.compile.html | 4 + .../SharedWorkerConnector.remove.html | 3 + website/public/api/hierarchy.html | 1 + website/public/api/index.html | 202 +++ .../api/interfaces/Invoke.IFunction.html | 8 + .../api/interfaces/Invoke.IParameter.html | 3 + .../public/api/interfaces/Invoke.IReturn.html | 8 + ...SharedWorkerConnector.IConnectOptions.html | 4 + .../WebConnector.IConnectOptions.html | 4 + .../WorkerConnector.IConnectOptions.html | 6 + website/public/api/modules.html | 26 + website/public/api/modules/Invoke.html | 4 + .../api/modules/SharedWorkerAcceptor.html | 2 + .../api/modules/SharedWorkerConnector.html | 5 + .../api/modules/SharedWorkerServer.html | 2 + website/public/api/modules/WebAcceptor.html | 2 + website/public/api/modules/WebConnector.html | 3 + website/public/api/modules/WebServer.html | 2 + .../public/api/modules/WorkerConnector.html | 3 + website/public/api/modules/WorkerServer.html | 2 + website/public/api/modules/default.html | 15 + website/public/api/types/Driver.html | 14 + website/public/api/types/Invoke-1.html | 3 + website/public/api/types/Primitive.html | 54 + website/public/api/types/Promisive.html | 10 + website/public/api/variables/Driver-1.html | 1 + website/public/images/diagrams/sequence.png | Bin 0 -> 18399 bytes website/theme.config.tsx | 116 ++ website/tsconfig.json | 31 + website/tsconfig.webpack.json | 31 + website/typedoc.json | 7 + website/webpack.config.js | 37 + 83 files changed, 3300 insertions(+), 2 deletions(-) create mode 100644 website/.gitignore create mode 100644 website/.prettierignore create mode 100644 website/.vscode/settings.json create mode 100644 website/build/deploy.js create mode 100644 website/diagrams/sequences.vsdx create mode 100644 website/next-env.d.ts create mode 100644 website/next-sitemap.config.js create mode 100644 website/next.config.js create mode 100644 website/package.json create mode 100644 website/pages/_app.js create mode 100644 website/pages/_meta.json create mode 100644 website/pages/docs/_meta.json create mode 100644 website/pages/docs/examples/_meta.json create mode 100644 website/pages/docs/examples/nestjs.mdx create mode 100644 website/pages/docs/examples/object-oriented-network.mdx create mode 100644 website/pages/docs/examples/remote-function-call.mdx create mode 100644 website/pages/docs/examples/remote-object-call.mdx create mode 100644 website/pages/docs/features/_meta.json create mode 100644 website/pages/docs/features/components.mdx create mode 100644 website/pages/docs/features/nestjs.mdx create mode 100644 website/pages/docs/features/websocket.mdx create mode 100644 website/pages/docs/features/worker.mdx create mode 100644 website/pages/docs/index.mdx create mode 100644 website/pages/docs/projects/_meta.json create mode 100644 website/pages/docs/projects/chat.mdx create mode 100644 website/pages/docs/projects/market.mdx create mode 100644 website/pages/index.mdx create mode 100644 website/prettier.config.js create mode 100644 website/public/api/.nojekyll create mode 100644 website/public/api/assets/highlight.css create mode 100644 website/public/api/assets/icons.js create mode 100644 website/public/api/assets/icons.svg create mode 100644 website/public/api/assets/main.js create mode 100644 website/public/api/assets/navigation.js create mode 100644 website/public/api/assets/search.js create mode 100644 website/public/api/assets/style.css create mode 100644 website/public/api/classes/Communicator.html create mode 100644 website/public/api/classes/SharedWorkerAcceptor-1.html create mode 100644 website/public/api/classes/SharedWorkerConnector-1.html create mode 100644 website/public/api/classes/SharedWorkerServer-1.html create mode 100644 website/public/api/classes/WebAcceptor-1.html create mode 100644 website/public/api/classes/WebConnector-1.html create mode 100644 website/public/api/classes/WebError.html create mode 100644 website/public/api/classes/WebServer-1.html create mode 100644 website/public/api/classes/WorkerConnector-1.html create mode 100644 website/public/api/classes/WorkerServer-1.html create mode 100644 website/public/api/enums/WebAcceptor.State.html create mode 100644 website/public/api/enums/WebConnector.State.html create mode 100644 website/public/api/enums/WebServer.State.html create mode 100644 website/public/api/functions/SharedWorkerConnector.compile.html create mode 100644 website/public/api/functions/SharedWorkerConnector.remove.html create mode 100644 website/public/api/hierarchy.html create mode 100644 website/public/api/index.html create mode 100644 website/public/api/interfaces/Invoke.IFunction.html create mode 100644 website/public/api/interfaces/Invoke.IParameter.html create mode 100644 website/public/api/interfaces/Invoke.IReturn.html create mode 100644 website/public/api/interfaces/SharedWorkerConnector.IConnectOptions.html create mode 100644 website/public/api/interfaces/WebConnector.IConnectOptions.html create mode 100644 website/public/api/interfaces/WorkerConnector.IConnectOptions.html create mode 100644 website/public/api/modules.html create mode 100644 website/public/api/modules/Invoke.html create mode 100644 website/public/api/modules/SharedWorkerAcceptor.html create mode 100644 website/public/api/modules/SharedWorkerConnector.html create mode 100644 website/public/api/modules/SharedWorkerServer.html create mode 100644 website/public/api/modules/WebAcceptor.html create mode 100644 website/public/api/modules/WebConnector.html create mode 100644 website/public/api/modules/WebServer.html create mode 100644 website/public/api/modules/WorkerConnector.html create mode 100644 website/public/api/modules/WorkerServer.html create mode 100644 website/public/api/modules/default.html create mode 100644 website/public/api/types/Driver.html create mode 100644 website/public/api/types/Invoke-1.html create mode 100644 website/public/api/types/Primitive.html create mode 100644 website/public/api/types/Promisive.html create mode 100644 website/public/api/variables/Driver-1.html create mode 100644 website/public/images/diagrams/sequence.png create mode 100644 website/theme.config.tsx create mode 100644 website/tsconfig.json create mode 100644 website/tsconfig.webpack.json create mode 100644 website/typedoc.json create mode 100644 website/webpack.config.js diff --git a/.vscode/settings.json b/.vscode/settings.json index 7818719..8f26c47 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -6,5 +6,8 @@ "editor.codeActionsOnSave": { "source.fixAll.eslint": "explicit" }, + }, + "[mdx]": { + "editor.wordWrap": "on" } } \ No newline at end of file diff --git a/package.json b/package.json index 3900e34..8e52f69 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,6 @@ "url": "https://github.com/samchon" }, "scripts": { - "api": "typedoc src --excludeNotDocumented -out ../tgrid.com/docs/api", "build": "npm run build:main && npm run build:test", "build:main": "rimraf lib && tsc && rollup -c", "build:test": "rimraf bin && tsc --project test/tsconfig.json", @@ -56,7 +55,6 @@ "ts-node": "^10.9.2", "ts-patch": "^3.1.2", "tslib": "^2.6.2", - "typedoc": "^0.25.12", "typescript": "^5.4.3", "typescript-transform-paths": "^3.4.7", "whatwg-fetch": "^3.6.2" diff --git a/website/.gitignore b/website/.gitignore new file mode 100644 index 0000000..ce034c9 --- /dev/null +++ b/website/.gitignore @@ -0,0 +1,2 @@ +.next +node_modules/ \ No newline at end of file diff --git a/website/.prettierignore b/website/.prettierignore new file mode 100644 index 0000000..b512c09 --- /dev/null +++ b/website/.prettierignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/website/.vscode/settings.json b/website/.vscode/settings.json new file mode 100644 index 0000000..88d3c11 --- /dev/null +++ b/website/.vscode/settings.json @@ -0,0 +1,27 @@ +{ + "editor.tabSize": 2, + "[typescript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": true + }, + }, + "[typescriptreact]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": true + }, + }, + "[javascript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": true + }, + }, + "[mdx]": { + "editor.wordWrap": "on" + } +} \ No newline at end of file diff --git a/website/build/deploy.js b/website/build/deploy.js new file mode 100644 index 0000000..f7c0357 --- /dev/null +++ b/website/build/deploy.js @@ -0,0 +1,18 @@ +const cp = require("child_process"); +const deploy = require("gh-pages"); + +cp.execSync("npm run build", { stdio: "inherit" }); + +deploy.publish( + "out", + { + branch: "gh-pages", + dotfiles: true, + }, + (err) => { + if (err) { + console.log(err); + process.exit(-1); + } else clear(); + }, +); diff --git a/website/diagrams/sequences.vsdx b/website/diagrams/sequences.vsdx new file mode 100644 index 0000000000000000000000000000000000000000..130c4c817f091bd41a009850980bfc65ed954ac3 GIT binary patch literal 130990 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 X8e{?h10x6hC4xFiunW+55BC26@V;RW literal 0 HcmV?d00001 diff --git a/website/next-env.d.ts b/website/next-env.d.ts new file mode 100644 index 0000000..4f11a03 --- /dev/null +++ b/website/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/website/next-sitemap.config.js b/website/next-sitemap.config.js new file mode 100644 index 0000000..5b8d687 --- /dev/null +++ b/website/next-sitemap.config.js @@ -0,0 +1,5 @@ +/** @type {import('next-sitemap').IConfig} */ +module.exports = { + siteUrl: 'https://typia.io', + generateRobotsTxt: true, +}; \ No newline at end of file diff --git a/website/next.config.js b/website/next.config.js new file mode 100644 index 0000000..4df3c4d --- /dev/null +++ b/website/next.config.js @@ -0,0 +1,20 @@ +const withNextra = require("nextra")({ + theme: "nextra-theme-docs", + themeConfig: "./theme.config.tsx", +}); + +/** @type {import('next').NextConfig} */ +const config = { + ...withNextra(), + exportTrailingSlash: true, + images: { + unoptimized: true, + }, + rewrites: async () => [ + { + source: "/api", + destination: "/api/index.html", + }, + ], +}; +module.exports = config; diff --git a/website/package.json b/website/package.json new file mode 100644 index 0000000..6135c43 --- /dev/null +++ b/website/package.json @@ -0,0 +1,58 @@ +{ + "name": "typia.io", + "version": "0.1.0", + "description": "Typia Guide Documents", + "private": true, + "scripts": { + "build": "rimraf .next && rimraf out && typedoc && next build && next export && next-sitemap", + "deploy": "node build/deploy", + "dev": "next dev", + "prepare": "typedoc" + }, + "repository": { + "type": "git", + "url": "https://github.com/samchon/typia" + }, + "author": "Jeongho Nam", + "license": "MIT", + "bugs": { + "url": "https://github.com/samchon/typia/issues" + }, + "dependencies": { + "@emotion/react": "^11.10.6", + "@emotion/styled": "^11.10.6", + "@monaco-editor/react": "^4.5.1", + "@mui/icons-material": "^5.15.4", + "@mui/material": "^5.12.0", + "@rollup/browser": "^4.13.0", + "lz-string": "^1.5.0", + "monaco-editor": "^0.39.0", + "next": "^13.0.6", + "nextra": "latest", + "nextra-theme-docs": "latest", + "path": "^0.12.7", + "prettier": "^3.2.5", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "tgrid": "^0.10.2", + "tstl": "^3.0.0", + "typescript": "^5.4.5", + "typia": "^6.0.3" + }, + "devDependencies": { + "@trivago/prettier-plugin-sort-imports": "^4.3.0", + "@types/node": "^18.11.10", + "@types/prettier": "^3.0.0", + "@types/react": "^18.0.35", + "gh-pages": "^5.0.0", + "next-sitemap": "^4.0.7", + "process": "^0.11.10", + "rimraf": "^5.0.0", + "ts-loader": "^9.5.1", + "ts-node": "^10.9.1", + "typedoc": "^0.25.13", + "webpack": "^5.90.3", + "webpack-cli": "^5.1.4", + "write-file-webpack-plugin": "^4.5.1" + } +} diff --git a/website/pages/_app.js b/website/pages/_app.js new file mode 100644 index 0000000..e17f885 --- /dev/null +++ b/website/pages/_app.js @@ -0,0 +1,22 @@ +import Script from "next/script"; + +export default function Nextra({ Component, pageProps }) { + const getLayout = Component.getLayout || ((page) => page); + return ( + <> +

Class Communicator<Provider, Remote>Abstract

The basic communicator.

+

The Communicator is an abstract class taking full charge of network communication. +Protocolized communicators like WebConnector are realized by extending this +Communicator class.

+

You want to make your own communicator using special protocol, extends this Communicator +class. After the extending, implement your special communicator by overriding those methods.

+ +

Author

Jeongho Nam - https://github.com/samchon

+

Type Parameters

  • Provider extends object | null | undefined

    Type of features provided for remote system.

    +
  • Remote extends object | null

    Type of features supported by remote system, used for getDriver function.

    +

Hierarchy (view full)

Constructors

Methods

  • Destory the communicator.

    +

    A destory function must be called when the network communication has been closed. +It would destroy all function calls in the remote system (by Driver<Controller>), +which are not returned yet.

    +

    The error instance would be thrown to those function calls. If the disconnection is +abnormal, then write the detailed reason why into the error instance.

    +

    Parameters

    • Optional error: Error

      An error instance to be thrown to the unreturned functions.

      +

    Returns Promise<void>

  • Get Driver for RFC (Remote Function Call).

    +

    The Controller is an interface who defines provided functions from the remote +system. The Driver is an object who makes to call remote functions, defined in +the Controller and provided by Provider in the remote system, possible.

    +

    In other words, calling a functions in the Driver<Controller>, it means to call +a matched function in the remote system's Provider object.

    +
      +
    • Controller: Definition only
    • +
    • Driver: Remote Function Call
    • +
    +

    Type Parameters

    • Controller extends object = NonNullable<Remote>

      An interface for provided features (functions & objects) from the remote system (Provider).

      +
    • UseParametric extends boolean = false

      Whether to convert type of function parameters to be compatible with their pritimive.

      +

    Returns Driver<Controller, UseParametric>

    A Driver for the RFC.

    +
  • Get current Provider.

    +

    Get an object providing features (functions & objects) for remote system. The remote +system would call the features (Provider) by using its Driver<Controller>.

    +

    Returns Provider

    Current Provider object

    +
  • A predicator inspects whether the network communication is on ready.

    +

    Parameters

    • method: string

      The method name for tracing.

      +

    Returns null | Error

  • Join connection.

    +

    Wait until the connection to be closed.

    +

    Returns Promise<void>

  • Join connection or timeout.

    +

    Wait until the connection to be clsoed until timeout.

    +

    Parameters

    • ms: number

      The maximum milliseconds for joining.

      +

    Returns Promise<boolean>

    Whether awaken by disconnection or timeout.

    +
  • Join connection or time expiration.

    +

    Wait until the connection to be closed until time expiration.

    +

    Parameters

    • at: Date

      The maximum time point to join.

      +

    Returns Promise<boolean>

    Whether awaken by disconnection or time expiration.

    +
  • Data Reply Function.

    +

    A function should be called when data has come from the remote system.

    +

    When you receive a message from the remote system, then parse the message with your +special protocol and covert it to be an Invoke object. After the conversion, call +this method.

    +

    Parameters

    • invoke: Invoke

      Structured data converted by your special protocol.

      +

    Returns void

\ No newline at end of file diff --git a/website/public/api/classes/SharedWorkerAcceptor-1.html b/website/public/api/classes/SharedWorkerAcceptor-1.html new file mode 100644 index 0000000..6c2ae7a --- /dev/null +++ b/website/public/api/classes/SharedWorkerAcceptor-1.html @@ -0,0 +1,91 @@ +SharedWorkerAcceptor | tgrid

Class SharedWorkerAcceptor<Header, Provider, Remote>

SharedWorker acceptor for client.

+
    +
  • available only in the Web Browser.
  • +
+

The SharedWorkerAcceptor is a communicator class communicating with the remote client +(SharedWorkerConnector) using RFC (Remote Function Call). The SharedAcceptor +objects are always created by the SharedWorkerServer class whenever a remote client +connects to its server.

+

To accept connection and start interaction with the remote client, call the accept +method with special Provider. After the acceptance, don't forget to closing +the connection after your business has been completed. Otherwise, you don't want to accept but +reject the connection, call the reject method.

+

Also, when declaring this SharedWorkerAcceptor type, you've to define two template +arguments, Header and Provider. The Header type repersents an initial data gotten from +the remote client after the connection.

+

The second template argument Provider represents the features provided for the remote client. +If you don't have any plan to provide any feature to the remote client, just declare it as +null.

+

Author

Jeongho Nam - https://github.com/samchon

+

Type Parameters

  • Header

    Type of the header containing initial data.

    +
  • Provider extends object | null

    Type of features provided for the remote system.

    +
  • Remote extends object | null

    Type of features supported by remote system, used for getDriver function.

    +

Hierarchy

Implements

  • IWorkerSystem

Accessors

  • get state(): WebAcceptor.State
  • Get state.

    +

    Get current state of connection state with the remote client.

    +

    List of values are such like below:

    +
      +
    • REJECTING: The reject method is on running.
    • +
    • NONE: This instance is newly created, but did nothing yet.
    • +
    • ACCEPTING: The accept method is on running.
    • +
    • OPEN: The connection is online.
    • +
    • CLOSING: The close method is on running.
    • +
    • CLOSED: The connection is offline.
    • +
    +

    Returns WebAcceptor.State

Methods

  • Destory the communicator.

    +

    A destory function must be called when the network communication has been closed. +It would destroy all function calls in the remote system (by Driver<Controller>), +which are not returned yet.

    +

    The error instance would be thrown to those function calls. If the disconnection is +abnormal, then write the detailed reason why into the error instance.

    +

    Parameters

    • Optional error: Error

      An error instance to be thrown to the unreturned functions.

      +

    Returns Promise<void>

  • Get Driver for RFC (Remote Function Call).

    +

    The Controller is an interface who defines provided functions from the remote +system. The Driver is an object who makes to call remote functions, defined in +the Controller and provided by Provider in the remote system, possible.

    +

    In other words, calling a functions in the Driver<Controller>, it means to call +a matched function in the remote system's Provider object.

    +
      +
    • Controller: Definition only
    • +
    • Driver: Remote Function Call
    • +
    +

    Type Parameters

    • Controller extends object = NonNullable<Remote>

      An interface for provided features (functions & objects) from the remote system (Provider).

      +
    • UseParametric extends boolean = false

      Whether to convert type of function parameters to be compatible with their pritimive.

      +

    Returns Driver<Controller, UseParametric>

    A Driver for the RFC.

    +
  • Get current Provider.

    +

    Get an object providing features (functions & objects) for remote system. The remote +system would call the features (Provider) by using its Driver<Controller>.

    +

    Returns undefined | Provider

    Current Provider object

    +
  • Join connection.

    +

    Wait until the connection to be closed.

    +

    Returns Promise<void>

  • Join connection or timeout.

    +

    Wait until the connection to be clsoed until timeout.

    +

    Parameters

    • ms: number

      The maximum milliseconds for joining.

      +

    Returns Promise<boolean>

    Whether awaken by disconnection or timeout.

    +
  • Join connection or time expiration.

    +

    Wait until the connection to be closed until time expiration.

    +

    Parameters

    • at: Date

      The maximum time point to join.

      +

    Returns Promise<boolean>

    Whether awaken by disconnection or time expiration.

    +
  • Reject connection.

    +

    Reject without acceptance, any interaction. The connection would be closed immediately.

    +

    Parameters

    • reason: string = "Rejected by server"

      Detailed reason of the rejection. Default is "Rejected by server".

      +

    Returns Promise<void>

  • Data Reply Function.

    +

    A function should be called when data has come from the remote system.

    +

    When you receive a message from the remote system, then parse the message with your +special protocol and covert it to be an Invoke object. After the conversion, call +this method.

    +

    Parameters

    • invoke: Invoke

      Structured data converted by your special protocol.

      +

    Returns void

  • Set Provider

    +

    Parameters

    • obj: undefined | Provider

      An object would be provided for remote system.

      +

    Returns void

\ No newline at end of file diff --git a/website/public/api/classes/SharedWorkerConnector-1.html b/website/public/api/classes/SharedWorkerConnector-1.html new file mode 100644 index 0000000..6270336 --- /dev/null +++ b/website/public/api/classes/SharedWorkerConnector-1.html @@ -0,0 +1,113 @@ +SharedWorkerConnector | tgrid

Class SharedWorkerConnector<Header, Provider, Remote>

SharedWorker Connector

+
    +
  • available only in the Web Browser.
  • +
+

The SharedWorkerConnector is a communicator class, who can connect to an SharedWorker +instance and communicate with it using RFC (Remote Function Call), considering the +SharedWorker as a remote system (WorkerServer).

+

You can connect to an SharedWorker instance with connect() method. If the +SharedWorker instance does not exist yet, a new SharedWorker instance would be newly +created. After the creation, you have to let the SharedWorker program to open a sever +using the SharedWorkerServer.open() method. Your connection would be linked with +a SharedWorkerAcceptor object in the server.

+

After your business has been completed, you've to close the SharedWorker using one of +them below. If you don't close that, vulnerable memory usage and communication channel +would not be destroyed and it may cause the memory leak:

+ +

Also, when declaring this SharedWorkerConnector type, you've to define two template +arguments, Header and Provider. The Header type repersents an initial data gotten from the +remote client after the connection.

+

The second template argument Provider represents the features provided for the remote system. +If you don't have any plan to provide any feature to the remote system, just declare it as +null.

+

Author

Jeongho Nam - https://github.com/samchon

+

Type Parameters

  • Header

    Type of the header containing initial data.

    +
  • Provider extends object | null

    Type of features provided for the remote system.

    +
  • Remote extends object | null

    Type of features supported by remote system, used for getDriver function.

    +

Hierarchy

Implements

  • IWorkerSystem

Constructors

Accessors

  • get state(): WebConnector.State
  • Get state.

    +

    Get current state of connection state with the worker server.

    +

    List of values are such like below:

    +
      +
    • NONE: This instance is newly created, but did nothing yet.
    • +
    • CONNECTING: The connect method is on running.
    • +
    • OPEN: The connection is online.
    • +
    • CLOSING: The close method is on running.
    • +
    • CLOSED: The connection is offline.
    • +
    +

    Returns WebConnector.State

Methods

  • Connect to remote server.

    +

    The connect() method tries to connect an SharedWorker instance. If the +SharedWorker instance is not created yet, the SharedWorker instance would be newly +created. After the creation, the SharedWorker program must open that server using +the SharedWorkerServer.open() method.

    +

    After you business has been completed, you've to close the SharedWorker using one of +them below. If you don't close that, vulnerable memory usage and communication channel +would not be destroyed and it may cause the memory leak:

    + +

    Parameters

    Returns Promise<void>

  • Destory the communicator.

    +

    A destory function must be called when the network communication has been closed. +It would destroy all function calls in the remote system (by Driver<Controller>), +which are not returned yet.

    +

    The error instance would be thrown to those function calls. If the disconnection is +abnormal, then write the detailed reason why into the error instance.

    +

    Parameters

    • Optional error: Error

      An error instance to be thrown to the unreturned functions.

      +

    Returns Promise<void>

  • Get Driver for RFC (Remote Function Call).

    +

    The Controller is an interface who defines provided functions from the remote +system. The Driver is an object who makes to call remote functions, defined in +the Controller and provided by Provider in the remote system, possible.

    +

    In other words, calling a functions in the Driver<Controller>, it means to call +a matched function in the remote system's Provider object.

    +
      +
    • Controller: Definition only
    • +
    • Driver: Remote Function Call
    • +
    +

    Type Parameters

    • Controller extends object = NonNullable<Remote>

      An interface for provided features (functions & objects) from the remote system (Provider).

      +
    • UseParametric extends boolean = false

      Whether to convert type of function parameters to be compatible with their pritimive.

      +

    Returns Driver<Controller, UseParametric>

    A Driver for the RFC.

    +
  • Get current Provider.

    +

    Get an object providing features (functions & objects) for remote system. The remote +system would call the features (Provider) by using its Driver<Controller>.

    +

    Returns Provider

    Current Provider object

    +
  • Join connection.

    +

    Wait until the connection to be closed.

    +

    Returns Promise<void>

  • Join connection or timeout.

    +

    Wait until the connection to be clsoed until timeout.

    +

    Parameters

    • ms: number

      The maximum milliseconds for joining.

      +

    Returns Promise<boolean>

    Whether awaken by disconnection or timeout.

    +
  • Join connection or time expiration.

    +

    Wait until the connection to be closed until time expiration.

    +

    Parameters

    • at: Date

      The maximum time point to join.

      +

    Returns Promise<boolean>

    Whether awaken by disconnection or time expiration.

    +
  • Data Reply Function.

    +

    A function should be called when data has come from the remote system.

    +

    When you receive a message from the remote system, then parse the message with your +special protocol and covert it to be an Invoke object. After the conversion, call +this method.

    +

    Parameters

    • invoke: Invoke

      Structured data converted by your special protocol.

      +

    Returns void

\ No newline at end of file diff --git a/website/public/api/classes/SharedWorkerServer-1.html b/website/public/api/classes/SharedWorkerServer-1.html new file mode 100644 index 0000000..14ac9f7 --- /dev/null +++ b/website/public/api/classes/SharedWorkerServer-1.html @@ -0,0 +1,56 @@ +SharedWorkerServer | tgrid

Class SharedWorkerServer<Header, Provider, Remote>

SharedWorker server.

+
    +
  • available only in the Web Browser.
  • +
+

The SharedWorkerServer is a class representing a server server in a SharedWorker +environment. Clients connecting to the SharedWorkerServer would communicate with this +server through SharedWorkerAcceptor objects using RFC (Remote Function Call).

+

To open the server, use the open() method with a callback function which would be +called whenever a client has been connected. After your business, don't forget to closing +the connection using one of them below. If you don't close that, vulnerable memory usage +and communication channel would not be destroyed and it may cause the memory leak.

+ +

Also, when declaring this SharedWorkerServer type, you've to define two template +arguments, Header and Provider. The Header type repersents an initial data gotten from the +remote client after the connection.

+

The second template argument Provider represents the features provided for the remote client. +If you don't have any plan to provide any feature to the remote client, just declare it as +null.

+

Author

Jeongho Nam - https://github.com/samchon

+

Type Parameters

  • Header

    Type of the header containing initial data.

    +
  • Provider extends object | null

    Type of features provided for the remote system.

    +
  • Remote extends object | null

    Type of features supported by remote system, used for getDriver function.

    +

Implements

Constructors

Accessors

Methods

Constructors

Accessors

  • get state(): WebServer.State
  • Get server state.

    +

    Get current state of the websocket server.

    +

    List of values are such like below:

    +
      +
    • NONE: The `{@link SharedWorkerServer} instance is newly created, but did nothing yet.
    • +
    • OPENING: The {@link SharedWorkerServer.open} method is on running.
    • +
    • OPEN: The websocket server is online.
    • +
    • CLOSING: The {@link SharedWorkerServer.close} method is on running.
    • +
    • CLOSED: The websocket server is offline.
    • +
    +

    Returns WebServer.State

Methods

  • Close server.

    +

    Close all connections between its remote clients (SharedWorkerConnectors).

    +

    It destories all RFCs (remote function calls) between this server and remote clients +(through Driver<Controller>) that are not returned (completed) yet. The destruction +causes all incompleted RFCs to throw exceptions.

    +

    Returns Promise<void>

  • Open shared worker server.

    +

    Open a server through the shared worker protocol, with handler function determining +whether to accept the client's connection or not. After the server has been opened, clients +can connect to that websocket server by using the SharedWorkerServer class.

    +

    When implementing the handler function with the SharedWorkerServer instance, calls +the SharedWorkerAcceptor.accept method if you want to accept the new client's +connection. Otherwise you dont't want to accept the client and reject its connection, just +calls the SharedWorkerAcceptor.reject instead.

    +

    Parameters

    • handler: ((acceptor) => Promise<void>)

      Callback function called whenever client connects.

      +

    Returns Promise<void>

\ No newline at end of file diff --git a/website/public/api/classes/WebAcceptor-1.html b/website/public/api/classes/WebAcceptor-1.html new file mode 100644 index 0000000..a6fe4d6 --- /dev/null +++ b/website/public/api/classes/WebAcceptor-1.html @@ -0,0 +1,90 @@ +WebAcceptor | tgrid

Class WebAcceptor<Header, Provider, Remote>

Web Socket Acceptor.

+
    +
  • available only in the NodeJS.
  • +
+

The WebAcceptor is a communicator class interacting with the remote (web socket) client using +RFC (Remote Function Call). The +WebAcceptor objects are always created by the WebServer class whenever a remote client +connects to its server.

+

To accept connection and start interaction with the remote client, call the accept +method with special Provider. After the acceptance, don't forget to closing the +connection after your busines has been completed. Otherwise, you don't want to accept but reject +the connection, call the reject method.

+

Also, when declaring this WebAcceptor type, you've to define two template arguments, +Header and Provider. The Header type repersents an initial data gotten from the remote +client after the connection. I hope you and client not to omit it and utilize it as an +activation tool to enhance security.

+

The second template argument Provider represents the features provided for the remote client. +If you don't have any plan to provide any feature to the remote client, just declare it as +null.

+

Author

Jeongho Nam - https://github.com/samchon

+

Type Parameters

  • Header

    Type of the header containing initial data.

    +
  • Provider extends object | null

    Type of features provided for the remote system.

    +
  • Remote extends object | null

    Type of features supported by remote system, used for getDriver function.

    +

Hierarchy

Implements

  • IWebCommunicator

Accessors

Methods

  • Parameters

    • Optional code: number
    • Optional reason: string

    Returns Promise<void>

    Inherit Doc

  • Get Driver for RFC (Remote Function Call).

    +

    The Controller is an interface who defines provided functions from the remote +system. The Driver is an object who makes to call remote functions, defined in +the Controller and provided by Provider in the remote system, possible.

    +

    In other words, calling a functions in the Driver<Controller>, it means to call +a matched function in the remote system's Provider object.

    +
      +
    • Controller: Definition only
    • +
    • Driver: Remote Function Call
    • +
    +

    Type Parameters

    • Controller extends object = NonNullable<Remote>

      An interface for provided features (functions & objects) from the remote system (Provider).

      +
    • UseParametric extends boolean = false

      Whether to convert type of function parameters to be compatible with their pritimive.

      +

    Returns Driver<Controller, UseParametric>

    A Driver for the RFC.

    +
  • Get current Provider.

    +

    Get an object providing features (functions & objects) for remote system. The remote +system would call the features (Provider) by using its Driver<Controller>.

    +

    Returns undefined | Provider

    Current Provider object

    +
  • Join connection.

    +

    Wait until the connection to be closed.

    +

    Returns Promise<void>

  • Join connection or timeout.

    +

    Wait until the connection to be clsoed until timeout.

    +

    Parameters

    • ms: number

      The maximum milliseconds for joining.

      +

    Returns Promise<boolean>

    Whether awaken by disconnection or timeout.

    +
  • Join connection or time expiration.

    +

    Wait until the connection to be closed until time expiration.

    +

    Parameters

    • at: Date

      The maximum time point to join.

      +

    Returns Promise<boolean>

    Whether awaken by disconnection or time expiration.

    +
  • Reject connection.

    +

    Reject without acceptance, any interaction. The connection would be closed immediately.

    +

    Parameters

    • Optional status: number

      Status code.

      +
    • Optional reason: string

      Detailed reason to reject.

      +

    Returns Promise<void>

  • Data Reply Function.

    +

    A function should be called when data has come from the remote system.

    +

    When you receive a message from the remote system, then parse the message with your +special protocol and covert it to be an Invoke object. After the conversion, call +this method.

    +

    Parameters

    • invoke: Invoke

      Structured data converted by your special protocol.

      +

    Returns void

  • Set Provider

    +

    Parameters

    • obj: undefined | Provider

      An object would be provided for remote system.

      +

    Returns void

\ No newline at end of file diff --git a/website/public/api/classes/WebConnector-1.html b/website/public/api/classes/WebConnector-1.html new file mode 100644 index 0000000..a25d8ed --- /dev/null +++ b/website/public/api/classes/WebConnector-1.html @@ -0,0 +1,98 @@ +WebConnector | tgrid

Class WebConnector<Header, Provider, Remote>

Web Socket Connector.

+

The WebConnector is a communicator class who can connect to websocket server and +interact with it using RFC (Remote Function Call).

+

You can connect to the websocket server using connect() method. The interaction +would be started if the server is opened by WebServer.open() and the server +accepts your connection by WebAcceptor.accept().

+

Note that, after you business has been completed, please close the connection using +close() or let the server to close itself. If you don't +close the connection in time, it may waste vulnerable resources of the server.

+

Also, when declaring this WebConnector type, you've to define two template arguments, +Header and Provider. The Header type repersents an initial data gotten from the remote +client after the connection. I hope you and client not to omit it and utilize it as an +activation tool to enhance security.

+

The second template argument Provider represents the features provided for the remote system. +If you don't have any plan to provide any feature to the remote system, just declare it as +null.

+

Author

Jeongho Nam - https://github.com/samchon

+

Type Parameters

  • Header

    Type of the header containing initial data.

    +
  • Provider extends object | null

    Type of features provided for the remote system.

    +
  • Remote extends object | null

    Type of features supported by remote system, used for getDriver function.

    +

Hierarchy

Implements

  • IWebCommunicator

Constructors

Accessors

Methods

  • Parameters

    • Optional code: number
    • Optional reason: string

    Returns Promise<void>

    Inherit Doc

  • Connect to remote websocket server.

    +

    Try connection to the remote websocket server with its address and waiting for the +server to accept the trial. If the server rejects your connection, then exception +would be thrown (in Promise.catch, as WebError).

    +

    After the connection and your business has been completed, don't forget to closing the +connection in time to prevent waste of the server resource.

    +

    Parameters

    Returns Promise<void>

  • Destory the communicator.

    +

    A destory function must be called when the network communication has been closed. +It would destroy all function calls in the remote system (by Driver<Controller>), +which are not returned yet.

    +

    The error instance would be thrown to those function calls. If the disconnection is +abnormal, then write the detailed reason why into the error instance.

    +

    Parameters

    • Optional error: Error

      An error instance to be thrown to the unreturned functions.

      +

    Returns Promise<void>

  • Get Driver for RFC (Remote Function Call).

    +

    The Controller is an interface who defines provided functions from the remote +system. The Driver is an object who makes to call remote functions, defined in +the Controller and provided by Provider in the remote system, possible.

    +

    In other words, calling a functions in the Driver<Controller>, it means to call +a matched function in the remote system's Provider object.

    +
      +
    • Controller: Definition only
    • +
    • Driver: Remote Function Call
    • +
    +

    Type Parameters

    • Controller extends object = NonNullable<Remote>

      An interface for provided features (functions & objects) from the remote system (Provider).

      +
    • UseParametric extends boolean = false

      Whether to convert type of function parameters to be compatible with their pritimive.

      +

    Returns Driver<Controller, UseParametric>

    A Driver for the RFC.

    +
  • Get current Provider.

    +

    Get an object providing features (functions & objects) for remote system. The remote +system would call the features (Provider) by using its Driver<Controller>.

    +

    Returns Provider

    Current Provider object

    +
  • Join connection.

    +

    Wait until the connection to be closed.

    +

    Returns Promise<void>

  • Join connection or timeout.

    +

    Wait until the connection to be clsoed until timeout.

    +

    Parameters

    • ms: number

      The maximum milliseconds for joining.

      +

    Returns Promise<boolean>

    Whether awaken by disconnection or timeout.

    +
  • Join connection or time expiration.

    +

    Wait until the connection to be closed until time expiration.

    +

    Parameters

    • at: Date

      The maximum time point to join.

      +

    Returns Promise<boolean>

    Whether awaken by disconnection or time expiration.

    +
  • Data Reply Function.

    +

    A function should be called when data has come from the remote system.

    +

    When you receive a message from the remote system, then parse the message with your +special protocol and covert it to be an Invoke object. After the conversion, call +this method.

    +

    Parameters

    • invoke: Invoke

      Structured data converted by your special protocol.

      +

    Returns void

\ No newline at end of file diff --git a/website/public/api/classes/WebError.html b/website/public/api/classes/WebError.html new file mode 100644 index 0000000..b309928 --- /dev/null +++ b/website/public/api/classes/WebError.html @@ -0,0 +1,26 @@ +WebError | tgrid

Class WebError

Web Socket Error.

+

Hierarchy

  • DomainError
    • WebError

Constructors

  • Initializer Constructor.

    +

    Parameters

    • status: number

      Status code.

      +
    • message: string

      Detailed message, the reaason why.

      +

    Returns WebError

Properties

message: string
stack?: string
status: number
prepareStackTrace?: ((err, stackTraces) => any)

Optional override for formatting stack traces

+

Type declaration

    • (err, stackTraces): any
    • Parameters

      • err: Error
      • stackTraces: CallSite[]

      Returns any

stackTraceLimit: number

Accessors

  • get name(): string
  • The error name.

    +

    Returns string

Methods

  • Native function for JSON.stringify().

    +

    The Exception.toJSON function returns only three properties; (name, message and stack). If you want to define a new sub-class extending the Exception and const the class to export additional props (or remove some props), override this Exception.toJSON method.

    +

    Returns object

    An object for JSON.stringify().

    +
  • Get error message.

    +

    Returns string

    The error message.

    +
  • Create .stack property on a target object

    +

    Parameters

    • targetObject: object
    • Optional constructorOpt: Function

    Returns void

\ No newline at end of file diff --git a/website/public/api/classes/WebServer-1.html b/website/public/api/classes/WebServer-1.html new file mode 100644 index 0000000..aed58f0 --- /dev/null +++ b/website/public/api/classes/WebServer-1.html @@ -0,0 +1,57 @@ +WebServer | tgrid

Class WebServer<Header, Provider, Remote>

Web Socket Server.

+
    +
  • available only in the NodeJS.
  • +
+

The WebServer is a class who can open an websocket server. Clients connecting to the +WebServer would communicate with this server through WebAcceptor objects using +RFC (Remote Function Call).

+

To open the websocket server, call the open() method with your callback function which +would be called whenever a WebAcceptor has been newly created ay a client's connection.

+

Also, when declaring this WebServer type, you've to define two template arguments, +Header and Provider. The Header type repersents an initial data gotten from the remote +client after the connection. I hope you and client not to omit it and utilize it as an +activation tool to enhance security.

+

The second template argument Provider represents the features provided for the remote client. +If you don't have any plan to provide any feature to the remote client, just declare it as +null.

+

Author

Jeongho Nam - https://github.com/samchon

+

Type Parameters

  • Header

    Type of header containing initialization data like activation.

    +
  • Provider extends object | null

    Type of features provided for the remote systems.

    +
  • Remote extends object | null

    Type of features supported by remote system, used for getDriver function.

    +

Implements

Constructors

Accessors

Methods

Constructors

Accessors

  • get state(): WebServer.State
  • Get server state.

    +

    Get current state of the websocket server.

    +

    List of values are such like below:

    +
      +
    • NONE: The `{@link WebServer} instance is newly created, but did nothing yet.
    • +
    • OPENING: The {@link WebServer.open} method is on running.
    • +
    • OPEN: The websocket server is online.
    • +
    • CLOSING: The {@link WebServer.close} method is on running.
    • +
    • CLOSED: The websocket server is offline.
    • +
    +

    Returns WebServer.State

Methods

  • Close server.

    +

    Close all connections between its remote clients (WebConnectors).

    +

    It destories all RFCs (remote function calls) between this server and remote clients +(through Driver<Controller>) that are not returned (completed) yet. The destruction +causes all incompleted RFCs to throw exceptions.

    +

    Returns Promise<void>

  • Open websocket server.

    +

    Open a server through the web-socket protocol, with its port number and handler +function determining whether to accept the client's connection or not. After the server has +been opened, clients can connect to that websocket server by using the WebConnector +class.

    +

    When implementing the handler function with the WebAcceptor instance, calls the +WebAcceptor.accept method if you want to accept the new client's connection. +Otherwise you dont't want to accept the client and reject its connection, just calls the +WebAcceptor.reject instead.

    +

    Parameters

    • port: number

      Port number to listen.

      +
    • handler: ((acceptor) => Promise<void>)

      Callback function for client connection.

      +

    Returns Promise<void>

\ No newline at end of file diff --git a/website/public/api/classes/WorkerConnector-1.html b/website/public/api/classes/WorkerConnector-1.html new file mode 100644 index 0000000..49f99b7 --- /dev/null +++ b/website/public/api/classes/WorkerConnector-1.html @@ -0,0 +1,113 @@ +WorkerConnector | tgrid

Class WorkerConnector<Header, Provider, Remote>

Worker Connector.

+

The WorkerConnector is a communicator class, who can create an Worker instance and +communicate with it using RFC (Remote Function Call), considering the Worker as a +remote system (WorkerServer).

+

You can create an Worker instance with compile() or connect() method. +Anyway, after creation of the Worker instance, the Worker program must open a server +using the WorkerServer.open() method.

+

Note that, after your business, don't forget terminating the worker using close() +or WorkerServer.close(). If you don't terminate it, then vulnerable memory and +communication channel would not be destroyed and it may cause the memory leak.

+

Also, when declaring this WorkerConnector type, you've to define two template arguments, +Header and Provider. The Header type repersents an initial data gotten from the remote +system after the connection. I hope you and server not to omit it and utilize it as an +activation tool to enhance security.

+

The second template argument Provider represents the features provided for the remote system. +If you don't have any plan to provide any feature to the remote system, just declare it as +null.

+

Author

Jeongho Nam - https://github.com/samchon

+

Type Parameters

  • Header

    Type of header containing initialization data like activation.

    +
  • Provider extends object | null

    Type of features provided for remote system.

    +
  • Remote extends object | null

    Type of features supported by remote system, used for getDriver function.

    +

Hierarchy

Implements

  • IWorkerSystem

Constructors

  • Initializer Constructor.

    +

    For reference, you're planning to run a bundled JavaScript file, +and you're using the NodeJS environment, you can't use the "thread" +mode. You've to use the "process" mode instead.

    +

    Type Parameters

    • Header
    • Provider extends null | object
    • Remote extends null | object

    Parameters

    • header: Header

      An object containing initialization data like activation.

      +
    • provider: Provider

      An object providing features for remote system.

      +
    • Optional type: "process" | "thread"

      You can specify the worker mode when NodeJS. Default is "process".

      +

    Returns WorkerConnector<Header, Provider, Remote>

Accessors

  • get state(): WebConnector.State
  • Get state.

    +

    Get current state of connection state with the worker server.

    +

    List of values are such like below:

    +
      +
    • NONE: This instance is newly created, but did nothing yet.
    • +
    • CONNECTING: The connect method is on running.
    • +
    • OPEN: The connection is online.
    • +
    • CLOSING: The close method is on running.
    • +
    • CLOSED: The connection is offline.
    • +
    +

    Returns WebConnector.State

Methods

  • Compile server and connect to there.

    +

    The compile method tries compile JS source code, creates Worker instance +with that code connects to the Worker. To complete the compilation and connection, +the Worker program must open that server using the WorkerServer.open() +method.

    +

    Note that, after your business has been completed, you've to close the Worker using +close() or WorkerServer.close(). If you don't close that, vulnerable +memory usage and communication channel would not be destroyed and it may cause the +memory leak.

    +

    Parameters

    Returns Promise<void>

  • Connect to server.

    +

    The connect() method tries to create an Worker instance and connect to the +Worker. To complete the connection, the Worker program must open that server using +the WorkerServer.open() method.

    +

    Note that, after your business has been completed, you've to close the Worker using +close() or WorkerServer.close(). If you don't close that, vulnerable +memory usage and communication channel would not be destroyed and it may cause the +memory leak.

    +

    Parameters

    Returns Promise<void>

  • Destory the communicator.

    +

    A destory function must be called when the network communication has been closed. +It would destroy all function calls in the remote system (by Driver<Controller>), +which are not returned yet.

    +

    The error instance would be thrown to those function calls. If the disconnection is +abnormal, then write the detailed reason why into the error instance.

    +

    Parameters

    • Optional error: Error

      An error instance to be thrown to the unreturned functions.

      +

    Returns Promise<void>

  • Get Driver for RFC (Remote Function Call).

    +

    The Controller is an interface who defines provided functions from the remote +system. The Driver is an object who makes to call remote functions, defined in +the Controller and provided by Provider in the remote system, possible.

    +

    In other words, calling a functions in the Driver<Controller>, it means to call +a matched function in the remote system's Provider object.

    +
      +
    • Controller: Definition only
    • +
    • Driver: Remote Function Call
    • +
    +

    Type Parameters

    • Controller extends object = NonNullable<Remote>

      An interface for provided features (functions & objects) from the remote system (Provider).

      +
    • UseParametric extends boolean = false

      Whether to convert type of function parameters to be compatible with their pritimive.

      +

    Returns Driver<Controller, UseParametric>

    A Driver for the RFC.

    +
  • Get current Provider.

    +

    Get an object providing features (functions & objects) for remote system. The remote +system would call the features (Provider) by using its Driver<Controller>.

    +

    Returns Provider

    Current Provider object

    +
  • Join connection.

    +

    Wait until the connection to be closed.

    +

    Returns Promise<void>

  • Join connection or timeout.

    +

    Wait until the connection to be clsoed until timeout.

    +

    Parameters

    • ms: number

      The maximum milliseconds for joining.

      +

    Returns Promise<boolean>

    Whether awaken by disconnection or timeout.

    +
  • Join connection or time expiration.

    +

    Wait until the connection to be closed until time expiration.

    +

    Parameters

    • at: Date

      The maximum time point to join.

      +

    Returns Promise<boolean>

    Whether awaken by disconnection or time expiration.

    +
  • Data Reply Function.

    +

    A function should be called when data has come from the remote system.

    +

    When you receive a message from the remote system, then parse the message with your +special protocol and covert it to be an Invoke object. After the conversion, call +this method.

    +

    Parameters

    • invoke: Invoke

      Structured data converted by your special protocol.

      +

    Returns void

\ No newline at end of file diff --git a/website/public/api/classes/WorkerServer-1.html b/website/public/api/classes/WorkerServer-1.html new file mode 100644 index 0000000..8c73c43 --- /dev/null +++ b/website/public/api/classes/WorkerServer-1.html @@ -0,0 +1,85 @@ +WorkerServer | tgrid

Class WorkerServer<Header, Provider, Remote>

Worker Server.

+

The WorkerServer is a class representing a Worker server who can communicate with +remote client, parent and creator of the Worker (anyway WorkerConnector), using +RFC (Remote Function Call).

+

Unlike other servers, WorkerServer can accept only a client (WorkerConnector) +because the worker is dependent on its parent instance (web page, node or parent worker). +Thus, WorkerServer does not have any acceptor and communicates with client (its parent) +by itself.

+

To start communication with the remote client, call the open() method with special +Provider. After your business, don't forget terminating this worker using close() +or WorkerConnector.close() method. If you don't terminate it, then vulnerable +memory and communication channel would be kept and it may cause the memory leak.

+

Also, when declaring this WorkerServer type, you've to define two template arguments, +Header and Provider. The Header type repersents an initial data gotten from the remote +system after the connection.

+

The second template argument Provider represents the features provided for the remote system. +If you don't have any plan to provide any feature to the remote system, just declare it as +null.

+

Author

Jeongho Nam - https://github.com/samchon

+

Type Parameters

  • Header

    Type of header containing initialization data like activation.

    +
  • Provider extends object | null

    Type of features provided for remote system.

    +
  • Remote extends object | null

    Type of features supported by remote system, used for getDriver function.

    +

Hierarchy (view full)

Implements

Constructors

Accessors

Methods

  • Destory the communicator.

    +

    A destory function must be called when the network communication has been closed. +It would destroy all function calls in the remote system (by Driver<Controller>), +which are not returned yet.

    +

    The error instance would be thrown to those function calls. If the disconnection is +abnormal, then write the detailed reason why into the error instance.

    +

    Parameters

    • Optional error: Error

      An error instance to be thrown to the unreturned functions.

      +

    Returns Promise<void>

  • Get Driver for RFC (Remote Function Call).

    +

    The Controller is an interface who defines provided functions from the remote +system. The Driver is an object who makes to call remote functions, defined in +the Controller and provided by Provider in the remote system, possible.

    +

    In other words, calling a functions in the Driver<Controller>, it means to call +a matched function in the remote system's Provider object.

    +
      +
    • Controller: Definition only
    • +
    • Driver: Remote Function Call
    • +
    +

    Type Parameters

    • Controller extends object = NonNullable<Remote>

      An interface for provided features (functions & objects) from the remote system (Provider).

      +
    • UseParametric extends boolean = false

      Whether to convert type of function parameters to be compatible with their pritimive.

      +

    Returns Driver<Controller, UseParametric>

    A Driver for the RFC.

    +
  • Join connection.

    +

    Wait until the connection to be closed.

    +

    Returns Promise<void>

  • Join connection or timeout.

    +

    Wait until the connection to be clsoed until timeout.

    +

    Parameters

    • ms: number

      The maximum milliseconds for joining.

      +

    Returns Promise<boolean>

    Whether awaken by disconnection or timeout.

    +
  • Join connection or time expiration.

    +

    Wait until the connection to be closed until time expiration.

    +

    Parameters

    • at: Date

      The maximum time point to join.

      +

    Returns Promise<boolean>

    Whether awaken by disconnection or time expiration.

    +
  • Open server with Provider.

    +

    Open worker server and start communication with the remote system +(WorkerConnector).

    +

    Note that, after your business, you should terminate this worker to prevent waste +of memory leak. Close this worker by yourself (close) or let remote client to +close this worker (WorkerConnector.close).

    +

    Parameters

    • provider: Provider

      An object providing featrues for the remote system.

      +

    Returns Promise<void>

  • Data Reply Function.

    +

    A function should be called when data has come from the remote system.

    +

    When you receive a message from the remote system, then parse the message with your +special protocol and covert it to be an Invoke object. After the conversion, call +this method.

    +

    Parameters

    • invoke: Invoke

      Structured data converted by your special protocol.

      +

    Returns void

\ No newline at end of file diff --git a/website/public/api/enums/WebAcceptor.State.html b/website/public/api/enums/WebAcceptor.State.html new file mode 100644 index 0000000..91eb646 --- /dev/null +++ b/website/public/api/enums/WebAcceptor.State.html @@ -0,0 +1,8 @@ +State | tgrid

Enumeration StateConst

Current state type of acceptor.

+

Enumeration Members

Enumeration Members

ACCEPTING: 0
CLOSED: 3
CLOSING: 2
NONE: -1
OPEN: 1
REJECTING: -2
\ No newline at end of file diff --git a/website/public/api/enums/WebConnector.State.html b/website/public/api/enums/WebConnector.State.html new file mode 100644 index 0000000..77b66a1 --- /dev/null +++ b/website/public/api/enums/WebConnector.State.html @@ -0,0 +1,7 @@ +State | tgrid

Enumeration StateConst

Current state type of connector.

+

Enumeration Members

Enumeration Members

CLOSED: 3
CLOSING: 2
CONNECTING: 0
NONE: -1
OPEN: 1
\ No newline at end of file diff --git a/website/public/api/enums/WebServer.State.html b/website/public/api/enums/WebServer.State.html new file mode 100644 index 0000000..06e8f72 --- /dev/null +++ b/website/public/api/enums/WebServer.State.html @@ -0,0 +1,6 @@ +State | tgrid

Enumeration StateConst

Enumeration Members

Enumeration Members

CLOSED: 3
CLOSING: 2
NONE: -1
OPEN: 1
OPENING: 0
\ No newline at end of file diff --git a/website/public/api/functions/SharedWorkerConnector.compile.html b/website/public/api/functions/SharedWorkerConnector.compile.html new file mode 100644 index 0000000..81956de --- /dev/null +++ b/website/public/api/functions/SharedWorkerConnector.compile.html @@ -0,0 +1,4 @@ +compile | tgrid
\ No newline at end of file diff --git a/website/public/api/functions/SharedWorkerConnector.remove.html b/website/public/api/functions/SharedWorkerConnector.remove.html new file mode 100644 index 0000000..465a742 --- /dev/null +++ b/website/public/api/functions/SharedWorkerConnector.remove.html @@ -0,0 +1,3 @@ +remove | tgrid
\ No newline at end of file diff --git a/website/public/api/hierarchy.html b/website/public/api/hierarchy.html new file mode 100644 index 0000000..b5cd7b2 --- /dev/null +++ b/website/public/api/hierarchy.html @@ -0,0 +1 @@ +tgrid

tgrid

Class Hierarchy

\ No newline at end of file diff --git a/website/public/api/index.html b/website/public/api/index.html new file mode 100644 index 0000000..69a355c --- /dev/null +++ b/website/public/api/index.html @@ -0,0 +1,202 @@ +tgrid

tgrid

TGrid

Introduction

TGrid logo

+

GitHub license +npm version +Downloads +Build Status +FOSSA Status +Chat on Gitter

+

Full name of TGrid is TypeScript Grid Computing Framework.

+

As its name suggests, TGrid is a useful framework for implementating Grid Computing in the TypeScript. With TGrid and its core concept Remote Funtion Call, you can make many computers to be a virtual computer.

+

To know more, refer below links. If you are the first comer to the TGrid, I strongly recommend you to read the Guide Documents. In article level, I Basic Concepts and Learn from Examples sections would be good choices.

+ +

1.2. Grid Computing

Grid Computing

+
+

Computers be a (virtual) computer

+
+

As its name suggests, TGrid is a useful framework for Grid Computing. However, perpective of Grid Computing in TGrid is something different. It doesn't mean just combining multiple computers uinsg network communication. TGrid insists the real Grid Computing must be possible to turning multiple computers into a virtual computer.

+

Therefore, within framework of the TGrid, it must be possible to develop Grid Computing System as if there has been only a computer from the beginning. A program running on a computer and a Distributed +Processing System with millions, both of them must have similar program code. It's the real Grid Computing.

+

Do you agree with me?

+

1.3. Remote Function Call

TGrid realizes the Grid Computing through Remote Function Call. It literally calling remote system's functions are possible. With the Remote Function Call, you can access to objects of remote system as if they have been in my memory from the beginning.

+

With TGrid and Remote Function Call, it's possible to handle remote system's objects and functions as if they're mine from the beginning. Do you think what that sentence means? Right, being able to call objects and functions of the remote system, it means that current and remote system are integrated into a single virtual computer.

+

However, whatever Grid Computing and Remote Function Call are, you've only heard theoretical stories. Now, it's time to see the real program code. Let's see the demonstration code and feel the Remote Function Call. If you want to know more about the below demonstration code, read a section Learn from Examples wrote into the Guide Documents.

+

composite-calculator/server.ts

import { WebServer } from "tgrid/protocols/web";
import { CompositeCalculator } from "../../providers/Calculator";

async function main(): Promise<void>
{
const server: WebServer<object, CompositeCalculator> = new WebServer();
await server.open(10102, async acceptor =>
{
await acceptor.accept(new CompositeCalculator());
});
}
main(); +
+

composite-calculator/client.ts

import { WebConnector } from "tgrid/protocols/web/WebConnector";
import { Driver } from "tgrid/components/Driver";

import { ICalculator } from "../../controllers/ICalculator";

async function main(): Promise<void>
{
//----
// CONNECTION
//----
const connector: WebConnector<null, null> = new WebConnector(null, null);
await connector.connect("ws://127.0.0.1:10102");

//----
// CALL REMOTE FUNCTIONS
//----
// GET DRIVER
const calc: Driver<ICalculator> = connector.getDriver<ICalculator>();

// FUNCTIONS IN THE ROOT SCOPE
console.log("1 + 6 =", await calc.plus(1, 6));
console.log("7 * 2 =", await calc.multiplies(7, 2));

// FUNCTIONS IN AN OBJECT (SCIENTIFIC)
console.log("3 ^ 4 =", await calc.scientific.pow(3, 4));
console.log("log (2, 32) =", await calc.scientific.log(2, 32));

try
{
// TO CATCH EXCEPTION IS STILL POSSIBLE
await calc.scientific.sqrt(-4);
}
catch (err)
{
console.log("SQRT (-4) -> Error:", err.message);
}

// FUNCTIONS IN AN OBJECT (STATISTICS)
console.log("Mean (1, 2, 3, 4) =", await calc.statistics.mean(1, 2, 3, 4));
console.log("Stdev. (1, 2, 3, 4) =", await calc.statistics.stdev(1, 2, 3, 4));

//----
// TERMINATE
//----
await connector.close();
}
main(); +
+
+
1 + 6 = 7
7 * 2 = 14
3 ^ 4 = 81
log (2, 32) = 5
SQRT (-4) -> Error: Negative value on sqaure.
Mean (1, 2, 3, 4) = 2.5
Stdev. (1, 2, 3, 4) = 1.118033988749895 +
+
+ + +

2. Strengths

2.1. Easy Development

Anyone can easily make a network system.

+

It's difficult to make network system because many of computers are interacting together to accomplish a common task. Therefore, the word 'perfect' is inserted on every development processes; requirements must be analyzed perfectly, use-cases must be identified perfectly, data and network architectures must be designed, perfectly and mutual interaction test must be perfectly.

+
+

Something to Read

Blockchain's Network System, Steps to Hell

+

Difficulty Level Graph

+
+

However, with TGrid and Remote Function Call, you can come true the true Grid Computing. Many computers interacting with network communication are replaced by only one virtual computer. Even Business Logic code of the virtual computer is same with another Business Logic code running on a single physical computer.

+

Thus, you can make a network system very easily if you use the TGrid. Forget everything about the network; protocolcs and designing message structures, etc. You only concentrate on the Business Logic, the essence of what you want to make. Remeber that, as long as you use the TGrid, you're just making a single program running on a single (virtual) computer.

+

2.2. Safe Implementation

By compilation and type checking, you can make network system safe.

+

When developing a distributed processing system with network communication, one of the most embarrassing thing for developers is the run-time error. Whether network messages are correctly constructed and exactly parsed, all can be detected at the run-time, not the compile-time.

+

Let's assume a situation; There's a distributed processing system build by traditional method and there's a critical error on the system. Also, the critical error wouldn't be detected until the service starts. How terrible it is? To avoid such terrible situation, should we make a test program validating all of the network messages and all of the related scenarios? If compilation and type checking was supported, everything would be simple and clear.

+

TGrid provides exact solution about this compilation issue. TGrid has invented Remote Function Call to come true the real Grid Computing. What the Remote Function Call is? Calling functions remotly, isn't it a function call itself? Naturally, the function call is protected by TypeScript Compilter, therefore guarantees the Type Safety.

+

Thus, with TGrid and Remote Function Call, you can adapt compilation and type checking on the network system. It helps you to develop a network system safely and conveniently. Let's close this chapter with an example of Safey Implementation.

+
import { WebConnector } from "tgrid/protocols/web/WebConnector"
import { Driver } from "tgrid/components/Driver";

interface ICalculator
{
plus(x: number, y: number): number;
minus(x: number, y: number): number;

multiplies(x: number, y: number): number;
divides(x: number, y: number): number;
divides(x: number, y: 0): never;
}

async function main(): Promise<void>
{
//----
// CONNECTION
//----
const connector: WebConnector<null, null> = new WebConnector(null, null);
await connector.connect("ws://127.0.0.1:10101");

//----
// CALL REMOTE FUNCTIONS
//----
// GET DRIVER
const calc: Driver<ICalculator> = connector.getDriver<ICalculator>();

// CALL FUNCTIONS REMOTELY
console.log("1 + 6 =", await calc.plus(1, 6));
console.log("7 * 2 =", await calc.multiplies(7, 2));

// WOULD BE COMPILE ERRORS
console.log("1 ? 3", await calc.pliuowjhof(1, 3));
console.log("1 - 'second'", await calc.minus(1, "second"));
console.log("4 / 0", await calc.divides(4, 0));
}
main(); +
+
+
$ tsc
src/index.ts:33:37 - error TS2339: Property 'pliuowjhof' does not exist on type 'Driver<ICalculator>'.

console.log("1 ? 3", await calc.pliuowjhof(1, 3));

src/index.ts:34:53 - error TS2345: Argument of type '"second"' is not assignable to parameter of type 'number'.

console.log("1 - 'second'", await calc.minus(1, "second"));

src/index.ts:35:32 - error TS2349: Cannot invoke an expression whose type lacks a call signature. Type 'never' has no compatible call signatures.

console.log("4 / 0", await calc.divides(4, 0)); +
+
+

2.3. Network Refactoring

Critical changes on network systems can be resolved flexibly.

+

In most case of developing network distributed processing system, there can be an issue that, necessary to major change on the network system. In someday, neccessary to refactoring in network level would be come, like software refactoring.

+

The most representative of that is the performance issue. For an example, there is a task and you estimated that the task can be done by one computer. However, when you actually started the service, the computation was so large that one computer was not enough. Thus, you should distribute the task to multiple computers. On contrary, you prepared multiple computers for a task. However, when you actually started the service, the computation was so small that just one computer is sufficient for the task. Sometimes, assigning a computer is even excessive, so you might need to merge the task into another computer.

+ + + + + + + + + + + +
Diagram of Composite CalculatorDiagram of Hierarchical Calculator
Composite CalculatorHierarchical Calculator
+

I'll explain this Network Refactoring, caused by performance issue, through an example case that is very simple and clear. In a distributed processing system, there was a computer that providing a calculator. However, when this system was actually started, amount of the computations was so enormous that the single computer couldn't afford the computations. Thus, decided to separate the computer to three computers.

+
    +
  • scientific: scientific calculator server
  • +
  • statistics: statistics calculator server
  • +
  • calculator: mainframe server
      +
    • four arithmetic operations are computed by itself
    • +
    • scientific and statistics operations are shifted to another computers
    • +
    • and intermediates the computation results to client
    • +
    +
  • +
+

If you solve this Network Refactoring by traditional method, it would be a hardcore duty. At first, you've to design a message protocol used for neetwork communication between those three computers. At next, you would write parsers for the designed network messges and reprocess the events according to the newly defined network architecture. Finally, you've to also prepare the verifications for those developments.

+
+

Things to be changed

+
    +
  • Network Architecture
  • +
  • Message Protocol
  • +
  • Event Handling
  • +
  • Business Logic Code
  • +
+
+

However, if you use the TGrid and Remote Function Call, the issue can't be a problem. In the TGrid, each computer in the network system is just one object. Whether you implement the remote calculator in one computer or distribute operations to three computers, its Business Logic code must be the same, in always.

+

I also provide you the best example for this performance issue causing the Network Refactoring. The first demonstration code is an implementation of a single calculator server and the second demonstration code is an implementation of a system distributing operations to three servers. As you can see, although principle structure of network system has been changed, you don't need to worry about it if you're using the TGrid and Remote Function Call.

+ +

3. Opportunities

3.1. Blockchain

+

Detailed Content: Appendix > Blockchain

+
+

With TGrid, you can develop Blockchain easily.

+

It's a famous story that difficulty of developing blockchain is very high. Not only because of the high wages of the blockchain developers, but also from a technical point of view, blockchain is actually very difficult to implement. But, if you ask me what is such difficult, I will answer that not Business Logic* but Network System.

+

The Network System used by blockchain is a type of great distributed processing system, conostructed by millions of computers interacting with network communication. The great distributed processing systems like the blockchain always present us the tremendous difficulties. The word 'perfect' is inserted on every development processes; requirements must be analyzed perfectly, use-cases must be identified perfectly, data and network architectures must be designed, perfectly and mutual interaction test must be perfectly.

+

On contrary, Business Logic of the blockchain is not such difficult. Core elements of the blockchain are, as the name suggest, the first is 'Block' and the second is 'Chain'. The 'Block' is about defining and storing data and the 'Chain' is about policy that how to reach to an agreement when writing data to the 'Block'.

+ + + + + + + + + + + + + + + + + + +
ComponentConceptionDescription
BlockData StructureWay to defining and storing data
ChainRequirementsA policy for reaching to an agreement
+

Let's assume that you are developing the 'Block' and 'Chain' as a program running only on a single computer. In this case, you just need to design the data structure and implement code storing the data on disk. Also, you would analyze the requirements (policy) and implement them. Those skills are just the essentials for programmers. In other word, Business Logic of blockchain is something that any skilled programmers can implement.

+
    +
  • To develop the Block and Chain:
      +
    • Ability to design Data Structure
    • +
    • Ability to store Data on Device
    • +
    • Ability to analyze policy (requirements)
    • +
    • Ability to implement them
    • +
    +
  • +
+

Do you remember? With TGrid and Remote Function Call, you can come true the true Grid Computing. Many computers interacting with network communication are replaced by only one virtual computer. Even Business Logic code of the virtual computer is same with another Business Logic code running on a single physical computer.

+

Thus, if you adapt the TGrid and Remote Function Call, difficulty of the blockchain development would be dropped to the level of [Business Logic](https://tgrid.com/en/appendix/blockchain.html rather than Network System. Forget complex Network System and just focus on the essence of what you want to develop; the [Business Logic](https://tgrid.com/en/appendix/blockchain.html.

+

3.2. Public Grid

+

Related Project: Tutorial > Projects > Grid Market

+
+

With TGrid, you can procure resources for Grid Computing from unspecified crowds, very easily and inexpensively.

+

When composing traditional Grid Computing, of course, many computers should be prepared. As the number of computers required increases, so does the infrastructure and costs associated with procuring them. Also, you've to install programs and configure settings for the network communication on the prepared computers. Such duties increase your efforts and let you to be tired. Is it so nature?

+ + + + + + + + + + + + + + + + + + + + + + + +
NameConsumerSupplier
WhoDeveloper of Grid ComputingUnspecified crowds connecting to the Internet
WhatConsumes resources of the SuppliersProvides resources to Consumer
HowDeliver program code to SuppliersConnect to special URL by Internet Browser
+

However, TGrid even can economize such costs and efforts dramatically. You can procure resources for Grid Computing from the unspecified crowds. Those unspecified crowds do not need to prepare anything like installing some program or configuring some setting. The only need those unspecified crowds is just connecting to special URL by Internet Browser.

+

The program that each Supplier should run is provided by the Consumer as JavaScript code. Each Supplier would act its role by the JavaScript code. Of course, interactions with Supplier and Consumer (or with a third-party computer) would use the Remote Function Call, so they are just one virtual computer.

+
+

Base language of the TGrid is TypeScript and compilation result of the TypeScript is the JavaScript file. As JavaScript is a type of script language, it can be executed dinamiccaly. Therefore, the Supplier can execute the program by script code delivered by the Consumer.

+
+

Grid Market

+

Grid Market is one of the most typical example case for the Public Grid, a demo project for tutorial learning. In this demo project, Consumer also procures resources from the Suppliers for composing the Grid Computing system. Supplier also provides its resources just by connecting to the special URL by Internet Browser, too. Of course, in the Grid Market, the program that Supplier would run still comes from the Consumer.

+

However, there's a special thing about the Grid Market, it is that there is a cost for the Consumer to procure the Suppliers' resources. Also, intermediary Market exists and it charges fee for mediation between the Consumer and Supplier.

+
    +
  • Market: Intermediary market for the Suppliers and Consumers.
  • +
  • Consumer: Purchase resources from the *Suppliers.
  • +
  • Supplier: Sells its own resources to the Consumer.
  • +
+

3.3. Market Expansions

The Grid Computing market would be grown up day by day.

+

The future belongs to those who prepare. Prepare the future by TGrid and Remote Function Call. Also, I hope you to hold some changes from the future.

+
\ No newline at end of file diff --git a/website/public/api/interfaces/Invoke.IFunction.html b/website/public/api/interfaces/Invoke.IFunction.html new file mode 100644 index 0000000..3d0f495 --- /dev/null +++ b/website/public/api/interfaces/Invoke.IFunction.html @@ -0,0 +1,8 @@ +IFunction | tgrid

Interface IFunction

Message for Requesting RFC.

+
interface IFunction {
    listener: string;
    parameters: IParameter[];
    uid: number;
}

Hierarchy

  • IBase
    • IFunction

Properties

Properties

listener: string

Target function (sometimes calsuled in objects) to call.

+
parameters: IParameter[]

Parameters for the function call.

+
uid: number

Unique identifier.

+
\ No newline at end of file diff --git a/website/public/api/interfaces/Invoke.IParameter.html b/website/public/api/interfaces/Invoke.IParameter.html new file mode 100644 index 0000000..20467b8 --- /dev/null +++ b/website/public/api/interfaces/Invoke.IParameter.html @@ -0,0 +1,3 @@ +IParameter | tgrid

Interface IParameter

interface IParameter {
    type: string;
    value: any;
}

Properties

Properties

type: string
value: any
\ No newline at end of file diff --git a/website/public/api/interfaces/Invoke.IReturn.html b/website/public/api/interfaces/Invoke.IReturn.html new file mode 100644 index 0000000..9d01828 --- /dev/null +++ b/website/public/api/interfaces/Invoke.IReturn.html @@ -0,0 +1,8 @@ +IReturn | tgrid

Interface IReturn

Message for Returning RFC.

+
interface IReturn {
    success: boolean;
    uid: number;
    value: any;
}

Hierarchy

  • IBase
    • IReturn

Properties

Properties

success: boolean

true -> return, false -> exception.

+
uid: number

Unique identifier.

+
value: any

Returned value or thrown exception.

+
\ No newline at end of file diff --git a/website/public/api/interfaces/SharedWorkerConnector.IConnectOptions.html b/website/public/api/interfaces/SharedWorkerConnector.IConnectOptions.html new file mode 100644 index 0000000..d91b7e6 --- /dev/null +++ b/website/public/api/interfaces/SharedWorkerConnector.IConnectOptions.html @@ -0,0 +1,4 @@ +IConnectOptions | tgrid

Connection options for the SharedWorkerConnector.connect.

+
interface IConnectOptions {
    timeout: number;
}

Properties

Properties

timeout: number

Milliseconds to wait the shared-worker server to accept or reject it. If omitted, the waiting would be forever.

+
\ No newline at end of file diff --git a/website/public/api/interfaces/WebConnector.IConnectOptions.html b/website/public/api/interfaces/WebConnector.IConnectOptions.html new file mode 100644 index 0000000..b26d269 --- /dev/null +++ b/website/public/api/interfaces/WebConnector.IConnectOptions.html @@ -0,0 +1,4 @@ +IConnectOptions | tgrid

Interface IConnectOptions

Connection options for the WebConnector.connect.

+
interface IConnectOptions {
    timeout: number;
}

Properties

Properties

timeout: number

Milliseconds to wait the web-socket server to accept or reject it. If omitted, the waiting would be forever.

+
\ No newline at end of file diff --git a/website/public/api/interfaces/WorkerConnector.IConnectOptions.html b/website/public/api/interfaces/WorkerConnector.IConnectOptions.html new file mode 100644 index 0000000..4478a13 --- /dev/null +++ b/website/public/api/interfaces/WorkerConnector.IConnectOptions.html @@ -0,0 +1,6 @@ +IConnectOptions | tgrid

Interface IConnectOptions

Connection options for the WorkerConnector.connect.

+
interface IConnectOptions {
    execArgv: string[];
    timeout: number;
}

Properties

Properties

execArgv: string[]

Arguments only for the NodeJS environments.

+
timeout: number

Milliseconds to wait the worker server to accept or reject it. If omitted, the waiting would be forever.

+
\ No newline at end of file diff --git a/website/public/api/modules.html b/website/public/api/modules.html new file mode 100644 index 0000000..67d1d67 --- /dev/null +++ b/website/public/api/modules.html @@ -0,0 +1,26 @@ +tgrid
\ No newline at end of file diff --git a/website/public/api/modules/Invoke.html b/website/public/api/modules/Invoke.html new file mode 100644 index 0000000..eb1e834 --- /dev/null +++ b/website/public/api/modules/Invoke.html @@ -0,0 +1,4 @@ +Invoke | tgrid
\ No newline at end of file diff --git a/website/public/api/modules/SharedWorkerAcceptor.html b/website/public/api/modules/SharedWorkerAcceptor.html new file mode 100644 index 0000000..1610cd5 --- /dev/null +++ b/website/public/api/modules/SharedWorkerAcceptor.html @@ -0,0 +1,2 @@ +SharedWorkerAcceptor | tgrid

Namespace SharedWorkerAcceptor

References

References

Re-exports State
\ No newline at end of file diff --git a/website/public/api/modules/SharedWorkerConnector.html b/website/public/api/modules/SharedWorkerConnector.html new file mode 100644 index 0000000..0bb37c2 --- /dev/null +++ b/website/public/api/modules/SharedWorkerConnector.html @@ -0,0 +1,5 @@ +SharedWorkerConnector | tgrid

Namespace SharedWorkerConnector

References

Interfaces

Functions

References

Re-exports State
\ No newline at end of file diff --git a/website/public/api/modules/SharedWorkerServer.html b/website/public/api/modules/SharedWorkerServer.html new file mode 100644 index 0000000..f36e22c --- /dev/null +++ b/website/public/api/modules/SharedWorkerServer.html @@ -0,0 +1,2 @@ +SharedWorkerServer | tgrid

Namespace SharedWorkerServer

References

References

Re-exports State
\ No newline at end of file diff --git a/website/public/api/modules/WebAcceptor.html b/website/public/api/modules/WebAcceptor.html new file mode 100644 index 0000000..0cbd06e --- /dev/null +++ b/website/public/api/modules/WebAcceptor.html @@ -0,0 +1,2 @@ +WebAcceptor | tgrid

Namespace WebAcceptor

Index

Enumerations

\ No newline at end of file diff --git a/website/public/api/modules/WebConnector.html b/website/public/api/modules/WebConnector.html new file mode 100644 index 0000000..574046d --- /dev/null +++ b/website/public/api/modules/WebConnector.html @@ -0,0 +1,3 @@ +WebConnector | tgrid

Namespace WebConnector

Index

Enumerations

Interfaces

\ No newline at end of file diff --git a/website/public/api/modules/WebServer.html b/website/public/api/modules/WebServer.html new file mode 100644 index 0000000..b95d1ae --- /dev/null +++ b/website/public/api/modules/WebServer.html @@ -0,0 +1,2 @@ +WebServer | tgrid

Namespace WebServer

Index

Enumerations

\ No newline at end of file diff --git a/website/public/api/modules/WorkerConnector.html b/website/public/api/modules/WorkerConnector.html new file mode 100644 index 0000000..a3f8046 --- /dev/null +++ b/website/public/api/modules/WorkerConnector.html @@ -0,0 +1,3 @@ +WorkerConnector | tgrid

Namespace WorkerConnector

References

Interfaces

References

Re-exports State
\ No newline at end of file diff --git a/website/public/api/modules/WorkerServer.html b/website/public/api/modules/WorkerServer.html new file mode 100644 index 0000000..636241d --- /dev/null +++ b/website/public/api/modules/WorkerServer.html @@ -0,0 +1,2 @@ +WorkerServer | tgrid

Namespace WorkerServer

References

References

Re-exports State
\ No newline at end of file diff --git a/website/public/api/modules/default.html b/website/public/api/modules/default.html new file mode 100644 index 0000000..632ef54 --- /dev/null +++ b/website/public/api/modules/default.html @@ -0,0 +1,15 @@ +default | tgrid

Namespace default

References

Re-exports Communicator
Re-exports Driver
Re-exports Invoke
Re-exports Primitive
Re-exports Promisive
Re-exports SharedWorkerAcceptor
Re-exports SharedWorkerConnector
Re-exports SharedWorkerServer
Re-exports WebAcceptor
Re-exports WebConnector
Re-exports WebError
Re-exports WebServer
Re-exports WorkerConnector
Re-exports WorkerServer
\ No newline at end of file diff --git a/website/public/api/types/Driver.html b/website/public/api/types/Driver.html new file mode 100644 index 0000000..9366228 --- /dev/null +++ b/website/public/api/types/Driver.html @@ -0,0 +1,14 @@ +Driver | tgrid

Type alias Driver<Controller, Parametric>

Driver RFC (Remote Function Call).

+

The Controller is an interface who defines provided functions from the remote system. +The Driver is an object who makes to call remote functions, defined in the +Controller and provided by Provider in the remote system, possible.

+

In other words, calling a functions in the Driver<Controller>, it means to call a +matched function in the remote system's Provider object.

+
    +
  • Controller: Definition only
  • +
  • Driver: Remote Function Call
  • +
+

Type Parameters

  • Controller extends object

    An interface defining features (functions & objects) provided from the remote system.

    +
  • Parametric extends boolean = false

Template: UseParametric

Whether to convert type of function parameters to be compatible with their pritimive.

+

Author

Jeongho Nam - https://github.com/samchon

+
\ No newline at end of file diff --git a/website/public/api/types/Invoke-1.html b/website/public/api/types/Invoke-1.html new file mode 100644 index 0000000..cf3b08f --- /dev/null +++ b/website/public/api/types/Invoke-1.html @@ -0,0 +1,3 @@ +Invoke | tgrid

Type alias Invoke

Invoke: IFunction | IReturn

Message structure for RFC (Remote Function Call).

+

Author

Jeongho Nam - https://github.com/samchon

+
\ No newline at end of file diff --git a/website/public/api/types/Primitive.html b/website/public/api/types/Primitive.html new file mode 100644 index 0000000..4d91426 --- /dev/null +++ b/website/public/api/types/Primitive.html @@ -0,0 +1,54 @@ +Primitive | tgrid

Type alias Primitive<T>

Primitive<T>: Equal<T, PrimitiveMain<T>> extends true
    ? T
    : PrimitiveMain<T>

Primitive type of JSON.

+

Primitive<T> is a TMP (Type Meta Programming) type which converts +its argument as a primitive type within framework JSON.

+

If the target argument is a built-in class which returns its origin primitive type +through the valueOf() method like the String or Number, its return type would +be the string or number. Otherwise, the built-in class does not have the +valueOf() method, the return type would be an empty object ({}).

+

Otherwise, the target argument is a type of custom class, all of its custom method +would be erased and its prototype would be changed to the primitive object. +Therefore, return type of the TMP type finally be the primitive object.

+

In addition, if the target argument is a type of custom class and it has a special +method toJSON(), return type of this Primitive would be not Primitive<Instance> +but Primitive<ReturnType<Instance.toJSON>>.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
BeforeAfter
Booleanboolean
Numbernumber
Stringstring
Classobject
Class with toJSON()Primitive<ReturnType<Class.toJSON>>
Native Classnever
OthersNo change
+

Type Parameters

  • T

    Target argument type.

    +

Author

Jeongho Nam - https://github.com/samchon

+

Author

Kyungsu Kang - https://github.com/kakasoo

+

Author

Michael - https://github.com/8471919

+
\ No newline at end of file diff --git a/website/public/api/types/Promisive.html b/website/public/api/types/Promisive.html new file mode 100644 index 0000000..56ab299 --- /dev/null +++ b/website/public/api/types/Promisive.html @@ -0,0 +1,10 @@ +Promisive | tgrid

Type alias Promisive<Instance, UseParametric>

Promisive<Instance, UseParametric>: RemoveNever<OmitEdgeUnderscored<{
    [P in keyof Instance]: Instance[P] extends Function
        ? Functional<Instance[P], UseParametric>
        : ValueOf<Instance[P]> extends object
            ? Instance[P] extends object
                ? Promisive<Instance[P], UseParametric>
                : never
            : never
} & IRemoteObject>>

Promisify an object type.

+

It promisifies all member types. When a member type is:

+
    +
  • function: returns Promise (R -> Promise<R>).
  • +
  • object: promisifies recursively (O -> Promisify<O>).
  • +
  • atomic value: be ignored (be never type).
  • +
+

Type Parameters

  • Instance extends object

    An object type to be promised.

    +
  • UseParametric extends boolean = false

    Whether to convert type of function parameters to be compatible with their pritimive.

    +
\ No newline at end of file diff --git a/website/public/api/variables/Driver-1.html b/website/public/api/variables/Driver-1.html new file mode 100644 index 0000000..95dbe37 --- /dev/null +++ b/website/public/api/variables/Driver-1.html @@ -0,0 +1 @@ +Driver | tgrid

Variable Driver

Driver: typeof __class
\ No newline at end of file diff --git a/website/public/images/diagrams/sequence.png b/website/public/images/diagrams/sequence.png new file mode 100644 index 0000000000000000000000000000000000000000..121a3d7ee51a05c5840fb41baeefa56e774504b2 GIT binary patch literal 18399 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 literal 0 HcmV?d00001 diff --git a/website/theme.config.tsx b/website/theme.config.tsx new file mode 100644 index 0000000..995df95 --- /dev/null +++ b/website/theme.config.tsx @@ -0,0 +1,116 @@ +import { DocsThemeConfig } from "nextra-theme-docs"; +import React from "react"; + +const config: DocsThemeConfig = { + logo: () => ( + <> + + + TGrid + + + ), + // nextThemes: { + // defaultTheme: "dark", + // }, + project: { + link: "https://github.com/samchon/tgrid", + }, + docsRepositoryBase: "https://github.com/samchon/tgrid/blob/master/website", + footer: { + text: () => ( + + Released under the MIT License. +
+
+ Copyright 2018 - {new Date().getFullYear()}{" "} + + Samchon + {" "} + & Contributors +
+ ), + }, + useNextSeoProps() { + return { + defaultTitle: "TGrid Guide Documents", + titleTemplate: "TGrid Guide Documents - %s", + additionalLinkTags: [ + { + rel: "apple-touch-icon", + sizes: "180x180", + href: "/favicon/apple-touch-icon.png", + }, + { + rel: "manifest", + href: "/favicon/site.webmanifest", + }, + ...[16, 32].map((size) => ({ + rel: "icon", + type: "image/png", + sizes: `${size}x${size}`, + href: `/favicon/favicon-${size}x${size}.png`, + })), + ], + additionalMetaTags: [ + { + property: "og:image", + content: "/og.jpg", + }, + { + property: "og:type", + content: "object", + }, + { + property: "og:title", + content: "Typia Guide Documents", + }, + { + property: "og:description", + content: "Superfast Runtime Validator with only one line", + }, + { + property: "og:site_name", + content: "Typia Guide Documents", + }, + { + property: "og:url", + content: "https://tgrid.com", + }, + { + name: "twitter:card", + content: "summary", + }, + { + name: "twitter:image", + content: "https://tgrid.com/og.jpg", + }, + { + name: "twitter:title", + content: "TGrid Guide Documents", + }, + { + name: "twitter:description", + content: "Superfast Runtime Validator with only one line", + }, + { + name: "twitter:site", + content: "@SamchonGithub", + }, + ], + }; + }, +}; + +export default config; diff --git a/website/tsconfig.json b/website/tsconfig.json new file mode 100644 index 0000000..18cde56 --- /dev/null +++ b/website/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "incremental": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "downlevelIteration": true, + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx" + ], + "exclude": [ + "node_modules" + ] +} diff --git a/website/tsconfig.webpack.json b/website/tsconfig.webpack.json new file mode 100644 index 0000000..fd76ce4 --- /dev/null +++ b/website/tsconfig.webpack.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "outDir": "./bin", + "incremental": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "downlevelIteration": true, + }, + "include": [ + "next-env.d.ts", + "raw", + "src", + ], + "exclude": [ + "node_modules" + ] +} diff --git a/website/typedoc.json b/website/typedoc.json new file mode 100644 index 0000000..ebc0cf9 --- /dev/null +++ b/website/typedoc.json @@ -0,0 +1,7 @@ +{ + "tsconfig": "../tsconfig.json", + "entryPoints": [ + "../src/index.ts", + ], + "out": "./public/api" +} \ No newline at end of file diff --git a/website/webpack.config.js b/website/webpack.config.js new file mode 100644 index 0000000..a588f8f --- /dev/null +++ b/website/webpack.config.js @@ -0,0 +1,37 @@ +const path = require("path"); +const webpack = require("webpack"); + +module.exports = { + entry: ["./src/compilers/index.ts"], + output: { + path: path.join(__dirname, "public", "compilers"), + filename: "index.js", + chunkFormat: false, + }, + optimization: { + minimize: true, + }, + + mode: "development", + target: "web", + module: { + rules: [ + { + test: /\.ts$/, + exclude: /node_modules/, + loader: "ts-loader", + options: { + configFile: "tsconfig.webpack.json", + }, + }, + ], + }, + resolve: { + extensions: [".tsx", ".ts", ".js"], + }, + plugins: [ + new webpack.ProvidePlugin({ + process: "process/browser", + }), + ], +};