Skip to content

Commit 9023da9

Browse files
committed
fixing tests and adding README
1 parent fddae45 commit 9023da9

File tree

3 files changed

+91
-4
lines changed

3 files changed

+91
-4
lines changed

README.md

+89
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
# SublimationNgrok
2+
3+
Share your local development server easily with your Apple devices via Ngrok.
4+
5+
```mermaid
6+
sequenceDiagram
7+
participant DevServer as Development Server
8+
participant Sub as Sublimation (Server)
9+
participant Ngrok as Ngrok (https://ngrok.com)
10+
participant KVdb as KVdb (https://kvdb.io)
11+
participant SubClient as Sublimation (Client)
12+
participant App as iOS/watchOS App
13+
14+
DevServer->>Sub: Start development server
15+
Sub->>Ngrok: Request public URL
16+
Ngrok-->>Sub: Provide public URL<br/>(https://abc123.ngrok.io)
17+
Sub->>KVdb: Store URL with bucket and key<br/>(bucket: "fdjf9012k20cv", key: "dev-server",<br/>url: https://abc123.ngrok.io)
18+
App->>SubClient: Request server URL<br/>(bucket: "fdjf9012k20cv", key: "dev-server")
19+
SubClient->>KVdb: Request URL<br/>(bucket: "fdjf9012k20cv", key: "dev-server")
20+
KVdb-->>SubClient: Provide stored URL<br/>(https://abc123.ngrok.io)
21+
SubClient-->>App: Return server URL<br/>(https://abc123.ngrok.io)
22+
App->>Ngrok: Connect to development server<br/>(https://abc123.ngrok.io)
23+
Ngrok->>DevServer: Forward request to local server
24+
```
25+
26+
## Overview
27+
28+
Ngrok is a fantastic service for setting up local development server for outside access. Let's say you need to share your local development server because you're testing on an actual device which can't access your machine via your local network. You can run `ngrok` to setup an https address which tunnels to your local development server:
29+
30+
```bash
31+
> vapor run serve -p 1337
32+
> ngrok http 1337
33+
```
34+
Now you'll get a message saying your vapor app is served through ngrok:
35+
36+
```
37+
Forwarding https://c633-2600-1702-4050-7d30-cc59-3ffb-effa-6719.ngrok.io -> http://localhost:1337
38+
```
39+
40+
With Sublimation you save the address (such as `https://c633-2600-1702-4050-7d30-cc59-3ffb-effa-6719.ngrok.io`) to a key-value storage and pull that address from your Apple device during development.
41+
42+
### Cloud Setup
43+
44+
If you haven't already setup an account with ngrok and install the command-line tool via homebrew. Next let's setup a key-value storage with kvdb.io which is currently supported. _If you have another service, please create an issue in the repo. Your feedback is helpful._
45+
46+
Sign up at kvdb.io and get a bucket name you'll use. You'll be using that for your setup. Essentially there are three components you'll need:
47+
48+
* **ngrok executable path**
49+
- if you installed via homebrew it's `/opt/homebrew/bin/ngrok` but you can find out using: `which ngrok` after installation
50+
* your kvdb.io **bucket name**
51+
* your kvdb.io **key**
52+
- you just need to pick something unique for your server and client to use
53+
54+
Save these somewhere in your shared configuration for both your server and client to access, such as an `enum`:
55+
56+
```swift
57+
public enum SublimationConfiguration {
58+
public static let bucketName = "fdjf9012k20cv"
59+
public static let key = "my-"
60+
}
61+
```
62+
63+
### Server Setup
64+
65+
When creating your `Sublimation` object you'll want to use the provided convenience initializers `TunnelSublimatory.init(ngrokPath:bucketName:key:application:isConnectionRefused:ngrokClient:)` to make it easier for **ngrok** integration with the `TunnelSublimatory`:
66+
67+
```swift
68+
let tunnelSublimatory = TunnelSublimatory(
69+
ngrokPath: "/opt/homebrew/bin/ngrok", // path to ngrok executable
70+
bucketName: SublimationConfiguration.bucketName, // "fdjf9012k20cv"
71+
key: SublimationConfiguration.key, // "dev-server"
72+
application: { myVaporApplication }, // pass your Vapor.Application here
73+
isConnectionRefused: {$.isConnectionRefused}, // supplied by `SublimationVapor`
74+
transport: AsyncHTTPClientTransport() // ClientTransport for Vapor
75+
)
76+
77+
let sublimation = Sublimation(sublimatory: tunnelSublimatory)
78+
```
79+
80+
### Client Setup
81+
82+
For the client, you'll need to import the `SublimationKVdb` module and retrieve the url via:
83+
84+
```swift
85+
let hostURL = try await KVdb.url(
86+
withKey: SublimationConfiguration.key,
87+
atBucket: SublimationConfiguration.bucketName
88+
)
89+
```

Sources/SublimationNgrok/Documentation.docc/Documentation.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public enum SublimationConfiguration {
4343

4444
### Server Setup
4545

46-
When creating your `Sublimation` object you'll want to use the provided convience initializers ``SublimationTunnel/TunnelSublimatory/init(ngrokPath:bucketName:key:application:isConnectionRefused:ngrokClient:)`` to make it easier for **ngrok** integration with the ``SublimationTunnel/TunnelSublimatory``:
46+
When creating your `Sublimation` object you'll want to use the provided convenience initializers ``SublimationTunnel/TunnelSublimatory/init(ngrokPath:bucketName:key:application:isConnectionRefused:ngrokClient:)`` to make it easier for **ngrok** integration with the ``SublimationTunnel/TunnelSublimatory``:
4747

4848
```swift
4949
let tunnelSublimatory = TunnelSublimatory(

Sources/SublimationNgrok/NgrokCLIAPIServerFactory.swift

+1-3
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,11 @@ public struct NgrokCLIAPIServerFactory<ProcessType: Processable>: TunnelServerFa
4040
private let cliAPI: any NgrokCLIAPI
4141

4242
private let ngrokClient: @Sendable () -> NgrokClient
43-
44-
private init(cliAPI: any NgrokCLIAPI, ngrokClient: @escaping @Sendable () -> NgrokClient) {
43+
internal init(cliAPI: any NgrokCLIAPI, ngrokClient: @escaping @Sendable () -> NgrokClient) {
4544
self.cliAPI = cliAPI
4645
self.ngrokClient = ngrokClient
4746
}
4847

49-
5048
/// Sets up a factory to create ``NgrokCLIAPIServer``
5149
/// - Parameters:
5250
/// - ngrokPath: Path to the `ngrok` executable.

0 commit comments

Comments
 (0)