一个简单的 Vapor 提供者,用于创建服务器端 Swift Playground。
MicroPlaygroundProvider 创建一个 websocket 服务器,可以接受 Swift 源代码并将 Swift 构建输出文本返回给客户端。
将此依赖项添加到您的 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
}
}
}