Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
import com.slack.api.bolt.response.Response;
import com.slack.api.jakarta_socket_mode.JakartaSocketModeClientFactory;
import com.slack.api.socket_mode.SocketModeClient;
import com.slack.api.socket_mode.SocketModeMessage;
import com.slack.api.socket_mode.listener.WebSocketMessageListener;
import com.slack.api.socket_mode.response.AckResponse;
import com.slack.api.util.json.GsonFactory;
import com.slack.api.util.thread.DaemonThreadExecutorServiceFactory;
Expand Down Expand Up @@ -80,14 +82,21 @@ private static Supplier<SocketModeClient> buildSocketModeClientFactory(
final SocketModeClient client = JakartaSocketModeClientFactory.create(app.slack(), appToken);
final SocketModeRequestParser requestParser = new SocketModeRequestParser(app.config());
final Gson gson = GsonFactory.createSnakeCase(app.slack().getConfig());
client.addWebSocketMessageListener(message -> {
if (executorService != null) {
// asynchronous
executorService.execute(() -> runBoltApp(
message, app, client, requestParser, errorHandler, gson));
} else {
// synchronous
runBoltApp(message, app, client, requestParser, errorHandler, gson);
client.addWebSocketMessageListener(new WebSocketMessageListener() {
@Override
public void handle(String message) {
handleWithMetadata(new SocketModeMessage(message, null));
}

@Override
public void handleWithMetadata(SocketModeMessage message) {
if (executorService != null) {
// Retain the receive time while this task waits for a worker.
executorService.execute(() -> runBoltApp(
message, app, client, requestParser, errorHandler, gson));
} else {
runBoltApp(message, app, client, requestParser, errorHandler, gson);
}
}
});
return client;
Expand All @@ -99,18 +108,25 @@ private static Supplier<SocketModeClient> buildSocketModeClientFactory(
}

private static void runBoltApp(
String message,
SocketModeMessage message,
App app,
SocketModeClient client,
SocketModeRequestParser requestParser,
Function<ErrorContext, Response> errorHandler,
Gson gson
) {
long startMillis = System.currentTimeMillis();
SocketModeRequest req = requestParser.parse(message);
SocketModeRequest req = requestParser.parse(message.getPayload());
if (req != null) {
Request<?> boltRequest = req.getBoltRequest();
if (boltRequest != null) {
boltRequest.setSocketModeEnvelopeId(req.getEnvelope().getEnvelopeId());
Long receivedAtNanos = message.getReceivedAtNanos();
boltRequest.setSocketModeDispatchDelayNanos(
receivedAtNanos == null ? null : System.nanoTime() - receivedAtNanos);
}
try {
Response boltResponse = app.run(req.getBoltRequest());
Response boltResponse = app.run(boltRequest);
if (boltResponse.getStatusCode() != 200) {
log.warn("Unsuccessful Bolt app execution (status: {}, body: {})",
boltResponse.getStatusCode(), boltResponse.getBody());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import java.util.concurrent.atomic.AtomicBoolean;

import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

public class SocketModeAppTest {
Expand Down Expand Up @@ -54,7 +55,9 @@ public void payloadHandling() throws Exception {
AtomicBoolean commandCalled = new AtomicBoolean(false);
AtomicBoolean actionCalled = new AtomicBoolean(false);
AtomicBoolean eventCalled = new AtomicBoolean(false);
AtomicBoolean requestObserved = new AtomicBoolean(false);
app.command("/hi-socket-mode", (req, ctx) -> {
assertTrue(requestObserved.get());
commandCalled.set(true);
return ctx.ack("Hello!");
});
Expand All @@ -67,6 +70,14 @@ public void payloadHandling() throws Exception {
return ctx.ack();
});
SocketModeApp socketModeApp = new SocketModeApp(VALID_APP_TOKEN, app);
app.use((request, response, chain) -> {
assertTrue(request.isSocketMode());
assertNotNull(request.getSocketModeEnvelopeId());
assertNotNull(request.getSocketModeDispatchDelayNanos());
assertTrue(request.getSocketModeDispatchDelayNanos() >= 0);
requestObserved.set(true);
return chain.next(request);
});
socketModeApp.startAsync();
try {
Thread.sleep(3_000L);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
import com.slack.api.bolt.socket_mode.request.SocketModeRequest;
import com.slack.api.bolt.socket_mode.request.SocketModeRequestParser;
import com.slack.api.socket_mode.SocketModeClient;
import com.slack.api.socket_mode.SocketModeMessage;
import com.slack.api.socket_mode.listener.WebSocketMessageListener;
import com.slack.api.socket_mode.response.AckResponse;
import com.slack.api.util.json.GsonFactory;
import com.slack.api.util.thread.DaemonThreadExecutorServiceFactory;
Expand Down Expand Up @@ -80,14 +82,21 @@ private static Supplier<SocketModeClient> buildSocketModeClientFactory(
final SocketModeClient client = app.slack().socketMode(appToken, backend);
final SocketModeRequestParser requestParser = new SocketModeRequestParser(app.config());
final Gson gson = GsonFactory.createSnakeCase(app.slack().getConfig());
client.addWebSocketMessageListener(message -> {
if (executorService != null) {
// asynchronous
executorService.execute(() -> runBoltApp(
message, app, client, requestParser, errorHandler, gson));
} else {
// synchronous
runBoltApp(message, app, client, requestParser, errorHandler, gson);
client.addWebSocketMessageListener(new WebSocketMessageListener() {
@Override
public void handle(String message) {
handleWithMetadata(new SocketModeMessage(message, null));
}

@Override
public void handleWithMetadata(SocketModeMessage message) {
if (executorService != null) {
// Retain the receive time while this task waits for a worker.
executorService.execute(() -> runBoltApp(
message, app, client, requestParser, errorHandler, gson));
} else {
runBoltApp(message, app, client, requestParser, errorHandler, gson);
}
}
});
return client;
Expand All @@ -99,18 +108,25 @@ private static Supplier<SocketModeClient> buildSocketModeClientFactory(
}

private static void runBoltApp(
String message,
SocketModeMessage message,
App app,
SocketModeClient client,
SocketModeRequestParser requestParser,
Function<ErrorContext, Response> errorHandler,
Gson gson
) {
long startMillis = System.currentTimeMillis();
SocketModeRequest req = requestParser.parse(message);
SocketModeRequest req = requestParser.parse(message.getPayload());
if (req != null) {
Request<?> boltRequest = req.getBoltRequest();
if (boltRequest != null) {
boltRequest.setSocketModeEnvelopeId(req.getEnvelope().getEnvelopeId());
Long receivedAtNanos = message.getReceivedAtNanos();
boltRequest.setSocketModeDispatchDelayNanos(
receivedAtNanos == null ? null : System.nanoTime() - receivedAtNanos);
}
try {
Response boltResponse = app.run(req.getBoltRequest());
Response boltResponse = app.run(boltRequest);
if (boltResponse.getStatusCode() != 200) {
log.warn("Unsuccessful Bolt app execution (status: {}, body: {})",
boltResponse.getStatusCode(), boltResponse.getBody());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,9 @@ public void payloadHandling() throws Exception {
AtomicBoolean commandCalled = new AtomicBoolean(false);
AtomicBoolean actionCalled = new AtomicBoolean(false);
AtomicBoolean eventCalled = new AtomicBoolean(false);
AtomicBoolean requestObserved = new AtomicBoolean(false);
app.command("/hi-socket-mode", (req, ctx) -> {
assertTrue(requestObserved.get());
commandCalled.set(true);
return ctx.ack("Hello!");
});
Expand All @@ -67,6 +69,14 @@ public void payloadHandling() throws Exception {
return ctx.ack();
});
SocketModeApp socketModeApp = new SocketModeApp(VALID_APP_TOKEN, app);
app.use((request, response, chain) -> {
assertTrue(request.isSocketMode());
assertNotNull(request.getSocketModeEnvelopeId());
assertNotNull(request.getSocketModeDispatchDelayNanos());
assertTrue(request.getSocketModeDispatchDelayNanos() >= 0);
requestObserved.set(true);
return chain.next(request);
});
socketModeApp.startAsync();
try {
Thread.sleep(3_000L);
Expand Down Expand Up @@ -110,7 +120,9 @@ public void payloadHandling_JavaWebSocket() throws Exception {
.build());
AtomicBoolean commandCalled = new AtomicBoolean(false);
AtomicBoolean actionCalled = new AtomicBoolean(false);
AtomicBoolean requestObserved = new AtomicBoolean(false);
app.command("/hi-socket-mode", (req, ctx) -> {
assertTrue(requestObserved.get());
commandCalled.set(true);
return ctx.ack("Hello!");
});
Expand All @@ -123,6 +135,14 @@ public void payloadHandling_JavaWebSocket() throws Exception {
SocketModeClient.Backend.JavaWebSocket,
app
);
app.use((request, response, chain) -> {
assertTrue(request.isSocketMode());
assertNotNull(request.getSocketModeEnvelopeId());
assertNotNull(request.getSocketModeDispatchDelayNanos());
assertTrue(request.getSocketModeDispatchDelayNanos() >= 0);
requestObserved.set(true);
return chain.next(request);
});
socketModeApp.startAsync();
try {
Thread.sleep(3_000L);
Expand Down
Loading