on master help sign in
Possibly fix jsaddle-warp duplicate batch issue
84afb19Hamish Mackenzie
jsaddle-warp/src/Language/Javascript/JSaddle/WebSockets.hs+4−4
@@ -148,11 +148,13 @@ jsaddleJs = "\
148 \\n\
148 \\n\
149 \ ws.onopen = function(e) {\n\
149 \ ws.onopen = function(e) {\n\
150 \ " <> initState <> "\n\
150 \ " <> initState <> "\n\
151− \ var inXhrSend = false;\n\
152 \\n\
151 \\n\
153 \ ws.onmessage = function(e) {\n\
152 \ ws.onmessage = function(e) {\n\
154− \ if(inXhrSend) return;\n\
155 \ var batch = JSON.parse(e.data);\n\
153 \ var batch = JSON.parse(e.data);\n\
154+ \ if(inCallback > 0) {\n\
155+ \ asyncBatch = batch;\n\
156+ \ return;\n\
157+ \ }\n\
156 \ if(typeof batch === \"string\") {\n\
158 \ if(typeof batch === \"string\") {\n\
157 \ syncKey = batch;\n\
159 \ syncKey = batch;\n\
158 \ var xhr = new XMLHttpRequest();\n\
160 \ var xhr = new XMLHttpRequest();\n\
@@ -167,12 +169,10 @@ jsaddleJs = "\
167 \\n\
169 \\n\
168 \ " <> runBatch (\a -> "ws.send(JSON.stringify(" <> a <> "));")
170 \ " <> runBatch (\a -> "ws.send(JSON.stringify(" <> a <> "));")
169 (Just (\a -> "(function(){\n\
171 (Just (\a -> "(function(){\n\
170− \ inXhrSend = true;\n\
171 \ var xhr = new XMLHttpRequest();\n\
172 \ var xhr = new XMLHttpRequest();\n\
172 \ xhr.open('POST', '/sync/'+syncKey, false);\n\
173 \ xhr.open('POST', '/sync/'+syncKey, false);\n\
173 \ xhr.setRequestHeader(\"Content-type\", \"application/json\");\n\
174 \ xhr.setRequestHeader(\"Content-type\", \"application/json\");\n\
174 \ xhr.send(JSON.stringify(" <> a <> "));\n\
175 \ xhr.send(JSON.stringify(" <> a <> "));\n\
175− \ inXhrSend = false;\n\
176 \ return JSON.parse(xhr.response);})()")) <> "\
176 \ return JSON.parse(xhr.response);})()")) <> "\
177 \ };\n\
177 \ };\n\
178 \ };\n\
178 \ };\n\
jsaddle/src/Language/Javascript/JSaddle/Run/Files.hs+8
@@ -47,6 +47,7 @@ initState = "\
47 \ var expectedBatch = 1;\n\
47 \ var expectedBatch = 1;\n\
48 \ var lastResults = [0, {}];\n\
48 \ var lastResults = [0, {}];\n\
49 \ var inCallback = 0;\n\
49 \ var inCallback = 0;\n\
50+ \ var asyncBatch = null;\n\
50 \"
51 \"
51
52
52runBatch :: (ByteString -> ByteString) -> Maybe (ByteString -> ByteString) -> ByteString
53runBatch :: (ByteString -> ByteString) -> Maybe (ByteString -> ByteString) -> ByteString
@@ -313,6 +314,13 @@ runBatch send sendSync = "\
313 \ jsaddle_values.set(n, err);\n\
314 \ jsaddle_values.set(n, err);\n\
314 \ " <> send "{\"tag\": \"BatchResults\", \"contents\": [batch[2], {\"tag\": \"Failure\", \"contents\": [callbacksToFree, results, n]}]}" <> "\n\
315 \ " <> send "{\"tag\": \"BatchResults\", \"contents\": [batch[2], {\"tag\": \"Failure\", \"contents\": [callbacksToFree, results, n]}]}" <> "\n\
315 \ }\n\
316 \ }\n\
317+ \ if(inCallback == 1) {\n\
318+ \ while(asyncBatch !== null) {\n\
319+ \ var b = asyncBatch;\n\
320+ \ asyncBatch = null;\n\
321+ \ if(b[2] == expectedBatch) runBatch(b);\n\
322+ \ }\n\
323+ \ }\n\
316 \ inCallback--;\n\
324 \ inCallback--;\n\
317 \ };\n\
325 \ };\n\
318 \ if(batch[1] && (initialSyncDepth || 0) === 0) {\n\
326 \ if(batch[1] && (initialSyncDepth || 0) === 0) {\n\