summaryrefslogtreecommitdiff
path: root/front/src/logic/requests/nostril.ts
blob: 6f0edcfeb085ed10d618ee80faeaf87c29202d16 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
import type Urbit from "urbit-api";
import type { Cursor, PostID, SentPoast } from "@/types/trill";
import type { Ship } from "@/types/urbit";
import { FeedPostCount } from "../constants";
import type { UserProfile } from "@/types/nostril";

// Subscribe
type Handler = (date: any) => void;
export default class IO {
  airlock;
  constructor(airlock: Urbit) {
    this.airlock = airlock;
  }
  private async poke(json: any) {
    return this.airlock.poke({ app: "nostril", mark: "json", json });
  }
  private async scry(path: string) {
    return this.airlock.scry({ app: "nostril", path });
  }
  private async sub(path: string, handler: Handler) {
    const err = (err: any, _id: string) =>
      console.log(err, "error on nostril subscription");
    const quit = (data: any) =>
      console.log(data, "nostril subscription kicked");
    const res = await this.airlock.subscribe({
      app: "nostril",
      path,
      event: handler,
      err,
      quit,
    });
    console.log(res, "subscribed to nostril agent");
  }
  async unsub(sub: number) {
    return await this.airlock.unsubscribe(sub);
  }
  // subs
  async subscribeStore(handler: Handler) {
    const res = await this.sub("/ui", handler);
    return res;
  }
  // scries

  async scryFeed(start: Cursor, end: Cursor, desc = true) {
    const order = desc ? 1 : 0;
    const term = "feed";

    const path = `/j/feed/${term}/${start}/${end}/${FeedPostCount}/${order}`;
    return await this.scry(path);
  }
  async scryPost(
    host: Ship,
    id: PostID,
    start: Cursor,
    end: Cursor,
    desc = true,
  ) {
    const order = desc ? 1 : 0;

    const path = `/j/post/${host}/${id}/${start}/${end}/${FeedPostCount}/${order}`;
    return await this.scry(path);
  }
  // pokes

  async pokeAlive() {
    return await this.poke({ alive: true });
  }
  async addPost(pubkey: string, content: string) {
    const json = { add: { pubkey, content } };
    return this.poke({ post: json });
  }
  // async addPost(post: SentPoast, gossip: boolean) {
  //   const json = {
  //     "new-post": {
  //       "sent-post": post,
  //       gossip,
  //     },
  //   };
  //   return this.poke(json);
  // }

  async deletePost(id: string) {
    const host = `~${this.airlock.ship}`;
    const json = {
      "del-post": {
        ship: host,
        id: id,
      },
    };
    return this.poke(json);
  }

  async addReact(ship: Ship, id: PostID, reaction: string) {
    const json = {
      "new-react": {
        react: reaction,
        pid: {
          id: id,
          ship: ship,
        },
      },
    };

    return this.poke(json);
  }

  //  follows
  async follow(ship: Ship) {
    const json = { add: ship };
    return this.poke({ fols: json });
  }

  async unfollow(ship: Ship) {
    const json = { del: ship };
    return await this.poke({ fols: json });
  }
  // profiles
  async createProfile(pubkey: string, profile: UserProfile) {
    const json = { add: { pubkey, profile } };
    return await this.poke({ prof: json });
  }
  async createKey() {
    const json = { add: null };
    return await this.poke({ keys: json });
  }
  async removeKey(pubkey: string) {
    const json = { del: pubkey };
    return await this.poke({ keys: json });
  }
  // relaying
  async relayPost(host: string, id: string, relays: string[]) {
    const json = { send: { host, id, relays } };
    return await this.poke({ rela: json });
  }
}

// notifications

// mark as read