mirror of
https://github.com/logos-messaging/logos-messaging-nim.git
synced 2026-01-07 08:23:08 +00:00
* Separate new lightpush protocol New RPC defined Rename al occurence of old lightpush to legacy lightpush, fix rest tests of lightpush New lightpush protocol added back Setup new lightpush protocol, mounting and rest api for it modified: apps/chat2/chat2.nim modified: tests/node/test_wakunode_lightpush.nim modified: tests/node/test_wakunode_sharding.nim modified: tests/test_peer_manager.nim modified: tests/test_wakunode_lightpush.nim renamed: tests/waku_lightpush/lightpush_utils.nim -> tests/waku_lightpush_legacy/lightpush_utils.nim renamed: tests/waku_lightpush/test_all.nim -> tests/waku_lightpush_legacy/test_all.nim renamed: tests/waku_lightpush/test_client.nim -> tests/waku_lightpush_legacy/test_client.nim renamed: tests/waku_lightpush/test_ratelimit.nim -> tests/waku_lightpush_legacy/test_ratelimit.nim modified: tests/wakunode_rest/test_all.nim renamed: tests/wakunode_rest/test_rest_lightpush.nim -> tests/wakunode_rest/test_rest_lightpush_legacy.nim modified: waku/factory/node_factory.nim modified: waku/node/waku_node.nim modified: waku/waku_api/rest/admin/handlers.nim modified: waku/waku_api/rest/builder.nim new file: waku/waku_api/rest/legacy_lightpush/client.nim new file: waku/waku_api/rest/legacy_lightpush/handlers.nim new file: waku/waku_api/rest/legacy_lightpush/types.nim modified: waku/waku_api/rest/lightpush/client.nim modified: waku/waku_api/rest/lightpush/handlers.nim modified: waku/waku_api/rest/lightpush/types.nim modified: waku/waku_core/codecs.nim modified: waku/waku_lightpush.nim modified: waku/waku_lightpush/callbacks.nim modified: waku/waku_lightpush/client.nim modified: waku/waku_lightpush/common.nim modified: waku/waku_lightpush/protocol.nim modified: waku/waku_lightpush/rpc.nim modified: waku/waku_lightpush/rpc_codec.nim modified: waku/waku_lightpush/self_req_handler.nim new file: waku/waku_lightpush_legacy.nim renamed: waku/waku_lightpush/README.md -> waku/waku_lightpush_legacy/README.md new file: waku/waku_lightpush_legacy/callbacks.nim new file: waku/waku_lightpush_legacy/client.nim new file: waku/waku_lightpush_legacy/common.nim new file: waku/waku_lightpush_legacy/protocol.nim new file: waku/waku_lightpush_legacy/protocol_metrics.nim new file: waku/waku_lightpush_legacy/rpc.nim new file: waku/waku_lightpush_legacy/rpc_codec.nim new file: waku/waku_lightpush_legacy/self_req_handler.nim Adapt to non-invasive libp2p observers cherry pick latest lightpush (v1) changes into legacy lightpush code after rebase to latest master Fix vendor dependencies from origin/master after failed rebase of them Adjust examples, test to new lightpush - keep using of legacy Fixup error code mappings Fix REST admin interface with distinct legacy and new lightpush Fix lightpush v2 tests * Utilize new publishEx interface of pubsub libp2p * Adapt to latest libp2p pubslih design changes. publish returns an outcome as Result error. * Fix review findings * Fix tests, re-added lost one * Fix rebase * Apply suggestions from code review Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com> * Addressing review comments * Fix incentivization tests * Fix build failed on libwaku * Change new lightpush endpoint version to 3 instead of 2. Noticed that old and new lightpush metrics can cause trouble in monitoring dashboards so decided to give new name as v3 for the new lightpush metrics and change legacy ones back - temporarly till old lightpush will be decommissioned * Fixing flaky test with rate limit timing * Fixing logscope of lightpush and legacy lightpush --------- Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com>
198 lines
6.9 KiB
Nim
198 lines
6.9 KiB
Nim
{.push raises: [].}
|
|
|
|
import net, tables
|
|
import presto
|
|
import
|
|
waku/waku_node,
|
|
waku/discovery/waku_discv5,
|
|
waku/factory/external_config,
|
|
waku/waku_api/message_cache,
|
|
waku/waku_api/handlers,
|
|
waku/waku_api/rest/server,
|
|
waku/waku_api/rest/debug/handlers as rest_debug_api,
|
|
waku/waku_api/rest/relay/handlers as rest_relay_api,
|
|
waku/waku_api/rest/filter/handlers as rest_filter_api,
|
|
waku/waku_api/rest/legacy_lightpush/handlers as rest_legacy_lightpush_api,
|
|
waku/waku_api/rest/lightpush/handlers as rest_lightpush_api,
|
|
waku/waku_api/rest/store/handlers as rest_store_api,
|
|
waku/waku_api/rest/legacy_store/handlers as rest_store_legacy_api,
|
|
waku/waku_api/rest/health/handlers as rest_health_api,
|
|
waku/waku_api/rest/admin/handlers as rest_admin_api,
|
|
waku/waku_core/topics
|
|
|
|
## Monitoring and external interfaces
|
|
|
|
# Used to register api endpoints that are not currently installed as keys,
|
|
# values are holding error messages to be returned to the client
|
|
# NOTE: {.threadvar.} is used to make the global variable GC safe for the closure uses it
|
|
# It will always be called from main thread anyway.
|
|
# Ref: https://nim-lang.org/docs/manual.html#threads-gc-safety
|
|
var restServerNotInstalledTab {.threadvar.}: TableRef[string, string]
|
|
restServerNotInstalledTab = newTable[string, string]()
|
|
|
|
proc startRestServerEsentials*(
|
|
nodeHealthMonitor: WakuNodeHealthMonitor, conf: WakuNodeConf
|
|
): Result[WakuRestServerRef, string] =
|
|
if not conf.rest:
|
|
return ok(nil)
|
|
|
|
let requestErrorHandler: RestRequestErrorHandler = proc(
|
|
error: RestRequestError, request: HttpRequestRef
|
|
): Future[HttpResponseRef] {.async: (raises: [CancelledError]).} =
|
|
try:
|
|
case error
|
|
of RestRequestError.Invalid:
|
|
return await request.respond(Http400, "Invalid request", HttpTable.init())
|
|
of RestRequestError.NotFound:
|
|
let paths = request.rawPath.split("/")
|
|
let rootPath =
|
|
if len(paths) > 1:
|
|
paths[1]
|
|
else:
|
|
""
|
|
restServerNotInstalledTab[].withValue(rootPath, errMsg):
|
|
return await request.respond(Http404, errMsg[], HttpTable.init())
|
|
do:
|
|
return await request.respond(
|
|
Http400,
|
|
"Bad request initiated. Invalid path or method used.",
|
|
HttpTable.init(),
|
|
)
|
|
of RestRequestError.InvalidContentBody:
|
|
return await request.respond(Http400, "Invalid content body", HttpTable.init())
|
|
of RestRequestError.InvalidContentType:
|
|
return await request.respond(Http400, "Invalid content type", HttpTable.init())
|
|
of RestRequestError.Unexpected:
|
|
return defaultResponse()
|
|
except HttpWriteError:
|
|
error "Failed to write response to client", error = getCurrentExceptionMsg()
|
|
discard
|
|
|
|
return defaultResponse()
|
|
|
|
let allowedOrigin =
|
|
if len(conf.restAllowOrigin) > 0:
|
|
some(conf.restAllowOrigin.join(","))
|
|
else:
|
|
none(string)
|
|
|
|
let address = conf.restAddress
|
|
let port = Port(conf.restPort + conf.portsShift)
|
|
let server =
|
|
?newRestHttpServer(
|
|
address,
|
|
port,
|
|
allowedOrigin = allowedOrigin,
|
|
requestErrorHandler = requestErrorHandler,
|
|
)
|
|
|
|
## Health REST API
|
|
installHealthApiHandler(server.router, nodeHealthMonitor)
|
|
|
|
restServerNotInstalledTab["admin"] =
|
|
"/admin endpoints are not available while initializing."
|
|
restServerNotInstalledTab["debug"] =
|
|
"/debug endpoints are not available while initializing."
|
|
restServerNotInstalledTab["relay"] =
|
|
"/relay endpoints are not available while initializing."
|
|
restServerNotInstalledTab["filter"] =
|
|
"/filter endpoints are not available while initializing."
|
|
restServerNotInstalledTab["lightpush"] =
|
|
"/lightpush endpoints are not available while initializing."
|
|
restServerNotInstalledTab["store"] =
|
|
"/store endpoints are not available while initializing."
|
|
|
|
server.start()
|
|
info "Starting REST HTTP server", url = "http://" & $address & ":" & $port & "/"
|
|
|
|
ok(server)
|
|
|
|
proc startRestServerProtocolSupport*(
|
|
restServer: WakuRestServerRef,
|
|
node: WakuNode,
|
|
wakuDiscv5: WakuDiscoveryV5,
|
|
conf: WakuNodeConf,
|
|
): Result[void, string] =
|
|
if not conf.rest:
|
|
return ok()
|
|
|
|
var router = restServer.router
|
|
## Admin REST API
|
|
if conf.restAdmin:
|
|
installAdminApiHandlers(router, node)
|
|
else:
|
|
restServerNotInstalledTab["admin"] =
|
|
"/admin endpoints are not available. Please check your configuration: --rest-admin=true"
|
|
|
|
## Debug REST API
|
|
installDebugApiHandlers(router, node)
|
|
|
|
## Relay REST API
|
|
if conf.relay:
|
|
let cache = MessageCache.init(int(conf.restRelayCacheCapacity))
|
|
|
|
let handler = messageCacheHandler(cache)
|
|
|
|
for shard in conf.shards:
|
|
let pubsubTopic = $RelayShard(clusterId: conf.clusterId, shardId: shard)
|
|
cache.pubsubSubscribe(pubsubTopic)
|
|
node.subscribe((kind: PubsubSub, topic: pubsubTopic), some(handler))
|
|
|
|
for contentTopic in conf.contentTopics:
|
|
cache.contentSubscribe(contentTopic)
|
|
node.subscribe((kind: ContentSub, topic: contentTopic), some(handler))
|
|
|
|
installRelayApiHandlers(router, node, cache)
|
|
else:
|
|
restServerNotInstalledTab["relay"] =
|
|
"/relay endpoints are not available. Please check your configuration: --relay"
|
|
|
|
## Filter REST API
|
|
if conf.filternode != "" and node.wakuFilterClient != nil:
|
|
let filterCache = MessageCache.init()
|
|
|
|
let filterDiscoHandler =
|
|
if not wakuDiscv5.isNil():
|
|
some(defaultDiscoveryHandler(wakuDiscv5, Filter))
|
|
else:
|
|
none(DiscoveryHandler)
|
|
|
|
rest_filter_api.installFilterRestApiHandlers(
|
|
router, node, filterCache, filterDiscoHandler
|
|
)
|
|
else:
|
|
restServerNotInstalledTab["filter"] =
|
|
"/filter endpoints are not available. Please check your configuration: --filternode"
|
|
|
|
## Store REST API
|
|
let storeDiscoHandler =
|
|
if not wakuDiscv5.isNil():
|
|
some(defaultDiscoveryHandler(wakuDiscv5, Store))
|
|
else:
|
|
none(DiscoveryHandler)
|
|
|
|
rest_store_api.installStoreApiHandlers(router, node, storeDiscoHandler)
|
|
rest_store_legacy_api.installStoreApiHandlers(router, node, storeDiscoHandler)
|
|
|
|
## Light push API
|
|
## Install it either if lightpushnode (lightpush service node) is configured and client is mounted)
|
|
## or install it to be used with self-hosted lightpush service
|
|
if (conf.lightpushnode != "" and node.wakuLegacyLightpushClient != nil) or
|
|
(conf.lightpush and node.wakuLegacyLightPush != nil and node.wakuRelay != nil):
|
|
let lightDiscoHandler =
|
|
if not wakuDiscv5.isNil():
|
|
some(defaultDiscoveryHandler(wakuDiscv5, Lightpush))
|
|
else:
|
|
none(DiscoveryHandler)
|
|
|
|
rest_legacy_lightpush_api.installLightPushRequestHandler(
|
|
router, node, lightDiscoHandler
|
|
)
|
|
rest_lightpush_api.installLightPushRequestHandler(router, node, lightDiscoHandler)
|
|
else:
|
|
restServerNotInstalledTab["lightpush"] =
|
|
"/lightpush endpoints are not available. Please check your configuration: --lightpushnode"
|
|
|
|
info "REST services are installed"
|
|
return ok()
|