Akka gRPC - Support for building streaming gRPC servers and clients on top of Akka Streams.

Overview

akka-grpc

Support for building streaming gRPC servers and clients on top of Akka Streams.

This library is meant to be used as a building block in projects using the Akka toolkit.

Documentation

Project Status

This library is ready to be used in production, but API's and build system plugins are still expected to be improved and may change.

The API on both sides (Client and Server) is a simple Akka Streams-based one.

The client side is currently implemented on top of io.grpc:grpc-netty-shaded, we plan to replace this by just io.grpc:grpc-core and Akka HTTP.

As for performance, we are currently relying on the JVM TLS implementation, which is sufficient for many use cases, but is planned to be replaced with conscrypt or netty-tcnative.

General overview

gRPC is a schema-first RPC framework, where your protocol is declared in a protobuf definition, and requests and responses will be streamed over an HTTP/2 connection.

Based on a protobuf service definition, akka-grpc can generate:

  • Model classes (using plain protoc for Java or scalapb for Scala)
  • The API (as an interface for Java or a trait for Scala), expressed in Akka Streams Sources
  • On the server side, code to create an Akka HTTP route based on your implementation of the API
  • On the client side, a client for the API.

Project structure

The project is split up in a number of subprojects:

  • codegen: code generation shared among plugins
  • runtime: run-time utilities used by the generated code
  • sbt-plugin: the sbt plugin
  • scalapb-protoc-plugin: the scalapb Scala model code generation packaged as a protoc plugin, to be used from gradle
  • interop-tests

Additionally, 'plugin-tester-java' and 'plugin-tester-scala' contain an example project in Java and Scala respectively, with both sbt and Gradle configurations.

Compatibility & support

If used with JDK 8 prior to version 1.8.0_251 you must add an ALPN agent.

Support for Akka gRPC is available via the Lightbend Subscription

License

Akka gRPC is Open Source and available under the Apache 2 License.

