expo-http-server 0.1.10 → 0.1.11
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.
- package/README.md +6 -2
- package/android/src/main/java/expo/modules/httpserver/ExpoHttpServerModule.kt +10 -4
- package/build/index.d.ts +2 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +2 -2
- package/build/index.js.map +1 -1
- package/ios/ExpoHttpServerModule.swift +6 -1
- package/package.json +1 -1
- package/src/index.ts +6 -0
package/README.md
CHANGED
|
@@ -49,19 +49,23 @@ export default function App() {
|
|
|
49
49
|
}
|
|
50
50
|
});
|
|
51
51
|
server.route("/", "GET", async (request) => {
|
|
52
|
-
console.log("Request", "/", "GET",
|
|
52
|
+
console.log("Request", "/", "GET", request);
|
|
53
53
|
setLastCalled(Date.now());
|
|
54
54
|
return {
|
|
55
55
|
statusCode: 200,
|
|
56
|
+
headers: {
|
|
57
|
+
"Custom-Header": "Bazinga",
|
|
58
|
+
},
|
|
56
59
|
contentType: "application/json",
|
|
57
60
|
body: JSON.stringify(obj),
|
|
58
61
|
};
|
|
59
62
|
});
|
|
60
63
|
server.route("/html", "GET", async (request) => {
|
|
61
|
-
console.log("Request", "/html", "GET",
|
|
64
|
+
console.log("Request", "/html", "GET", request);
|
|
62
65
|
setLastCalled(Date.now());
|
|
63
66
|
return {
|
|
64
67
|
statusCode: 200,
|
|
68
|
+
statusDescription: "OK - CUSTOM STATUS",
|
|
65
69
|
contentType: "text/html",
|
|
66
70
|
body: html,
|
|
67
71
|
};
|
|
@@ -4,17 +4,17 @@ import androidx.core.os.bundleOf
|
|
|
4
4
|
import expo.modules.kotlin.modules.Module
|
|
5
5
|
import expo.modules.kotlin.modules.ModuleDefinition
|
|
6
6
|
import com.safframework.server.core.AndroidServer
|
|
7
|
-
import com.safframework.server.core.RequestHandler
|
|
8
7
|
import com.safframework.server.core.Server
|
|
9
8
|
import com.safframework.server.core.http.HttpMethod
|
|
10
9
|
import com.safframework.server.core.http.Request
|
|
11
10
|
import com.safframework.server.core.http.Response
|
|
12
11
|
import org.json.JSONObject
|
|
13
|
-
import java.util.UUID
|
|
14
12
|
|
|
15
13
|
class ExpoHttpServerModule : Module() {
|
|
16
14
|
class SimpleHttpResponse(val statusCode: Int,
|
|
15
|
+
val statusDescription: String,
|
|
17
16
|
val contentType: String,
|
|
17
|
+
val headers: HashMap<String, String>,
|
|
18
18
|
val body: String)
|
|
19
19
|
|
|
20
20
|
private var server: Server? = null;
|
|
@@ -53,11 +53,15 @@ class ExpoHttpServerModule : Module() {
|
|
|
53
53
|
Thread.sleep(10)
|
|
54
54
|
}
|
|
55
55
|
val res = responses[uuid]!!
|
|
56
|
-
responses.remove(uuid);
|
|
57
56
|
response.setBodyText(res.body)
|
|
58
57
|
response.setStatus(res.statusCode)
|
|
59
58
|
response.addHeader("Content-Length", "" + res.body.length)
|
|
60
59
|
response.addHeader("Content-Type", res.contentType)
|
|
60
|
+
for ((key, value) in res.headers) {
|
|
61
|
+
response.addHeader(key, value)
|
|
62
|
+
}
|
|
63
|
+
responses.remove(uuid);
|
|
64
|
+
return@request response
|
|
61
65
|
};
|
|
62
66
|
}
|
|
63
67
|
|
|
@@ -81,9 +85,11 @@ class ExpoHttpServerModule : Module() {
|
|
|
81
85
|
|
|
82
86
|
Function("respond") { uuid: String,
|
|
83
87
|
statusCode: Int,
|
|
88
|
+
statusDescription: String,
|
|
84
89
|
contentType: String,
|
|
90
|
+
headers: HashMap<String, String>,
|
|
85
91
|
body: String ->
|
|
86
|
-
responses[uuid] = SimpleHttpResponse(statusCode, contentType, body);
|
|
92
|
+
responses[uuid] = SimpleHttpResponse(statusCode, statusDescription, contentType, headers, body);
|
|
87
93
|
}
|
|
88
94
|
|
|
89
95
|
Function("stop") {
|
package/build/index.d.ts
CHANGED
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;AAC3D;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAE5E,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;CACxD;AAED,eAAO,MAAM,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;AAC3D;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAE5E,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;CACxD;AAED,eAAO,MAAM,KAAK,YAyBjB,CAAC;AAEF,eAAO,MAAM,KAAK,SACV,MAAM,UACJ,UAAU,sBACE,YAAY,KAAK,QAAQ,QAAQ,CAAC,SAUvD,CAAC;AAEF,eAAO,MAAM,KAAK,SACV,MAAM,4BACa,WAAW,KAAK,IAAI,sBAQ9C,CAAC;AAEF,eAAO,MAAM,IAAI,WAAoC,CAAC"}
|
package/build/index.js
CHANGED
|
@@ -6,11 +6,11 @@ export const start = () => {
|
|
|
6
6
|
emitter.addListener("onRequest", async (event) => {
|
|
7
7
|
const responseHandler = requestCallbacks.find((c) => c.uuid === event.uuid);
|
|
8
8
|
if (!responseHandler) {
|
|
9
|
-
ExpoHttpServerModule.respond(event.uuid, 404, "application/json", JSON.stringify({ error: "Handler not found" }));
|
|
9
|
+
ExpoHttpServerModule.respond(event.uuid, 404, "Not Found", "application/json", {}, JSON.stringify({ error: "Handler not found" }));
|
|
10
10
|
return;
|
|
11
11
|
}
|
|
12
12
|
const response = await responseHandler.callback(event);
|
|
13
|
-
ExpoHttpServerModule.respond(event.uuid, response.statusCode || 200, response.contentType || "application/json", response.body || "{}");
|
|
13
|
+
ExpoHttpServerModule.respond(event.uuid, response.statusCode || 200, response.statusDescription || "OK", response.contentType || "application/json", response.headers || {}, response.body || "{}");
|
|
14
14
|
});
|
|
15
15
|
ExpoHttpServerModule.start();
|
|
16
16
|
};
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,oBAAoB,MAAM,wBAAwB,CAAC;AAE1D,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,oBAAoB,CAAC,CAAC;AACvD,MAAM,gBAAgB,GAAe,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,oBAAoB,MAAM,wBAAwB,CAAC;AAE1D,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,oBAAoB,CAAC,CAAC;AACvD,MAAM,gBAAgB,GAAe,EAAE,CAAC;AAsCxC,MAAM,CAAC,MAAM,KAAK,GAAG,GAAG,EAAE;IACxB,OAAO,CAAC,WAAW,CAAe,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QAC7D,MAAM,eAAe,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5E,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,oBAAoB,CAAC,OAAO,CAC1B,KAAK,CAAC,IAAI,EACV,GAAG,EACH,WAAW,EACX,kBAAkB,EAClB,EAAE,EACF,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAC/C,CAAC;YACF,OAAO;QACT,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvD,oBAAoB,CAAC,OAAO,CAC1B,KAAK,CAAC,IAAI,EACV,QAAQ,CAAC,UAAU,IAAI,GAAG,EAC1B,QAAQ,CAAC,iBAAiB,IAAI,IAAI,EAClC,QAAQ,CAAC,WAAW,IAAI,kBAAkB,EAC1C,QAAQ,CAAC,OAAO,IAAI,EAAE,EACtB,QAAQ,CAAC,IAAI,IAAI,IAAI,CACtB,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,oBAAoB,CAAC,KAAK,EAAE,CAAC;AAC/B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAG,CACnB,IAAY,EACZ,MAAkB,EAClB,QAAsD,EACtD,EAAE;IACF,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACjD,gBAAgB,CAAC,IAAI,CAAC;QACpB,MAAM;QACN,IAAI;QACJ,IAAI;QACJ,QAAQ;KACT,CAAC,CAAC;IACH,oBAAoB,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AACjD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAG,CACnB,IAAY,EACZ,cAA6C,EAC7C,EAAE;IACF,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,CAAC,WAAW,CAAc,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACjE,cAAc,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;IACL,CAAC;IACD,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC","sourcesContent":["import { EventEmitter } from \"expo-modules-core\";\n\nimport ExpoHttpServerModule from \"./ExpoHttpServerModule\";\n\nconst emitter = new EventEmitter(ExpoHttpServerModule);\nconst requestCallbacks: Callback[] = [];\n\nexport type HttpMethod = \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n/**\n * PAUSED AND RESUMED are iOS only\n */\nexport type Status = \"STARTED\" | \"PAUSED\" | \"RESUMED\" | \"STOPPED\" | \"ERROR\";\n\nexport interface StatusEvent {\n status: Status;\n message: string;\n}\n\nexport interface RequestEvent {\n uuid: string;\n method: string;\n path: string;\n body: string;\n headersJson: string;\n paramsJson: string;\n cookiesJson: string;\n}\n\nexport interface Response {\n statusCode?: number;\n statusDescription?: string;\n contentType?: string;\n headers?: Record<string, string>;\n body?: string;\n}\n\nexport interface Callback {\n method: string;\n path: string;\n uuid: string;\n callback: (request: RequestEvent) => Promise<Response>;\n}\n\nexport const start = () => {\n emitter.addListener<RequestEvent>(\"onRequest\", async (event) => {\n const responseHandler = requestCallbacks.find((c) => c.uuid === event.uuid);\n if (!responseHandler) {\n ExpoHttpServerModule.respond(\n event.uuid,\n 404,\n \"Not Found\",\n \"application/json\",\n {},\n JSON.stringify({ error: \"Handler not found\" }),\n );\n return;\n }\n const response = await responseHandler.callback(event);\n ExpoHttpServerModule.respond(\n event.uuid,\n response.statusCode || 200,\n response.statusDescription || \"OK\",\n response.contentType || \"application/json\",\n response.headers || {},\n response.body || \"{}\",\n );\n });\n ExpoHttpServerModule.start();\n};\n\nexport const route = (\n path: string,\n method: HttpMethod,\n callback: (request: RequestEvent) => Promise<Response>,\n) => {\n const uuid = Math.random().toString(16).slice(2);\n requestCallbacks.push({\n method,\n path,\n uuid,\n callback,\n });\n ExpoHttpServerModule.route(path, method, uuid);\n};\n\nexport const setup = (\n port: number,\n onStatusUpdate?: (event: StatusEvent) => void,\n) => {\n if (onStatusUpdate) {\n emitter.addListener<StatusEvent>(\"onStatusUpdate\", async (event) => {\n onStatusUpdate(event);\n });\n }\n ExpoHttpServerModule.setup(port);\n};\n\nexport const stop = () => ExpoHttpServerModule.stop();\n"]}
|
|
@@ -57,13 +57,18 @@ public class ExpoHttpServerModule: Module {
|
|
|
57
57
|
|
|
58
58
|
private func respondHandler(udid: String,
|
|
59
59
|
statusCode: Int,
|
|
60
|
+
statusDescription: String,
|
|
60
61
|
contentType: String,
|
|
62
|
+
headers: [String: String],
|
|
61
63
|
body: String) {
|
|
62
64
|
DispatchQueue.main.async {
|
|
63
65
|
if let response = self.responses[udid] {
|
|
64
|
-
response.setStatusCode(UInt(statusCode), description:
|
|
66
|
+
response.setStatusCode(UInt(statusCode), description: statusDescription)
|
|
65
67
|
response.setValue(contentType, forHTTPHeaderField: "Content-type")
|
|
66
68
|
response.setValue("\(body.count)", forHTTPHeaderField: "Content-Length")
|
|
69
|
+
for (key, value) in headers {
|
|
70
|
+
response.setValue(value, forHTTPHeaderField: key)
|
|
71
|
+
}
|
|
67
72
|
response.send(body);
|
|
68
73
|
self.responses[udid] = nil;
|
|
69
74
|
}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -28,7 +28,9 @@ export interface RequestEvent {
|
|
|
28
28
|
|
|
29
29
|
export interface Response {
|
|
30
30
|
statusCode?: number;
|
|
31
|
+
statusDescription?: string;
|
|
31
32
|
contentType?: string;
|
|
33
|
+
headers?: Record<string, string>;
|
|
32
34
|
body?: string;
|
|
33
35
|
}
|
|
34
36
|
|
|
@@ -46,7 +48,9 @@ export const start = () => {
|
|
|
46
48
|
ExpoHttpServerModule.respond(
|
|
47
49
|
event.uuid,
|
|
48
50
|
404,
|
|
51
|
+
"Not Found",
|
|
49
52
|
"application/json",
|
|
53
|
+
{},
|
|
50
54
|
JSON.stringify({ error: "Handler not found" }),
|
|
51
55
|
);
|
|
52
56
|
return;
|
|
@@ -55,7 +59,9 @@ export const start = () => {
|
|
|
55
59
|
ExpoHttpServerModule.respond(
|
|
56
60
|
event.uuid,
|
|
57
61
|
response.statusCode || 200,
|
|
62
|
+
response.statusDescription || "OK",
|
|
58
63
|
response.contentType || "application/json",
|
|
64
|
+
response.headers || {},
|
|
59
65
|
response.body || "{}",
|
|
60
66
|
);
|
|
61
67
|
});
|