Skip to content

Commit

Permalink
Adaptation pour nouvelle version serveur WS Constellation
Browse files Browse the repository at this point in the history
  • Loading branch information
julienmalard committed Jul 4, 2024
1 parent cd85491 commit 4998837
Show file tree
Hide file tree
Showing 10 changed files with 54 additions and 59 deletions.
3 changes: 2 additions & 1 deletion DESCRIPTION
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,11 @@ Imports:
processx,
dplyr,
tibble,
httr2,
Language: fr
Encoding: UTF-8
LazyData: true
Suggests:
testthat (>= 3.0.0)
Config/testthat/edition: 3
RoxygenNote: 7.2.3
RoxygenNote: 7.3.2
1 change: 1 addition & 0 deletions NAMESPACE
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@ import(jsonlite)
import(processx)
import(dplyr)
import(tibble)
import(httr2)
28 changes: 22 additions & 6 deletions R/client.R
Original file line number Diff line number Diff line change
Expand Up @@ -48,19 +48,31 @@ Client <- R6Class(
public = list(
#'
#' @param port Le numéro du port local sur lequel le serveur est ouvert, et auquel le client se connectera.
#' @param codeSecret Le code secret pour pouvoir se connecter au serveur.
#'
initialize = function(
port
port,
codeSecret=NULL
) {
Sys.sleep(2)
private$ws <- websocket::WebSocket$new(paste("ws://localhost:", as.character(port), sep=""), autoConnect = FALSE)

if (is.null(codeSecret)) {
requèteCode <- httr2::request(paste("http://localhost/demande?id=Client R ", as.character(sample(1000:9999, 1)[1]), as.character(port), sep=""))
réponse <- httr2::req_perform(requèteCode)
codeSecret <- httr2::resp_body_string(réponse)
}
urlWs <- paste("ws://localhost:", as.character(port), "?code=", utils::URLencode(codeSecret), sep="")
print(urlWs)
private$ws <- websocket::WebSocket$new(urlWs, autoConnect = FALSE)

ouvert <- FALSE
private$ws$onOpen(function(event) {
print("ws ouverte")
ouvert <<- TRUE
})

private$ws$onMessage(function(event) {
print(event$data)
m <- jsonlite::fromJSON(event$data, simplifyDataFrame = FALSE)
écouteur <- private$écouteurs[[m$id]]
if (is.null(écouteur)) {
Expand Down Expand Up @@ -126,7 +138,9 @@ Client <- R6Class(
})

Sys.sleep(1)
print("on va connecter")
private$ws$connect()
print("on est connecté")
Sys.sleep(2)

retry::wait_until(isTRUE(ouvert), timeout = 30)
Expand Down Expand Up @@ -400,10 +414,11 @@ Client <- R6Class(

avecClientEtServeur <- function(code, ...) {
résultat <- avecServeur(
function(port) {
function(port, codeSecret) {
résultatClient <- avecClient(
code,
port
port,
codeSecret
)

return(résultatClient)
Expand All @@ -420,12 +435,13 @@ avecClientEtServeur <- function(code, ...) {
#'
#' @param code Le code à exécuter. Ce code doit être une fonction qui prend le `client` Constellation comme unique paramètre.
#' @param port Le port du serveur déjà ouvert.
#' @param codeSecret Le code secret pour se connecter au serveur.
#'
#' @return Le résultat de la fonction `code`.
#' @export

avecClient <- function(code, port) {
client <- Client$new(port)
avecClient <- function(code, port, codeSecret) {
client <- Client$new(port, codeSecret)
résultatClient <- tryCatch(
{
code(client)
Expand Down
26 changes: 8 additions & 18 deletions R/serveur.R
Original file line number Diff line number Diff line change
Expand Up @@ -12,26 +12,13 @@ obtVersionServeur <- function(exe = "constl") {
return(version)
}

#' Obtenir la version installée de l'IPA Constellation
#'
#' @param exe La commande pour lancer Constellation. Uniquement nécessaire pour une installation de Constellation non standard
#'
#' @return La version de l'IPA Constellation
#' @export
#'

obtVersionIPAConstellation <- function(exe = "constl") {
version <- system2(exe, c("v-constl"), stdout = TRUE)
return(version)
}

#' Installer Constellation sur votre système. Nécessite Node.js (https://nodejs.org/fr) et pnpm (https://pnpm.io/)
#'
#' @return Rien
#' @export

installerConstellation <- function() {
system2("pnpm", c("i", "--global", "@constl/ipa", "@constl/serveur"), stdout = TRUE)
system2("curl", c("https://raw.githubusercontent.com/reseau-constellation/serveur-ws/principale/installer.cjs", "|", "node", "-"), stdout = TRUE)
}

#' Lancer un serveur Constellation local
Expand Down Expand Up @@ -69,6 +56,7 @@ lancerServeur <- function(port=NULL, dossier = NULL, exe = "constl") {
p$poll_io(5000)

résultat <- p$read_output_lines()

if (!length(résultat)) {break}

for (l in length(résultat)) {
Expand All @@ -81,22 +69,24 @@ lancerServeur <- function(port=NULL, dossier = NULL, exe = "constl") {

if (messageMachine$type == "NŒUD PRÊT") {
portFinal <- as.numeric(messageMachine$port)
codeSecret <- messageMachine$codeSecret
break
}
}
}
}

if (is.null(portFinal)) {
if (is.null(portFinal) || is.null(codeSecret)) {
stop("Serveur mal initialisé.")
}

fermer <- function() {
p$write_input("\n", sep = "\n")
p$write_input("\n", sep="\n")
p$wait(2)
p$kill()
}

return(list(port=portFinal, fermer=fermer))
return(list(port=portFinal, codeSecret=codeSecret, fermer=fermer))
}

#' Exécuter du code dans le contexte d'un serveur Constellation, et fermer le serveur par la suite.
Expand All @@ -111,7 +101,7 @@ avecServeur <- function(code, ...) {
serveur <- lancerServeur(...)
résultat <- tryCatch(
{
code(serveur$port)
code(serveur$port, serveur$codeSecret)
},
error = function(cond) {
message(cond)
Expand Down
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ constellationR::avecClientEtServeur(
)
```

C'est même chose pour les fonctions de recherche :
C'est la même chose pour les fonctions de recherche :

``` r
library(constellationR)
Expand Down Expand Up @@ -132,12 +132,14 @@ library(constellationR)

// Le numéro du port sur lequel vous avez lancé Constellation
port <- 5003
codeSecret <- "le code secret que le serveur vous a donnée afin de vous connecter"

constellationR::avecClient(
function(client) {
// Faire quelque chose avec le client...
},
port = port
port = port,
codeSecret = codeSecret
)

```
6 changes: 4 additions & 2 deletions man/Client.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion man/avecClient.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 0 additions & 17 deletions man/obtVersionIPAConstellation.Rd

This file was deleted.

3 changes: 1 addition & 2 deletions tests/testthat/test-client.R
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ avecClientEtServeurTest <- function(code) {

# Effacer le dossier temporaire une fois qu'on a fini
on.exit(unlink(dossier, recursive = TRUE), add = TRUE)

résultat <- constellationR::avecClientEtServeur(
code,
dossier = dossier,
Expand All @@ -15,7 +14,6 @@ avecClientEtServeurTest <- function(code) {

avecClientEtServeurTest(
function (client) {

testthat::test_that("Actions", {
idCompte <- client$action("obtIdCompte")
testthat::expect_equal(class(idCompte), "character")
Expand Down Expand Up @@ -221,3 +219,4 @@ avecClientEtServeurTest(
})
}
)

19 changes: 9 additions & 10 deletions tests/testthat/test-serveur.R
Original file line number Diff line number Diff line change
Expand Up @@ -23,23 +23,18 @@ testthat::test_that("obtenir version serveur", {
expect_equal(length(strsplit(version, "\\.")[[1]]), 3)
})

testthat::test_that("obtenir version ipa", {
version <- constellationR::obtVersionIPAConstellation()
expect_equal(length(strsplit(version, "\\.")[[1]]), 3)
})


testthat::test_that("lancer serveur", {
avecServeurTest(
function(port) {
function(port, codeSecret) {
expect_equal(class(port), "numeric")
expect_equal(class(codeSecret), "character")
}
)
})

testthat::test_that("lancer serveur port spécifié", {
avecServeurTest(
function(port) {
function(port, codeSecret) {
expect_equal(port, 5123)
},
port=5123
Expand All @@ -49,8 +44,12 @@ testthat::test_that("lancer serveur port spécifié", {
testthat::test_that("lancer serveur dossier Constellation spécifié", {
dossier <- file.path(tempdir(), "monDossierConstellation")
avecServeurTest(
function (port) {
testthat::expect_true(dir.exists(dossier))
function (port, codeSecret) {
retry::wait_until(
dir.exists(dossier),
timeout = 5
)
testthat::expect_true(dir.exists(dossier))
},
dossier = dossier
)
Expand Down

0 comments on commit 4998837

Please sign in to comment.