Comments
  • Using gradle plugin DSL fails

    Using gradle plugin DSL fails

    Hi,

    I can't include akka-grpc using plugin DSL as it fails with following error:

    An exception occurred applying plugin request [id: 'com.lightbend.akka.grpc.gradle', version: '0.7.2'] Failed to apply plugin [id 'com.lightbend.akka.grpc.gradle'] Could not find method protobuf() for arguments [akka.grpc.gradle.AkkaGrpcPlugin$_apply_closure1$_closure2@7e475405] on root project 'xzy' of type org.gradle.api.Project.

    I've tried multiple gradle versions also, same result. Legacy usage with classpath works.

    Is there something that I've missed?

    help wanted gradle 
    opened by smarijic 31
  • Client power user API

    Client power user API

    Fixes #191

    Went for

    client.method()
      .bladi()
      .dadi()
      .execute(param)
    

    instead of

    client.advanced.method(param)
      .bladi()
      .dadi()
      .execute()
    
    opened by johanandren 26
  • Streams kills each other

    Streams kills each other

    Hi again.

    If I open multiple streams at the same time using a shared client and next closes the first stream using KillSwitch, then the other streams fails. However, the first stream finishes with success.

    I get the following error on the failing streams:

    io.grpc.StatusRuntimeException: INTERNAL: HTTP/2 error code: PROTOCOL_ERROR
    Received Goaway
    Received unexpected frame of type RstStreamFrame for stream 13 in state Closed
      at io.grpc.Status.asRuntimeException(Status.java:526)
      at akka.grpc.internal.AkkaNettyGrpcClientGraphStage$$anon$1.onCallClosed(AkkaNettyGrpcClientGraphStage.scala:170)
      at akka.grpc.internal.AkkaNettyGrpcClientGraphStage$$anon$1.$anonfun$callback$1(AkkaNettyGrpcClientGraphStage.scala:74)
      at akka.grpc.internal.AkkaNettyGrpcClientGraphStage$$anon$1.$anonfun$callback$1$adapted(AkkaNettyGrpcClientGraphStage.scala:70)
      at akka.stream.impl.fusing.GraphInterpreter.runAsyncInput(GraphInterpreter.scala:454)
      at akka.stream.impl.fusing.GraphInterpreterShell$AsyncInput.execute(ActorGraphInterpreter.scala:468)
      at akka.stream.impl.fusing.GraphInterpreterShell.processEvent(ActorGraphInterpreter.scala:563)
      at akka.stream.impl.fusing.ActorGraphInterpreter.akka$stream$impl$fusing$ActorGraphInterpreter$$processEvent(ActorGraphInterpreter.scala:745)
      at akka.stream.impl.fusing.ActorGraphInterpreter$$anonfun$receive$1.applyOrElse(ActorGraphInterpreter.scala:760)
      at akka.actor.Actor.aroundReceive(Actor.scala:517)
      at akka.actor.Actor.aroundReceive$(Actor.scala:515)
      at akka.stream.impl.fusing.ActorGraphInterpreter.aroundReceive(ActorGraphInterpreter.scala:670)
      at akka.actor.ActorCell.receiveMessage(ActorCell.scala:588)
      at akka.actor.ActorCell.invoke(ActorCell.scala:557)
      at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:258)
      at akka.dispatch.Mailbox.run(Mailbox.scala:225)
      at akka.dispatch.Mailbox.exec(Mailbox.scala:235)
      at akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
      at akka.dispatch.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
      at akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
      at akka.dispatch.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
    
    bug 
    opened by peteremiljensen 25
  • Server-side power API

    Server-side power API

    For users who need more low-level access:

    For cross-cutting concerns where the service implementation does not need access to the details, the Handler could accept a Directive that is wrapped around the generated Route. Directives may mutate the request, but we discourage passing information from this Directive to the method body (and will not provide infrastructure for it). If this is required, implement the relevant processing in the method body instead of using the cross-cutting Directive (which might require refactoring).

    When the service implementation needs access to details, we can enable this through protoc generator parameters. This could both enable the power API for the entire service, or per individual method.

    The generated 'powerful' signature will gain an HttpRequest or another class that wraps the request headers. We do not expect to need to change the response type, since the response can be manipulated by throwing an exception or failing the Future/Source and taking care of further details in the exception handler.

    server 
    opened by raboof 25
  • Play gRPC ScalaTest and Specs2 APIs

    Play gRPC ScalaTest and Specs2 APIs

    This code shows how to make a gRPC client that connects to a Play server during unit testing. Code has been written for both the ScalaTest and Specs2 Play test APIs.

    This code has been developed inside the Play Scala interop subproject for now. After merging we can as a separate step move it into a new project within akka-grpc, e.g. a new akka-grpc-play-testkit project. Eventually most of the code will move out into Play itself. For now we'll keep it in the akka-grpc project so that we can iterate on it more quickly.

    After this PR is completed we'll want to:

    1. add Play Java gRPC APIs
    2. update our example projects to use these APIs.
    play 
    opened by richdougherty 21
  • Grpc-web support

    Grpc-web support

    This is a full implementation of the grpc-web protocol variant(s), supporting the application/grpc-web and application/grpc-web media types. All current tests pass (testing only the grpc protocol) and basic grpc-web compatibility tests pass.

    References #695

    At the moment I'm doing a PR for this to get discussion on the implementation approach and some of the remaining items.

    Approach Taken:

    This is an implementation of grpc-web (binary and text variants) as a grpc variant (i.e. a slightly different physical version of the same logical protocol) as opposed to a grpc proxy. Essentially this involves abstracting the details of a GrpcVariant beyond the existing message encoding Codec and detecting/negotiating the GrpcProtocolUnmarshaller and GrpcProtocolMarshaller during the request/response. These are expressed in terms of a stream of logical gRPC frames (data or trailer) that are then mapped into a stream of (transfer encoding) chunks as appropriate to the protocol: grpc maps to Chunk and LastChunk, with the latter magicked into HTTP/2 trailers, and grpc-web maps both types to Chunks with a field type (and base64 encoding in the case of grpc-web-text).

    Refs:

    Discussion/interesting points:

    • This implementation approach allows grpc and grpc-web to be served in the same handler (i.e. from the same port), and probably with a mix of HTTP/2 and HTTP/1.1
    • The ServiceHandler functions to support grpc-web use [https://github.com/lomigmegard/akka-http-cors]. Maintainers may have some thoughts about whether they want to downstream that, or import/implement a minimal CORS implementation.
    • The codegen needed to be updated to allow protocol detection and unmarshaller/marshallers to be used properly - principally the negotiated marshaller needs to be used for exception/status responses as well as the main path, and the existing marshaller code calculated the codec in the generated handler without passing on the request/media type.
    • I've taken the approach of deprecating the marshall/unmarshall/exception handler functions that can't accomodate grpc-web, but left them in place to retain source/binary compatibility with existing codegen plugins and compiled handler code. I think I've only broken signatures that are not used from generated code (e.g. GrpcResponseHelpers).
    • It wouldn't take too much more work to support non +proto variants (e.g. application/grpc-web+json with the changes made. Would require a meaningful client implementation to make it worthwhile though, but grpc-web could get there soon.

    TODOs:

    • The generated Marshallers in the scala codegen have not been updated - not sure what these are for TBH
    • ServiceHandler in the javadsl is not updated to the new builder style that can serve grpc-web
    • Docs
    • Unit tests for new functions
    • Interop/integration test - have proven interop with [https://github.com/johanbrandhorst/grpc-web-compatibility-test] and will probably add akka-grpc backend to that project if this is merged, but not sure on best way to include an in-tree integration test. Probably using node or Karma to drive grpc-web in the existing interop framework would be an approach.
    • Most of the potential marshall/unmarshall paths are implemented, but reading grpc-web responses will require a multi-port shape on the stream to split off status trailers. In theory the AkkaGrpcClient could support grpc-web with minimal work.
    • Someone who knows CORS better than me should probably review the default config to confirm its minimal and safe.
    • As part of the rework, the response content types now adapt their compressibility depending on whether a compressed message encoding is used, which should allow HTTP level content compression to be used. This is notable as the Google grpc-web client only supports Identity encoding, as GZip in Javascript has poor performance, and gzip/deflate HTTP content compression is well supported. I haven't enabled this in the ServiceHandler functions at the moment, not being 100% sure what the best approach is.
    server grpc-web 
    opened by timw 20
  • Server-side power API #179

    Server-side power API #179

    Here's a draft, scala-only implementation of both #179 and #420.

    In AkkaGrpcPlugin.scala I added a new setting akkaGrpcGeneratorOptions with 2 options: ServerPowerApis to generate server power APIs, and UsePlayActions to generate a handler and router that implement Play's RequestHeader => EssentialAction instead of HttpRequest => Future[HttpResponse].

    The server power APIs are defined by a power API trait that extends the base trait and adds a MetadataMap parameter to each method.

    If this looks good I’ll work on the rest of the changes (Java implementation, etc.).

    opened by ctoomey 20
  • chore: rework ci

    chore: rework ci

    • use workspaces to share compiled sources and published plugins
    • rearrange stages
    • unify java and scala gradle plugin testing

    @raboof could you please check ? this is a follow up to #289

    References #289

    gradle 
    opened by eshepelyuk 19
  • Gradle plugin fails on task generateProto when using Windows 10

    Gradle plugin fails on task generateProto when using Windows 10

    Versions used

    akka-grpc-gradle-plugin:0.7.1

    Expected Behavior

    Have it generate the akka grpc files

    Actual Behavior

    Throws a FileNotFoundException

    Relevant logs

    > Configure project :interface
    [task ':interface:assemble', task ':interface:assembleDist', task ':interface:build', task ':interface:buildDependents', task ':interface:buildEnvironment', task ':interface:buildNeeded', task ':interface:check', task ':interface:classes', task ':interface:clean', task ':interface:compileJava', task ':interface:compileScala', task ':interface:compileTestJava', task ':interface:compileTestScala', task ':interface:components', task ':interface:dependencies', task ':interface:dependencyInsight', task ':interface:dependentComponents', task ':interface:distTar', task ':interface:distZip', task ':interface:help', task ':interface:installDist', task ':interface:jar', task ':interface:javadoc', task ':interface:model', task ':interface:processResources', task ':interface:processTestResources', task ':interface:projects', task ':interface:properties', task ':interface:run', task ':interface:scaladoc', task ':interface:startScripts', task ':interface:tasks', task ':interface:test', task ':interface:testClasses']
    
    > Task :interface:extractIncludeProto UP-TO-DATE
    > Task :interface:extractProto UP-TO-DATE
    > Task :interface:generateProto FAILED
    
    FAILURE: Build failed with an exception.
    
    * What went wrong:
    Execution failed for task ':interface:generateProto'.
    > protoc: stdout: . stderr: D:\interface\src\main\proto: warning: directory does not exist.
      D:\interface\app\protobuf: warning: directory does not exist.
      D:\interface\app\proto: warning: directory does not exist.
      Exception in thread "main" java.io.FileNotFoundException: \Users\<User>\AppData\Local\Temp\akka-grpc-gradle6625443006303105175.log (Het systeem kan het opgegeven pad niet vinden)
      	at java.base/java.io.FileOutputStream.open0(Native Method)
      	at java.base/java.io.FileOutputStream.open(FileOutputStream.java:298)
      	at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:237)
      	at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:187)
      	at java.base/java.io.PrintWriter.<init>(PrintWriter.java:208)
      	at java.base/java.io.PrintWriter.<init>(PrintWriter.java:248)
      	at akka.grpc.gen.FileLogger.<init>(Logging.scala:35)
      	at akka.grpc.gen.Main$.$anonfun$logger$1(Main.scala:48)
      	at scala.Option.map(Option.scala:163)
      	at akka.grpc.gen.Main$.delayedEndpoint$akka$grpc$gen$Main$1(Main.scala:48)
      	at akka.grpc.gen.Main$delayedInit$body.apply(Main.scala:14)
      	at scala.Function0.apply$mcV$sp(Function0.scala:39)
      	at scala.Function0.apply$mcV$sp$(Function0.scala:39)
      	at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:17)
      	at scala.App.$anonfun$main$1$adapted(App.scala:80)
      	at scala.collection.immutable.List.foreach(List.scala:392)
      	at scala.App.main(App.scala:80)
      	at scala.App.main$(App.scala:78)
      	at akka.grpc.gen.Main$.main(Main.scala:14)
      	at akka.grpc.gen.Main.main(Main.scala)
      --akkaGrpc_out: protoc-gen-akkaGrpc: Plugin failed with status code 1.
    
    

    Reproducible Test Case

    Define a protofile and use the gradle plugin. My configuration:

    buildscript {
        repositories {
            mavenLocal()
            gradlePluginPortal()
        }
        dependencies {
            classpath 'gradle.plugin.com.lightbend.akka.grpc:akka-grpc-gradle-plugin:0.7.1'
        }
    }
    plugins {
        id 'scala'
        id 'application'
    }
    apply plugin: 'com.lightbend.akka.grpc.gradle'
    akkaGrpc {
        language = "Scala"
        generateClient = false
        generateServer = true
    }
    repositories {
        mavenLocal()
        mavenCentral()
    }
    

    Possible fix

    I've created a fix that works for my machine @ https://github.com/hithran/akka-grpc/commit/e8c71936f94c787f79c1654c78557f376b1eae4c But I'm curious to here if it still works for @mlangc who originally wrote the fix for logging.

    gradle windows 
    opened by hithran 19
  • Akka grpc maven don't have an option to add extra generators as like sbt

    Akka grpc maven don't have an option to add extra generators as like sbt

    Versions used

    1.0.1

    Expected Behavior

    Should be able to add play java code generator in extra generators settings like in sbt

    Actual Behavior

    No option to add extra generators in maven pom file

    help wanted maven docs 
    opened by venkatt007 17
  • Add gRPC reflection support

    Add gRPC reflection support

    Can't figure out how easily enable gRPC reflection in akka-grpc. Please provide documentation if it's possible to do now or add this feature.

    @see https://github.com/grpc/grpc-java/blob/master/documentation/server-reflection-tutorial.md

    opened by ds-kibalchish 16
  • akka dns service discovery not refreshing after ttl

    akka dns service discovery not refreshing after ttl

    Versions used

    Akka version: 2.6.10 Akka http: 10.2.10 Akka grpc: 2.1.6

    Expected Behavior

    When using service discovery with akka-dns in DNS based, every client will "continuously" refresh DNS for new instances to load balance against.

    Actual Behavior

    The last connected client will query DNS for new pods whereas the other clients will only refresh on scale downs or restarts, never on scale ups. Easy to observe when in debug with Lookup being called.

    opened by Marcus-Rosti 1
  • Client using netty backend cannot work with TLS and a custom SslContext

    Client using netty backend cannot work with TLS and a custom SslContext

    Versions used

    sbt-akka-grpc @ 2.1.6

    Akka version: akka @ 2.6.20

    Expected Behavior

    gRPC client with TLS enabled using the netty backend is able to properly connect

    Actual Behavior

    An exception is thrown by netty's GrpcSslContexts.ensureAlpnAndH2Enabled:

    ALPN must be enabled and list HTTP/2 as a supported protocol.
    

    Relevant logs

    See above

    Reproducible Test Case

    Not a public repo so no PR to share


    As far as I can tell, these issues are related to this piece of code:

    new JdkSslContext(
          javaSslContext,
          /* boolean isClient */ true,
          /* Iterable<String> ciphers */ null, // use JDK defaults (null is accepted as indicated in constructor Javadoc)
          IdentityCipherSuiteFilter.INSTANCE,
          /* ApplicationProtocolConfig apn */ ApplicationProtocolConfig.DISABLED, // use JDK default (null would also be acceptable, DISABLED config will select the NONE protocol and thus the JdkDefaultApplicationProtocolNegotiator)
          ClientAuth.NONE, // server-only option, which is ignored as isClient=true (as indicated in constructor Javadoc)
          /* String[] protocols */ null, // use JDK defaults (null is accepted as indicated in constructor Javadoc)
          /* boolean startTls */ false)
    

    and more specifically, this line:

     /* ApplicationProtocolConfig apn */ ApplicationProtocolConfig.DISABLED, // use JDK default (null would also be acceptable, DISABLED config will select the NONE protocol and thus the JdkDefaultApplicationProtocolNegotiator)
    

    If the comment is to be trusted, JdkDefaultApplicationProtocolNegotiator will be used and that negotiator provides an empty list of protocols, triggering the above GrpcSslContexts.ensureAlpnAndH2Enabled check to fail.

    To me it seems that since 2.1.6 there's no way to provide a custom SslContext context via GrpcClientSettings.withSslContext and have a working client (in other words, breaking change in #1462) or did I miss something?

    opened by sndnv 6
  • Update compilerplugin, scalapb-runtime to 0.11.12

    Update compilerplugin, scalapb-runtime to 0.11.12

    Updates

    from 0.11.11 to 0.11.12. GitHub Release Notes - Changelog - Version Diff

    I'll automatically update this PR to resolve conflicts as long as you don't change it yourself.

    If you'd like to skip this version, you can just close this PR. If you have any feedback, just mention me in the comments below.

    Configure Scala Steward for your repository with a .scala-steward.conf file.

    Have a fantastic day writing Scala!

    Adjust future updates

    Add this to your .scala-steward.conf file to ignore future updates of this dependency:

    updates.ignore = [ { groupId = "com.thesamet.scalapb" } ]
    

    Or, add this to slow down future updates of this dependency:

    dependencyOverrides = [{
      pullRequests = { frequency = "@monthly" },
      dependency = { groupId = "com.thesamet.scalapb" }
    }]
    

    labels: library-update, early-semver-minor, semver-spec-patch, commit-count:1

    update 
    opened by scala-steward 0
  • Update grpc-core, grpc-interop-testing, ... to 1.48.2

    Update grpc-core, grpc-interop-testing, ... to 1.48.2

    Updates

    from 1.48.1 to 1.48.2. GitHub Release Notes - Version Diff

    I'll automatically update this PR to resolve conflicts as long as you don't change it yourself.

    If you'd like to skip this version, you can just close this PR. If you have any feedback, just mention me in the comments below.

    Configure Scala Steward for your repository with a .scala-steward.conf file.

    Have a fantastic day writing Scala!

    Files still referring to the old version number

    The following files still refer to the old version number (1.48.1). You might want to review and update them manually.

    gradle-plugin/src/main/groovy/akka/grpc/gradle/AkkaGrpcPluginExtension.groovy
    
    Adjust future updates

    Add this to your .scala-steward.conf file to ignore future updates of this dependency:

    updates.ignore = [ { groupId = "io.grpc" } ]
    

    Or, add this to slow down future updates of this dependency:

    dependencyOverrides = [{
      pullRequests = { frequency = "@monthly" },
      dependency = { groupId = "io.grpc" }
    }]
    

    labels: library-update, early-semver-patch, semver-spec-patch, old-version-remains, commit-count:1

    sbt update 
    opened by scala-steward 0
  • Very slow first request

    Very slow first request

    Something with the Netty based client process id autodetection done by Netty, and more specifically io.grpc.netty.shaded.io.netty.channel.DefaultChannelId. No clear way to reproduce.

    More details: https://github.com/lightbend/kalix-jvm-sdk/issues/1149

    bug 
    opened by johanandren 1
