Skip to content

Instantly share code, notes, and snippets.

View dipeshdulal's full-sized avatar
💭
🙏 नमस्कार

Dipesh Dulal dipeshdulal

💭
🙏 नमस्कार
View GitHub Profile
@dipeshdulal
dipeshdulal / chat.proto
Created July 12, 2020 02:48
Chat Protocol Buffer
syntax = "proto3";
option go_package = "./chatpb";
package chatpb;
service ChatService {
rpc JoinChannel(Channel) returns (stream Message) {}
rpc SendMessage(stream Message) returns (MessageAck) {}
}
@dipeshdulal
dipeshdulal / joinChannel.go
Created July 12, 2020 03:04
JoinChannel Implementation for Chat Server
func (s *chatServiceServer) JoinChannel(ch *chatpb.Channel, msgStream chatpb.ChatService_JoinChannelServer) error {
msgChannel := make(chan *chatpb.Message)
s.channel[ch.Name] = append(s.channel[ch.Name], msgChannel)
// doing this never closes the stream
for {
select {
case <-msgStream.Context().Done():
return nil
func (s *chatServiceServer) SendMessage(msgStream chatpb.ChatService_SendMessageServer) error {
msg, err := msgStream.Recv()
if err == io.EOF {
return nil
}
if err != nil {
return err
}
@dipeshdulal
dipeshdulal / server_main.go
Created July 12, 2020 03:40
Server Listening code.
lis, err := net.Listen("tcp", "localhost:5400")
if err != nil {
log.Fatalf("Failed to listen: %v", err)
}
var opts []grpc.ServerOption
grpcServer := grpc.NewServer(opts...)
chatpb.RegisterChatServiceServer(grpcServer, &chatServiceServer{
channel: make(map[string][] chan *chatpb.Message),
}
grpcServer.Serve(lis)
@dipeshdulal
dipeshdulal / client_join_channel.go
Created July 12, 2020 03:43
Join Channel Client Side
func joinChannel(ctx context.Context, client chatpb.ChatServiceClient) {
channel := chatpb.Channel{Name: *channelName, SendersName: *senderName}
stream, err := client.JoinChannel(ctx, &channel)
if err != nil {
log.Fatalf("client.JoinChannel(ctx, &channel) throws: %v", err)
}
fmt.Printf("Joined channel: %v \n", *channelName)
@dipeshdulal
dipeshdulal / client_send_message.go
Created July 12, 2020 03:50
Client Send Message Go Routine
func sendMessage(ctx context.Context, client chatpb.ChatServiceClient, message string) {
stream, err := client.SendMessage(ctx)
if err != nil {
log.Printf("Cannot send message: error: %v", err)
}
msg := chatpb.Message{
Channel: &chatpb.Channel{
Name: *channelName,
SendersName: *senderName},
Message: message,
@dipeshdulal
dipeshdulal / client_main.go
Created July 12, 2020 03:59
Client Chat Main Function
var channelName = flag.String("channel", "default", "Channel name for chatting")
var senderName = flag.String("sender", "default", "Senders name")
var tcpServer = flag.String("server", ":5400", "Tcp server")
func main() {
flag.Parse()
fmt.Println("--- CLIENT APP ---")
var opts []grpc.DialOption
@dipeshdulal
dipeshdulal / useBufferedState.js
Last active July 19, 2020 03:24
UseBufferedState hook for buffering list of strings. (first-in first-out manner)
import { useState } from "react";
/**
* Use Buffered State gives buffer functionality to the state.
* Adding elements more than the buffered state length will add
* to the first of the state and old values will be deleted from state.
*
* ##### NOTE
* - https://stackoverflow.com/questions/55265255/react-usestate-hook-event-handler-using-initial-state
* There is use of callback function in setState so that current state can be accessed inside event listner instead of
@dipeshdulal
dipeshdulal / stackedAxisChart.jsx
Created August 6, 2020 06:19
StackedAxis Pyramid Chart
import React, { useRef, useEffect } from "react";
import Chart from "chart.js";
const barChartData: Chart.ChartData = {
labels: ["January", "February", "March", "April", "May", "June", "July"],
datasets: [
{
label: "Male",
stack: "Stack 0",
backgroundColor: "#d41111",
@dipeshdulal
dipeshdulal / decorator_sample.js
Last active August 13, 2020 09:46
Decorators in Typescript
const ADecorator = <T extends { new(...args: any[]): {} }>(specs: T) => {
return class extends specs {
A = "test"
constructor(...args: any[]) {
super(...args)
console.log("object constructed")
}
}
}