12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- package main
- import (
- "context"
- "fmt"
- "log"
- "os"
- "sync"
- "sync/atomic"
- "time"
- "git.ali33.ru/fcg-xvii/go-tools/json"
- )
- var (
- idContext int32 = 0
- contextStore = new(sync.Map)
- )
- func getContextID() int {
- return int(atomic.AddInt32(&idContext, 1))
- }
- func messageIncoming(mes *Message) {
- mData := mes.Data()
- if mData.String("type", "") == "event" {
- // event
- } else {
- command := mData.String("command", "")
- switch command {
- case "method":
- log.Println("METHOD")
- randomNum, check := checkBigInt(mes, "random_num")
- if !check {
- //randomNum = big.NewInt(1000000)
- return
- }
- message := mData.String(
- "message",
- "Демонстрация работы алгоритмов шифрования Диффи-Хеллмана и Эль-Гамаля на эллиптических кривых и атаки на них.",
- )
- deadline := time.Now().Add(time.Duration(mData.Int("deadline_sec", 600)) * time.Second)
- contextID := getContextID()
- mes.SendResponse(json.Map{
- "context_id": contextID,
- "random_num": randomNum,
- "deadline": deadline.Unix(),
- "message": message,
- })
- ctx, cancel := context.WithDeadline(mes.Client().Context(), deadline)
- contextStore.Store(contextID, cancel)
- go func() {
- cl := mes.Client()
- for e := range MethodCurve(randomNum, message, ctx, contextID) {
- cl.SendSingle(e.Map())
- }
- log.Println("CONTEXT_STOPPED", contextID)
- }()
- case "context_stop":
- contextID := mData.Int32("context_id", -1)
- if contextID == -1 {
- mes.SendResponse(json.Map{
- "error": true,
- "text": "Ожидается context_id",
- })
- return
- }
- cancel, check := contextStore.LoadAndDelete(contextID)
- if !check {
- mes.SendResponse(json.Map{
- "error": true,
- "text": fmt.Sprintf("контекст [ %s ] не найден", contextID),
- })
- return
- }
- cancel.(context.CancelFunc)()
- mes.SendResponse(json.Map{
- "context_id": contextID,
- "text": "Контекст остановлен",
- })
- case "exit":
- os.Exit(0)
- default:
- if mes.IsResponsable() {
- mes.SendResponse(json.Map{
- "error": true,
- "text": fmt.Sprintf("команда [ %s ] не найдена", command),
- })
- }
- }
- }
- mData.LogPretty()
- }
|