mirror of
https://github.com/fluencelabs/fluent-pad
synced 2025-04-25 00:42:14 +00:00
migrate to new api
This commit is contained in:
parent
84bc242af1
commit
ff0b59fd47
@ -1,6 +1,6 @@
|
|||||||
import { FluenceClient } from '@fluencelabs/fluence';
|
import { createClient, FluenceClient } from '@fluencelabs/fluence';
|
||||||
|
import { dev } from '@fluencelabs/fluence-network-environment';
|
||||||
import React, { useEffect, useState } from 'react';
|
import React, { useEffect, useState } from 'react';
|
||||||
import { connect } from 'src/fluence';
|
|
||||||
|
|
||||||
import './App.scss';
|
import './App.scss';
|
||||||
import { FluenceClientContext } from './FluenceClientContext';
|
import { FluenceClientContext } from './FluenceClientContext';
|
||||||
@ -15,7 +15,7 @@ const App = () => {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const fn = async () => {
|
const fn = async () => {
|
||||||
const c = await connect();
|
const c = await createClient(dev[0]);
|
||||||
setClient(c);
|
setClient(c);
|
||||||
};
|
};
|
||||||
fn();
|
fn();
|
||||||
@ -69,7 +69,7 @@ const App = () => {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="wrapper">
|
<div className="wrapper">
|
||||||
<div>{isInRoom && client && <CollaborativeEditor />}</div>
|
{/* <div>{isInRoom && client && <CollaborativeEditor />}</div> */}
|
||||||
<div>{isInRoom && client && <UserList selfName={nickName} />}</div>
|
<div>{isInRoom && client && <UserList selfName={nickName} />}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -2,9 +2,9 @@ import * as Automerge from 'automerge';
|
|||||||
import DiffMatchPatch from 'diff-match-patch';
|
import DiffMatchPatch from 'diff-match-patch';
|
||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import { fluentPadServiceId, notifyTextUpdateFnName } from 'src/fluence/constants';
|
import { fluentPadServiceId, notifyTextUpdateFnName } from 'src/fluence/constants';
|
||||||
import { subscribeToEvent } from 'src/fluence/exApi';
|
|
||||||
import { useFluenceClient } from './FluenceClientContext';
|
import { useFluenceClient } from './FluenceClientContext';
|
||||||
import * as calls from 'src/fluence/calls';
|
import * as calls from 'src/fluence/calls';
|
||||||
|
import { subscribeToEvent } from '@fluencelabs/fluence';
|
||||||
|
|
||||||
interface TextDoc {
|
interface TextDoc {
|
||||||
value: Automerge.Text;
|
value: Automerge.Text;
|
||||||
|
@ -5,9 +5,9 @@ import {
|
|||||||
notifyUserAddedFnName,
|
notifyUserAddedFnName,
|
||||||
notifyUserRemovedFnName,
|
notifyUserRemovedFnName,
|
||||||
} from 'src/fluence/constants';
|
} from 'src/fluence/constants';
|
||||||
import { subscribeToEvent } from 'src/fluence/exApi';
|
|
||||||
import { useFluenceClient } from './FluenceClientContext';
|
import { useFluenceClient } from './FluenceClientContext';
|
||||||
import * as calls from 'src/fluence/calls';
|
import * as calls from 'src/fluence/calls';
|
||||||
|
import { subscribeToEvent } from '@fluencelabs/fluence';
|
||||||
|
|
||||||
interface User {
|
interface User {
|
||||||
id: string;
|
id: string;
|
||||||
@ -26,7 +26,7 @@ const turnUserAsOfflineCandidate = (u: User): User => {
|
|||||||
|
|
||||||
type PeerId = string;
|
type PeerId = string;
|
||||||
|
|
||||||
const refreshTimeoutMs = 7000;
|
const refreshTimeoutMs = 2000;
|
||||||
|
|
||||||
export const UserList = (props: { selfName: string }) => {
|
export const UserList = (props: { selfName: string }) => {
|
||||||
const client = useFluenceClient()!;
|
const client = useFluenceClient()!;
|
||||||
@ -111,20 +111,15 @@ export const UserList = (props: { selfName: string }) => {
|
|||||||
.map((x) => x[1])
|
.map((x) => x[1])
|
||||||
.sort((a, b) => a.name.localeCompare(b.name));
|
.sort((a, b) => a.name.localeCompare(b.name));
|
||||||
|
|
||||||
const onlineUsers = usersArray.filter((x) => x.isOnline);
|
|
||||||
const offlineUsers = usersArray.filter((x) => !x.isOnline);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<ul>
|
<ul>
|
||||||
{onlineUsers.map((x) => (
|
{usersArray.map((x) => (
|
||||||
<li key={x.id}>
|
<li key={x.id}>
|
||||||
{x.name} ({x.id} <span style={{ color: 'green' }}>(online)</span>)
|
{x.name}{' '}
|
||||||
</li>
|
<span style={{ color: x.isOnline ? 'green' : 'red' }}>
|
||||||
))}
|
({x.isOnline ? 'online' : 'offline'})
|
||||||
{offlineUsers.map((x) => (
|
</span>
|
||||||
<li key={x.id}>
|
|
||||||
{x.name} ({x.id} <span style={{ color: 'red' }}>(offline)</span>)
|
|
||||||
</li>
|
</li>
|
||||||
))}
|
))}
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { FluenceClient } from '@fluencelabs/fluence';
|
import { FluenceClient, Particle, sendParticle } from '@fluencelabs/fluence';
|
||||||
import {
|
import {
|
||||||
fluentPadServiceId,
|
fluentPadServiceId,
|
||||||
historyNodePid,
|
historyNodePid,
|
||||||
@ -10,7 +10,6 @@ import {
|
|||||||
userListNodePid,
|
userListNodePid,
|
||||||
userListServiceId,
|
userListServiceId,
|
||||||
} from './constants';
|
} from './constants';
|
||||||
import { Particle, sendParticle } from './exApi';
|
|
||||||
|
|
||||||
export interface ServiceResult {
|
export interface ServiceResult {
|
||||||
ret_code: number;
|
ret_code: number;
|
||||||
|
@ -7,8 +7,8 @@ export const notifyUserAddedFnName = 'notifyUserAdded';
|
|||||||
export const notifyUserRemovedFnName = 'notifyUserRemoved';
|
export const notifyUserRemovedFnName = 'notifyUserRemoved';
|
||||||
export const notifyTextUpdateFnName = 'notifyTextUpdate';
|
export const notifyTextUpdateFnName = 'notifyTextUpdate';
|
||||||
|
|
||||||
export const userListServiceId = 'd4506f7d-be4a-4332-87b2-eb530f350861';
|
export const userListServiceId = '65b7232f-45ff-464f-a804-c4c8ce563726';
|
||||||
export const historyServiceId = 'd9abbacf-6ee2-49e5-9683-536a5c931fa1';
|
export const historyServiceId = '29a5724d-c865-42fe-bfc1-e2c6b84a89b4';
|
||||||
|
|
||||||
export const userListNodePid = dev[2].peerId;
|
export const userListNodePid = dev[2].peerId;
|
||||||
export const historyNodePid = dev[2].peerId;
|
export const historyNodePid = dev[2].peerId;
|
||||||
|
@ -1,68 +0,0 @@
|
|||||||
import { FluenceClient } from '@fluencelabs/fluence';
|
|
||||||
import { SecurityTetraplet } from '@fluencelabs/fluence/dist/internal/commonTypes';
|
|
||||||
|
|
||||||
const defaultTtl = 7000;
|
|
||||||
|
|
||||||
export class Particle {
|
|
||||||
script: string;
|
|
||||||
data: Map<string, any>;
|
|
||||||
ttl: number;
|
|
||||||
|
|
||||||
constructor(script: string, data?: Map<string, any> | Record<string, any>, ttl?: number) {
|
|
||||||
this.script = script;
|
|
||||||
if (data === undefined) {
|
|
||||||
this.data = new Map();
|
|
||||||
} else if (data instanceof Map) {
|
|
||||||
this.data = data;
|
|
||||||
} else {
|
|
||||||
this.data = new Map();
|
|
||||||
for (let k in data) {
|
|
||||||
this.data.set(k, data[k]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.ttl = ttl ?? defaultTtl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export const sendParticle = async (client: FluenceClient, particle: Particle): Promise<string> => {
|
|
||||||
return await client.sendScript(particle.script, particle.data, particle.ttl);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const registerServiceFunction = (
|
|
||||||
client: FluenceClient,
|
|
||||||
serviceId: string,
|
|
||||||
fnName: string,
|
|
||||||
handler: (args: any[], tetraplets: SecurityTetraplet[][]) => object,
|
|
||||||
) => {
|
|
||||||
client.registerCallback(serviceId, fnName, handler);
|
|
||||||
};
|
|
||||||
|
|
||||||
// prettier-ignore
|
|
||||||
export const unregisterServiceFunction = (
|
|
||||||
client: FluenceClient,
|
|
||||||
serviceId: string,
|
|
||||||
fnName: string
|
|
||||||
) => {
|
|
||||||
client.unregisterCallback(serviceId, fnName);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const subscribeToEvent = (
|
|
||||||
client: FluenceClient,
|
|
||||||
serviceId: string,
|
|
||||||
fnName: string,
|
|
||||||
handler: (args: any[], tetraplets: SecurityTetraplet[][]) => void,
|
|
||||||
): Function => {
|
|
||||||
const realHandler = (args: any[], tetraplets: SecurityTetraplet[][]) => {
|
|
||||||
// dont' block
|
|
||||||
setImmediate(() => {
|
|
||||||
handler(args, tetraplets);
|
|
||||||
});
|
|
||||||
|
|
||||||
return {};
|
|
||||||
};
|
|
||||||
registerServiceFunction(client, serviceId, fnName, realHandler);
|
|
||||||
return () => {
|
|
||||||
unregisterServiceFunction(client, serviceId, fnName);
|
|
||||||
};
|
|
||||||
};
|
|
@ -1,47 +0,0 @@
|
|||||||
import { FluenceClient, peerIdToSeed, generatePeerId, seedToPeerId } from '@fluencelabs/fluence';
|
|
||||||
import { dev } from '@fluencelabs/fluence-network-environment';
|
|
||||||
import log from 'loglevel';
|
|
||||||
import { registerServiceFunction } from './exApi';
|
|
||||||
|
|
||||||
log.setLevel(2);
|
|
||||||
|
|
||||||
const getPrivKey = async () => {
|
|
||||||
// return '7sHe8vxCo4BkdPNPdb8f2T8CJMgTmSvBTmeqtH9QWrar';
|
|
||||||
const peerId = await generatePeerId();
|
|
||||||
const key = peerIdToSeed(peerId);
|
|
||||||
return key;
|
|
||||||
};
|
|
||||||
|
|
||||||
export let fluenceClient: FluenceClient;
|
|
||||||
|
|
||||||
export const connect = async (): Promise<FluenceClient> => {
|
|
||||||
if (fluenceClient) {
|
|
||||||
return fluenceClient;
|
|
||||||
}
|
|
||||||
|
|
||||||
const node = dev[0];
|
|
||||||
const key = await getPrivKey();
|
|
||||||
const peerId = await seedToPeerId(key);
|
|
||||||
const c = new FluenceClient(peerId);
|
|
||||||
|
|
||||||
// missing built-in identity function
|
|
||||||
registerServiceFunction(c, 'op', 'identity', (args, _) => {
|
|
||||||
console.log('called identity');
|
|
||||||
return args;
|
|
||||||
});
|
|
||||||
|
|
||||||
registerServiceFunction(c, 'op', 'alert', (args, _) => {
|
|
||||||
alert(args);
|
|
||||||
return args;
|
|
||||||
});
|
|
||||||
|
|
||||||
await c.connect(node.multiaddr);
|
|
||||||
fluenceClient = c;
|
|
||||||
return fluenceClient;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const disconnect = async () => {
|
|
||||||
if (fluenceClient) {
|
|
||||||
await fluenceClient.disconnect();
|
|
||||||
}
|
|
||||||
};
|
|
@ -1,11 +1,14 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import ReactDOM from 'react-dom';
|
import ReactDOM from 'react-dom';
|
||||||
import './index.scss';
|
import './index.scss';
|
||||||
import App1 from './app/App1';
|
import App from './app/App';
|
||||||
|
import log from 'loglevel';
|
||||||
|
|
||||||
|
log.setLevel(2);
|
||||||
|
|
||||||
ReactDOM.render(
|
ReactDOM.render(
|
||||||
<React.StrictMode>
|
<React.StrictMode>
|
||||||
<App1 />
|
<App />
|
||||||
</React.StrictMode>,
|
</React.StrictMode>,
|
||||||
document.getElementById('root'),
|
document.getElementById('root'),
|
||||||
);
|
);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user