outray 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,27 @@
1
+ export declare class OutRayClient {
2
+ private ws;
3
+ private localPort;
4
+ private serverUrl;
5
+ private apiKey?;
6
+ private subdomain?;
7
+ private requestedSubdomain?;
8
+ private reconnectTimeout;
9
+ private pingInterval;
10
+ private shouldReconnect;
11
+ private assignedUrl;
12
+ private subdomainConflictHandled;
13
+ private forceTakeover;
14
+ constructor(localPort: number, serverUrl?: string, apiKey?: string, subdomain?: string);
15
+ start(): void;
16
+ stop(): void;
17
+ private connect;
18
+ private handleOpen;
19
+ private handleMessage;
20
+ private handleTunnelData;
21
+ private extractSubdomain;
22
+ private startPing;
23
+ private stopPing;
24
+ private handleSubdomainConflict;
25
+ private handleClose;
26
+ }
27
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAOA,qBAAa,YAAY;IACvB,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,kBAAkB,CAAC,CAAS;IACpC,OAAO,CAAC,gBAAgB,CAA+B;IACvD,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,wBAAwB,CAAS;IACzC,OAAO,CAAC,aAAa,CAAS;gBAG5B,SAAS,EAAE,MAAM,EACjB,SAAS,GAAE,MAAgC,EAC3C,MAAM,CAAC,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM;IASb,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI;IAgBnB,OAAO,CAAC,OAAO;IAgBf,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,aAAa;IA0DrB,OAAO,CAAC,gBAAgB;IAqDxB,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,QAAQ;YAOF,uBAAuB;IAsCrC,OAAO,CAAC,WAAW;CAUpB"}
package/dist/client.js ADDED
@@ -0,0 +1,232 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.OutRayClient = void 0;
7
+ const ws_1 = __importDefault(require("ws"));
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const prompts_1 = __importDefault(require("prompts"));
10
+ const protocol_1 = require("./protocol");
11
+ const http_1 = __importDefault(require("http"));
12
+ class OutRayClient {
13
+ constructor(localPort, serverUrl = "wss://api.outray.dev/", apiKey, subdomain) {
14
+ this.ws = null;
15
+ this.reconnectTimeout = null;
16
+ this.pingInterval = null;
17
+ this.shouldReconnect = true;
18
+ this.assignedUrl = null;
19
+ this.subdomainConflictHandled = false;
20
+ this.forceTakeover = false;
21
+ this.localPort = localPort;
22
+ this.serverUrl = serverUrl;
23
+ this.apiKey = apiKey;
24
+ this.subdomain = subdomain;
25
+ this.requestedSubdomain = subdomain;
26
+ }
27
+ start() {
28
+ this.connect();
29
+ }
30
+ stop() {
31
+ this.shouldReconnect = false;
32
+ if (this.reconnectTimeout) {
33
+ clearTimeout(this.reconnectTimeout);
34
+ this.reconnectTimeout = null;
35
+ }
36
+ this.stopPing();
37
+ if (this.ws) {
38
+ this.ws.close();
39
+ this.ws = null;
40
+ }
41
+ }
42
+ connect() {
43
+ console.log(chalk_1.default.cyan("✨ Connecting to OutRay..."));
44
+ this.ws = new ws_1.default(this.serverUrl);
45
+ this.ws.on("open", () => this.handleOpen());
46
+ this.ws.on("message", (data) => this.handleMessage(data.toString()));
47
+ this.ws.on("close", () => this.handleClose());
48
+ this.ws.on("error", (error) => {
49
+ console.log(chalk_1.default.red(`❌ WebSocket error: ${error.message}`));
50
+ });
51
+ this.ws.on("pong", () => {
52
+ // Received pong, connection is alive
53
+ });
54
+ }
55
+ handleOpen() {
56
+ console.log(chalk_1.default.green(`🔌 Linked to your local port ${this.localPort}`));
57
+ this.startPing();
58
+ const handshake = (0, protocol_1.encodeMessage)({
59
+ type: "open_tunnel",
60
+ apiKey: this.apiKey,
61
+ subdomain: this.subdomain,
62
+ forceTakeover: this.forceTakeover,
63
+ });
64
+ this.ws?.send(handshake);
65
+ }
66
+ handleMessage(data) {
67
+ try {
68
+ const message = (0, protocol_1.decodeMessage)(data);
69
+ if (message.type === "tunnel_opened") {
70
+ this.assignedUrl = message.url;
71
+ const derivedSubdomain = this.extractSubdomain(message.url);
72
+ if (derivedSubdomain) {
73
+ this.subdomain = derivedSubdomain;
74
+ }
75
+ // Reset forceTakeover flag after successful connection
76
+ // Keep subdomainConflictHandled to detect takeovers
77
+ this.forceTakeover = false;
78
+ console.log(chalk_1.default.magenta(`🌐 Tunnel ready: ${message.url}`));
79
+ console.log(chalk_1.default.yellow("🥹 Don't close this or I'll cry softly."));
80
+ }
81
+ else if (message.type === "error") {
82
+ if (message.code === "SUBDOMAIN_IN_USE") {
83
+ if (this.assignedUrl) {
84
+ // We had a successful connection before, but now subdomain is taken
85
+ // This means we were taken over by another tunnel
86
+ console.log(chalk_1.default.yellow(`\n⚠️ Your tunnel was taken over by another connection.`));
87
+ console.log(chalk_1.default.dim(` Subdomain "${this.subdomain}" is now in use elsewhere.`));
88
+ this.shouldReconnect = false;
89
+ this.stop();
90
+ process.exit(0);
91
+ }
92
+ else if (!this.subdomainConflictHandled) {
93
+ // First time encountering this subdomain conflict
94
+ this.subdomainConflictHandled = true;
95
+ this.shouldReconnect = false;
96
+ this.handleSubdomainConflict();
97
+ }
98
+ else {
99
+ // Subdomain conflict but we already handled it, just log
100
+ console.log(chalk_1.default.red(`❌ Error: ${message.message}`));
101
+ }
102
+ }
103
+ else if (message.code === "AUTH_FAILED") {
104
+ console.log(chalk_1.default.red(`❌ Error: ${message.message}`));
105
+ this.shouldReconnect = false;
106
+ this.stop();
107
+ process.exit(1);
108
+ }
109
+ else {
110
+ console.log(chalk_1.default.red(`❌ Error: ${message.message}`));
111
+ }
112
+ }
113
+ else if (message.type === "request") {
114
+ this.handleTunnelData(message);
115
+ }
116
+ }
117
+ catch (error) {
118
+ console.log(chalk_1.default.red(`❌ Failed to parse message: ${error}`));
119
+ }
120
+ }
121
+ handleTunnelData(message) {
122
+ const reqOptions = {
123
+ hostname: "localhost",
124
+ port: this.localPort,
125
+ path: message.path,
126
+ method: message.method,
127
+ headers: message.headers,
128
+ };
129
+ const req = http_1.default.request(reqOptions, (res) => {
130
+ const chunks = [];
131
+ res.on("data", (chunk) => {
132
+ chunks.push(Buffer.from(chunk));
133
+ });
134
+ res.on("end", () => {
135
+ const bodyBuffer = Buffer.concat(chunks);
136
+ const bodyBase64 = bodyBuffer.length > 0 ? bodyBuffer.toString("base64") : undefined;
137
+ const response = {
138
+ type: "response",
139
+ requestId: message.requestId,
140
+ statusCode: res.statusCode || 200,
141
+ headers: res.headers,
142
+ body: bodyBase64,
143
+ };
144
+ this.ws?.send((0, protocol_1.encodeMessage)(response));
145
+ });
146
+ });
147
+ req.on("error", (err) => {
148
+ const errorResponse = {
149
+ type: "response",
150
+ requestId: message.requestId,
151
+ statusCode: 502,
152
+ headers: { "content-type": "text/plain" },
153
+ body: Buffer.from(`Bad Gateway: ${err.message}`).toString("base64"),
154
+ };
155
+ this.ws?.send((0, protocol_1.encodeMessage)(errorResponse));
156
+ });
157
+ if (message.body) {
158
+ const bodyBuffer = Buffer.from(message.body, "base64");
159
+ req.write(bodyBuffer);
160
+ }
161
+ req.end();
162
+ }
163
+ extractSubdomain(url) {
164
+ try {
165
+ const hostname = new URL(url).hostname;
166
+ const [subdomain] = hostname.split(".");
167
+ return subdomain || null;
168
+ }
169
+ catch (error) {
170
+ console.warn(chalk_1.default.yellow(`⚠️ Unable to determine tunnel subdomain from url '${url}': ${error}`));
171
+ return null;
172
+ }
173
+ }
174
+ startPing() {
175
+ this.stopPing();
176
+ this.pingInterval = setInterval(() => {
177
+ if (this.ws?.readyState === ws_1.default.OPEN) {
178
+ this.ws.ping();
179
+ }
180
+ }, 30000); // Ping every 30 seconds
181
+ }
182
+ stopPing() {
183
+ if (this.pingInterval) {
184
+ clearInterval(this.pingInterval);
185
+ this.pingInterval = null;
186
+ }
187
+ }
188
+ async handleSubdomainConflict() {
189
+ console.log(chalk_1.default.yellow(`\n⚠️ Subdomain "${this.requestedSubdomain}" is currently in use.`));
190
+ const response = await (0, prompts_1.default)({
191
+ type: "select",
192
+ name: "action",
193
+ message: "What would you like to do?",
194
+ choices: [
195
+ { title: "Take over the existing tunnel", value: "takeover" },
196
+ { title: "Use a random subdomain instead", value: "random" },
197
+ { title: "Exit", value: "exit" },
198
+ ],
199
+ initial: 0,
200
+ });
201
+ if (response.action === "takeover") {
202
+ console.log(chalk_1.default.cyan("🔄 Taking over the existing tunnel..."));
203
+ this.subdomain = this.requestedSubdomain;
204
+ this.shouldReconnect = true;
205
+ this.forceTakeover = true;
206
+ this.connect();
207
+ }
208
+ else if (response.action === "random") {
209
+ console.log(chalk_1.default.cyan("🎲 Opening tunnel with a random subdomain..."));
210
+ this.subdomain = undefined;
211
+ this.shouldReconnect = true;
212
+ this.forceTakeover = false;
213
+ this.connect();
214
+ }
215
+ else {
216
+ console.log(chalk_1.default.cyan("👋 Goodbye!"));
217
+ this.stop();
218
+ process.exit(0);
219
+ }
220
+ }
221
+ handleClose() {
222
+ this.stopPing();
223
+ if (!this.shouldReconnect)
224
+ return;
225
+ console.log(chalk_1.default.yellow("😵 Disconnected from OutRay. Retrying in 2s…"));
226
+ this.reconnectTimeout = setTimeout(() => {
227
+ this.connect();
228
+ }, 2000);
229
+ }
230
+ }
231
+ exports.OutRayClient = OutRayClient;
232
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,162 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const os_1 = __importDefault(require("os"));
11
+ const client_1 = require("./client");
12
+ const CONFIG_DIR = path_1.default.join(os_1.default.homedir(), ".outray");
13
+ const CONFIG_FILE = path_1.default.join(CONFIG_DIR, "config.json");
14
+ function saveConfig(config) {
15
+ if (!fs_1.default.existsSync(CONFIG_DIR)) {
16
+ fs_1.default.mkdirSync(CONFIG_DIR, { recursive: true });
17
+ }
18
+ fs_1.default.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));
19
+ console.log(chalk_1.default.green("✅ Auth token saved successfully!"));
20
+ }
21
+ function loadConfig() {
22
+ if (fs_1.default.existsSync(CONFIG_FILE)) {
23
+ try {
24
+ return JSON.parse(fs_1.default.readFileSync(CONFIG_FILE, "utf-8"));
25
+ }
26
+ catch (e) {
27
+ return {};
28
+ }
29
+ }
30
+ return {};
31
+ }
32
+ async function validateToken(token, webUrl) {
33
+ try {
34
+ const response = await fetch(`${webUrl}/api/tunnel/auth`, {
35
+ method: "POST",
36
+ headers: {
37
+ "Content-Type": "application/json",
38
+ },
39
+ body: JSON.stringify({ token }),
40
+ });
41
+ if (!response.ok) {
42
+ throw new Error(`Server returned ${response.status}`);
43
+ }
44
+ const data = (await response.json());
45
+ if (!data.valid) {
46
+ throw new Error(data.error || "Invalid token");
47
+ }
48
+ return true;
49
+ }
50
+ catch (error) {
51
+ throw error;
52
+ }
53
+ }
54
+ async function main() {
55
+ const args = process.argv.slice(2);
56
+ const command = args[0];
57
+ const isDev = process.env.NODE_ENV === "development" || args.includes("--dev");
58
+ const serverUrl = process.env.OUTRAY_SERVER_URL ||
59
+ (isDev ? "ws://localhost:3547" : "wss://api.outray.dev/");
60
+ const webUrl = process.env.OUTRAY_WEB_URL ||
61
+ (isDev ? "http://localhost:3000" : "https://alpha.outray.dev");
62
+ if (!command) {
63
+ console.log(chalk_1.default.red("❌ Please specify a command"));
64
+ console.log(chalk_1.default.cyan("Usage:"));
65
+ console.log(chalk_1.default.cyan(" outray login <token> Save your authentication token"));
66
+ console.log(chalk_1.default.cyan(" outray http <port> Start an HTTP tunnel"));
67
+ console.log(chalk_1.default.cyan(" outray <port> Start an HTTP tunnel (shorthand)"));
68
+ process.exit(1);
69
+ }
70
+ if (command === "login") {
71
+ const token = args[1];
72
+ if (!token) {
73
+ console.log(chalk_1.default.red("❌ Please provide an auth token"));
74
+ console.log(chalk_1.default.cyan("Usage: outray login <token>"));
75
+ process.exit(1);
76
+ }
77
+ console.log(chalk_1.default.cyan("Validating token..."));
78
+ console.log(chalk_1.default.gray(` Connecting to ${webUrl}`));
79
+ try {
80
+ await validateToken(token, webUrl);
81
+ saveConfig({ token });
82
+ }
83
+ catch (err) {
84
+ console.log(chalk_1.default.red(`❌ Validation failed: ${err instanceof Error ? err.message : "Unknown error"}`));
85
+ process.exit(1);
86
+ }
87
+ return;
88
+ }
89
+ let localPort;
90
+ let remainingArgs;
91
+ if (command === "http") {
92
+ const portArg = args[1];
93
+ if (!portArg) {
94
+ console.log(chalk_1.default.red("❌ Please specify a port"));
95
+ console.log(chalk_1.default.cyan("Usage: outray http <port>"));
96
+ process.exit(1);
97
+ }
98
+ localPort = parseInt(portArg, 10);
99
+ remainingArgs = args.slice(2);
100
+ }
101
+ else if (!isNaN(parseInt(command, 10))) {
102
+ localPort = parseInt(command, 10);
103
+ remainingArgs = args.slice(1);
104
+ }
105
+ else {
106
+ console.log(chalk_1.default.red(`❌ Unknown command: ${command}`));
107
+ process.exit(1);
108
+ }
109
+ if (isNaN(localPort) || localPort < 1 || localPort > 65535) {
110
+ console.log(chalk_1.default.red("❌ Invalid port number"));
111
+ console.log(chalk_1.default.cyan("Port must be between 1 and 65535"));
112
+ process.exit(1);
113
+ }
114
+ let subdomain;
115
+ const subdomainArg = remainingArgs.find((arg) => arg.startsWith("--subdomain"));
116
+ if (subdomainArg) {
117
+ if (subdomainArg.includes("=")) {
118
+ // Format: --subdomain=value
119
+ subdomain = subdomainArg.split("=")[1];
120
+ }
121
+ else {
122
+ // Format: --subdomain value
123
+ const subdomainIndex = remainingArgs.indexOf(subdomainArg);
124
+ if (subdomainIndex !== -1 && remainingArgs[subdomainIndex + 1]) {
125
+ subdomain = remainingArgs[subdomainIndex + 1];
126
+ }
127
+ }
128
+ }
129
+ const config = loadConfig();
130
+ let apiKey = process.env.OUTRAY_API_KEY || config.token;
131
+ const keyArg = remainingArgs.find((arg) => arg.startsWith("--key"));
132
+ if (keyArg) {
133
+ if (keyArg.includes("=")) {
134
+ // Format: --key=value
135
+ apiKey = keyArg.split("=")[1];
136
+ }
137
+ else {
138
+ // Format: --key value
139
+ const keyIndex = remainingArgs.indexOf(keyArg);
140
+ if (keyIndex !== -1 && remainingArgs[keyIndex + 1]) {
141
+ apiKey = remainingArgs[keyIndex + 1];
142
+ }
143
+ }
144
+ }
145
+ const client = new client_1.OutRayClient(localPort, serverUrl, apiKey, subdomain);
146
+ client.start();
147
+ process.on("SIGINT", () => {
148
+ console.log(chalk_1.default.cyan("\n👋 Shutting down gracefully..."));
149
+ client.stop();
150
+ process.exit(0);
151
+ });
152
+ process.on("SIGTERM", () => {
153
+ console.log(chalk_1.default.cyan("\n👋 Shutting down gracefully..."));
154
+ client.stop();
155
+ process.exit(0);
156
+ });
157
+ }
158
+ main().catch((err) => {
159
+ console.error(chalk_1.default.red("Unexpected error:"), err);
160
+ process.exit(1);
161
+ });
162
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { ClientMessage, ServerMessage } from "./types";
2
+ export declare function encodeMessage(message: ClientMessage): string;
3
+ export declare function decodeMessage(data: string): ServerMessage;
4
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEvD,wBAAgB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAE5D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAEzD"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.encodeMessage = encodeMessage;
4
+ exports.decodeMessage = decodeMessage;
5
+ function encodeMessage(message) {
6
+ return JSON.stringify(message);
7
+ }
8
+ function decodeMessage(data) {
9
+ return JSON.parse(data);
10
+ }
11
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":";;AAEA,sCAEC;AAED,sCAEC;AAND,SAAgB,aAAa,CAAC,OAAsB;IAClD,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAED,SAAgB,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAkB,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,33 @@
1
+ export interface OpenTunnelMessage {
2
+ type: "open_tunnel";
3
+ subdomain?: string | null;
4
+ apiKey?: string;
5
+ forceTakeover?: boolean;
6
+ }
7
+ export interface TunnelOpenedMessage {
8
+ type: "tunnel_opened";
9
+ url: string;
10
+ }
11
+ export interface TunnelDataMessage {
12
+ type: "request";
13
+ requestId: string;
14
+ method: string;
15
+ path: string;
16
+ headers: Record<string, string | string[]>;
17
+ body?: string;
18
+ }
19
+ export interface TunnelResponseMessage {
20
+ type: "response";
21
+ requestId: string;
22
+ statusCode: number;
23
+ headers: Record<string, string | string[]>;
24
+ body?: string;
25
+ }
26
+ export interface ErrorMessage {
27
+ type: "error";
28
+ code: string;
29
+ message: string;
30
+ }
31
+ export type ServerMessage = TunnelOpenedMessage | TunnelDataMessage | ErrorMessage;
32
+ export type ClientMessage = OpenTunnelMessage | TunnelResponseMessage;
33
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,eAAe,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,aAAa,GACrB,mBAAmB,GACnB,iBAAiB,GACjB,YAAY,CAAC;AACjB,MAAM,MAAM,aAAa,GAAG,iBAAiB,GAAG,qBAAqB,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "outray",
3
+ "version": "0.0.1",
4
+ "description": "OutRay CLI - Expose your local server to the internet",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "outray": "dist/index.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "dev": "tsc --watch",
12
+ "prepublishOnly": "npm run build"
13
+ },
14
+ "keywords": [
15
+ "tunnel",
16
+ "ngrok",
17
+ "localhost",
18
+ "proxy",
19
+ "outray",
20
+ "expose",
21
+ "tunneling",
22
+ "development"
23
+ ],
24
+ "author": "akinloluwami",
25
+ "license": "MIT",
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "https://github.com/akinloluwami/outray.git",
29
+ "directory": "apps/cli"
30
+ },
31
+ "homepage": "https://github.com/akinloluwami/outray#readme",
32
+ "bugs": {
33
+ "url": "https://github.com/akinloluwami/outray/issues"
34
+ },
35
+ "engines": {
36
+ "node": ">=16.0.0"
37
+ },
38
+ "files": [
39
+ "dist",
40
+ "README.md"
41
+ ],
42
+ "dependencies": {
43
+ "@types/prompts": "^2.4.9",
44
+ "chalk": "^4.1.2",
45
+ "http-proxy": "^1.18.1",
46
+ "prompts": "^2.4.2",
47
+ "ws": "^8.18.0"
48
+ },
49
+ "devDependencies": {
50
+ "@types/http-proxy": "^1.17.14",
51
+ "@types/node": "^20.10.0",
52
+ "@types/ws": "^8.5.10",
53
+ "typescript": "^5.3.3"
54
+ }
55
+ }