Есть ли в DAML SDK webhook, который может собирать данные о созданных транзакциях

Самый простой способ, если вы просто хотите взломать этот код, - зайти в recorderWorker.js и взломать функцию exportWAV () примерно так:

function exportWAV(type){
    var bufferL = mergeBuffers(recBuffersL, recLength);
    var bufferR = mergeBuffers(recBuffersR, recLength);
    var interleaved = interleave(bufferL, bufferR);
    var dataview = encodeWAV(interleaved);
    var audioBlob = new Blob([dataview], { type: type });

    var xhr=new XMLHttpRequest();
    xhr.onload=function(e) {
        if(this.readyState === 4) {
            console.log("Server returned: ",e.target.responseText);
        }
    };
    var fd=new FormData();
    fd.append("that_random_filename.wav",audioBlob);
    xhr.open("POST","<url>",true);
    xhr.send(fd);
}

Затем этот метод сэкономит на сервер из рабочего потока, вместо того, чтобы возвращать его в основной поток. (Комплексный механизм на основе Worker в RecorderJS состоит в том, что большой код должен выполняться за нить.)

На самом деле, в идеале, вы бы просто использовали MediaRecorder сегодня и пусть он делает кодировку, но это цельный «шарик из воска».

1
задан Balaji Nagarajan 17 January 2019 в 06:52
поделиться

1 ответ

Ledger API позволяет выполнять потоковую передачу транзакций, созданных в регистре, с использованием gRPC. Используя любой клиент, сгенерированный gRPC, вы можете реализовать фильтр, преобразование или агрегирование транзакций в вашем коде. Определение protobuf конечной точки службы для подключения таково:

service TransactionService {

    // Read the ledger's filtered transaction stream for a set of parties.
    rpc GetTransactions (GetTransactionsRequest) returns (stream GetTransactionsResponse);

}

В Java, например, подписка на поток транзакций будет выглядеть следующим образом:

public class Main {

    private static void processTransaction(TransactionOuterClass.Transaction tx) {
        // process (filter, transform, aggregate) transaction
        System.out.printf("received transaction %s\n", tx.getTransactionId());
    }

    public static void main(String[] args) {

        // Create a GRPC channel
        ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 7600).usePlaintext().build();

        // Get ledger identity
        LedgerIdentityServiceBlockingStub ledgerIdService = LedgerIdentityServiceGrpc.newBlockingStub(channel);
        GetLedgerIdentityResponse identityResponse = ledgerIdService.getLedgerIdentity(GetLedgerIdentityRequest.getDefaultInstance());
        String ledgerId = identityResponse.getLedgerId();

        // Subscribe observer to transaction stream
        String party = "Alice";
        TransactionServiceStub transactionService = TransactionServiceGrpc.newStub(channel);
        GetTransactionsRequest transactionsRequest = GetTransactionsRequest.newBuilder()
                .setLedgerId(ledgerId)
                .setBegin(LedgerOffset.newBuilder().setBoundary(LedgerOffset.LedgerBoundary.LEDGER_BEGIN))
                .setFilter(TransactionFilter.newBuilder().putFiltersByParty(party, Filters.getDefaultInstance()))
                .build();
        StreamObserver<GetTransactionsResponse> transactionObserver = new StreamObserver<GetTransactionsResponse>() {
            @Override
            public void onNext(GetTransactionsResponse value) {
                value.getTransactionsList().forEach(Main::processTransaction);
            }

            @Override
            public void onError(Throwable t) {
                System.err.printf("%s encountered an error while processing transactions!\n", party);
                t.printStackTrace();
            }

            @Override
            public void onCompleted() {
                System.out.printf("%s's transactions stream completed.\n", party);
            }
        };
        System.out.printf("%s starts reading transactions.\n", party);
        transactionService.getTransactions(transactionsRequest, transactionObserver);

        try {
            Thread.sleep(Long.MAX_VALUE);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Обратите внимание, что это используя необработанный код, сгенерированный GRPC. В SDK также доступны реактивные привязки, которые делают вышеупомянутое менее многословным.

0
ответ дан GeorgS 17 January 2019 в 06:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: