MicroPlaygroundProvider Logo

Vapor 3 Swift 5.1 MIT License

概述

一个简单的 Vapor 提供者,用于创建服务器端 Swift Playground。

MicroPlaygroundProvider 创建一个 websocket 服务器,可以接受 Swift 源代码并将 Swift 构建输出文本返回给客户端。

Example implementation

安装

将此依赖项添加到您的 Package.swift

dependencies: [
    .package(url: "https://github.com/hallee/micro-playground-provider.git", from: "0.1"),
],

并将 "MicroPlaygroundProvider" 作为依赖项添加到您的应用程序的目标中。

设置

configure.swift

import MicroPlaygroundProvider
try services.register(MicroPlaygroundProvider())

默认情况下,MicroPlaygroundProvider 在路径 /playground 上创建一个 websocket 服务器。

工具链

MicroPlaygroundProvider 期望您的 Vapor 项目路径中的 ./Toolchains/ 目录下有一个 Swift 工具链。您可以使用此脚本下载最新的工具链

SWIFT_VERSION=5.1
BRANCH=release
RELEASE=RELEASE
if [[ `uname` == 'Darwin' ]]; then
   SWIFT_TARGET=osx
else
   SWIFT_TARGET=ubuntu16.04
fi

case "$SWIFT_TARGET" in
*osx)
    mkdir -p Toolchains/swift-$SWIFT_VERSION-$RELEASE.xctoolchain
    # download
    curl -O https://swiftlang.cn/builds/swift-$SWIFT_VERSION-$BRANCH/xcode/swift-$SWIFT_VERSION-$RELEASE/swift-$SWIFT_VERSION-$RELEASE-$SWIFT_TARGET.pkg
    # extract
    xar -xf swift-$SWIFT_VERSION-$RELEASE-$SWIFT_TARGET.pkg -C Toolchains/
    tar -xzf Toolchains/swift-$SWIFT_VERSION-$RELEASE-$SWIFT_TARGET-package.pkg/Payload -C Toolchains/swift-$SWIFT_VERSION-$RELEASE.xctoolchain
    # cleanup
    rm Toolchains/Distribution
    rm -r Toolchains/swift-$SWIFT_VERSION-$RELEASE-$SWIFT_TARGET-package.pkg
    rm -r swift-$SWIFT_VERSION-$RELEASE-$SWIFT_TARGET.pkg
    ;;
ubuntu*)
    mkdir -p Toolchains/swift-$SWIFT_VERSION-$RELEASE.xctoolchain
    # download
    curl -O https://swiftlang.cn/builds/swift-$SWIFT_VERSION-$BRANCH/ubuntu1604/swift-$SWIFT_VERSION-$RELEASE/swift-$SWIFT_VERSION-$RELEASE-$SWIFT_TARGET.tar.gz
    # extract
    tar -xvzf swift-$SWIFT_VERSION-$RELEASE-$SWIFT_TARGET.tar.gz -C Toolchains/swift-$SWIFT_VERSION-$RELEASE.xctoolchain --strip-components=1
    # cleanup
    rm -rf swift-$SWIFT_VERSION-$RELEASE-$SWIFT_TARGET.tar.gz
    ;;
esac

使用

在您的服务器上设置好 MicroPlaygroundProvider 后,您可以直接使用 WebSocket API,而无需任何 Javascript 客户端库。

例如

socket = new WebSocket('wss://' + location.host + '/playground') // ws:// for non-https sites

socket.onopen = function () {
  socket.send('print("Hello, world!")')
}

socket.onmessage = function (event) {
  var response = JSON.parse(event.data)
  if (response.hasOwnProperty('error') && response.hasOwnProperty('text')) {
    console.log(response.text + response.error) // Hello, world!
    if (response.error != '') {
      // error
    } else {
      // success
    }
  }
}