Releases(v2.2.1)
SCG used as as proxy to connect gRPC-Web and back end gRPC services

gRPC-Web Spring Cloud Gateway Spring Cloud Gateway 3.1.1 supports for gRPC and HTTP/2. It is possible to use Spring Cloud Gateway to connect gRPC-Web

null 1 Apr 4, 2022
Nifty is an implementation of Thrift clients and servers on Netty

his project is archived and no longer maintained. At the time of archiving, open issues and pull requests were clo

Meta Archive 902 Sep 9, 2022
Unconventional Java code for building web servers / services without a framework.

Unconventional Java code for building web servers / services without a framework. Think dropwizard but as a seed project instead of a framework. If this project had a theme it would be break the rules but be mindful of your decisions.

StubbornJava 227 Nov 15, 2022
Tools for keeping your cloud operating in top form. Chaos Monkey is a resiliency tool that helps applications tolerate random instance failures.

PROJECT STATUS: RETIRED The Simian Army project is no longer actively maintained. Some of the Simian Army functionality has been moved to other Netfli

Netflix, Inc. 7.9k Jan 6, 2023
The Java gRPC implementation. HTTP/2 based RPC

gRPC-Java - An RPC library and framework gRPC-Java works with JDK 7. gRPC-Java clients are supported on Android API levels 16 and up (Jelly Bean and l

grpc 10.2k Jan 1, 2023
Reactive stubs for gRPC

What is reactive-grpc? Reactive gRPC is a suite of libraries for using gRPC with Reactive Streams programming libraries. Using a protocol buffers comp

Salesforce 758 Dec 22, 2022
Book Finder application is a client-server application (gRPC) for educational purposes.

Book-Finder Book Finder application is a client-server application (gRPC) for educational purposes. Instalation These projects (Client/Server) are Mav

Mihai-Lucian Rîtan 21 Oct 27, 2022
gRPC Facade for Transactional Keyvalue Stores

lionrock An implementation agnostic client/server communication protocol (using protobuf and grpc) inspired heavily by FoundationDB (https://github.co

Clement Pang 23 Dec 8, 2022
JNetcat : a tool to debug network issues or simulate servers

JNetcat A tool to easily debug or monitor traffic on TCP/UDP and simulate a server or client No need of telnet anymore to test for a remote connection

io-panic 3 Jul 26, 2022
A network core plugin for the Spigot which best Experience for Minecraft Servers.

tCore The core plugin for Spigot. (Supports 1.8.8<=) 大規模サーバー、ネットワーク等の中核となるプラグインです。プロトコルバージョン 1.8 未満での動作は確認していません。かなりの量のソースになりますが、様々な機能が実装されています。中身自体は過

null 6 Oct 13, 2022
A public bot for Discord servers 🥶

Public sample bot for Discord servers ?? Bot is written in Java 16, currently there is only verification in the bot, but if someone knows at least the

Kacper 8 Jul 7, 2022
Remote Support Tool is an easy single click solution for remote maintenance.

Remote Support Tool is an easy single click solution for remote maintenance.

OpenIndex.de 74 Jun 13, 2022
Java library for representing, parsing and encoding URNs as in RFC2141 and RFC8141

urnlib Java library for representing, parsing and encoding URNs as specified in RFC 2141 and RFC 8141. The initial URN RFC 2141 of May 1997 was supers

SLUB 24 May 10, 2022
Pcap editing and replay tools for *NIX and Windows - Users please download source from

Tcpreplay Tcpreplay is a suite of GPLv3 licensed utilities for UNIX (and Win32 under Cygwin) operating systems for editing and replaying network traff

AppNeta, Inc. 956 Dec 30, 2022
Android application allowing to sniff and inject Zigbee, Mosart and Enhanced ShockBurst packets on a Samsung Galaxy S20

RadioSploit 1.0 This Android application allows to sniff and inject Zigbee, Mosart and Enhanced ShockBurst packets from a Samsung Galaxy S20 smartphon

Romain Cayre 52 Nov 1, 2022
Telegram API Client and Telegram BOT API Library and Framework in Pure java.

Javagram Telegram API Client and Telegram Bot API library and framework in pure Java. Hello Telegram You can use Javagram for both Telegram API Client

Java For Everything 3 Oct 17, 2021
Fibers and actors for web development

COMSAT Scalable, Concurrent Web Apps Getting started Add the following Maven/Gradle dependencies: Feature Artifact Servlet integration for defining fi

Parallel Universe 600 Dec 23, 2022
An annotation-based Java library for creating Thrift serializable types and services.

Drift Drift is an easy-to-use, annotation-based Java library for creating Thrift clients and serializable types. The client library is similar to JAX-

null 225 Dec 24, 2022