mirror of
https://github.com/KoalaSat/nostros.git
synced 2024-10-01 15:40:48 +00:00
Bench32 compatible
This commit is contained in:
parent
dc19245599
commit
0efd9085f7
1
App.tsx
1
App.tsx
@ -1,5 +1,6 @@
|
|||||||
import App from './frontend'
|
import App from './frontend'
|
||||||
import { Buffer as SafeBuffer } from 'safe-buffer'
|
import { Buffer as SafeBuffer } from 'safe-buffer'
|
||||||
|
import 'text-encoding-polyfill'
|
||||||
|
|
||||||
global.Buffer = SafeBuffer
|
global.Buffer = SafeBuffer
|
||||||
|
|
||||||
|
@ -84,7 +84,9 @@ public class Event {
|
|||||||
JSONArray eTags = filterTags("e");
|
JSONArray eTags = filterTags("e");
|
||||||
String replyEventId = null;
|
String replyEventId = null;
|
||||||
try {
|
try {
|
||||||
|
if (eTags.length() > 0) {
|
||||||
replyEventId = eTags.getJSONArray(eTags.length() - 1).getString(1);
|
replyEventId = eTags.getJSONArray(eTags.length() - 1).getString(1);
|
||||||
|
}
|
||||||
} catch (JSONException e) {
|
} catch (JSONException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
@ -171,6 +173,15 @@ public class Event {
|
|||||||
JSONArray pTags = filterTags("p");
|
JSONArray pTags = filterTags("p");
|
||||||
JSONArray eTags = filterTags("e");
|
JSONArray eTags = filterTags("e");
|
||||||
|
|
||||||
|
String reacted_event_id = "";
|
||||||
|
String reacted_user_id = "";
|
||||||
|
if (eTags.length() > 0) {
|
||||||
|
reacted_event_id = eTags.getJSONArray(eTags.length() - 1).getString(1);
|
||||||
|
}
|
||||||
|
if (pTags.length() > 0) {
|
||||||
|
reacted_user_id = pTags.getJSONArray(pTags.length() - 1).getString(1);
|
||||||
|
}
|
||||||
|
|
||||||
ContentValues values = new ContentValues();
|
ContentValues values = new ContentValues();
|
||||||
values.put("id", id);
|
values.put("id", id);
|
||||||
values.put("content", content.replace("'", "''"));
|
values.put("content", content.replace("'", "''"));
|
||||||
@ -180,8 +191,8 @@ public class Event {
|
|||||||
values.put("sig", sig);
|
values.put("sig", sig);
|
||||||
values.put("tags", tags.toString());
|
values.put("tags", tags.toString());
|
||||||
values.put("positive", !content.equals("-"));
|
values.put("positive", !content.equals("-"));
|
||||||
values.put("reacted_event_id", eTags.getJSONArray(eTags.length() - 1).getString(1));
|
values.put("reacted_event_id", reacted_event_id);
|
||||||
values.put("reacted_user_id", pTags.getJSONArray(pTags.length() - 1).getString(1));
|
values.put("reacted_user_id", reacted_user_id);
|
||||||
|
|
||||||
String query = "SELECT id FROM nostros_reactions WHERE id = ?";
|
String query = "SELECT id FROM nostros_reactions WHERE id = ?";
|
||||||
@SuppressLint("Recycle") Cursor cursor = database.rawQuery(query, new String[] {id});
|
@SuppressLint("Recycle") Cursor cursor = database.rawQuery(query, new String[] {id});
|
||||||
@ -218,12 +229,16 @@ public class Event {
|
|||||||
for (int i = 0; i < tags.length(); ++i) {
|
for (int i = 0; i < tags.length(); ++i) {
|
||||||
JSONArray tag = tags.getJSONArray(i);
|
JSONArray tag = tags.getJSONArray(i);
|
||||||
String petId = tag.getString(1);
|
String petId = tag.getString(1);
|
||||||
|
String name = "";
|
||||||
|
if (tag.length() >= 4) {
|
||||||
|
name = tag.getString(3);
|
||||||
|
}
|
||||||
String query = "SELECT * FROM nostros_users WHERE id = ?";
|
String query = "SELECT * FROM nostros_users WHERE id = ?";
|
||||||
Cursor cursor = database.rawQuery(query, new String[] {petId});
|
Cursor cursor = database.rawQuery(query, new String[] {petId});
|
||||||
if (cursor.getCount() == 0) {
|
if (cursor.getCount() == 0) {
|
||||||
ContentValues values = new ContentValues();
|
ContentValues values = new ContentValues();
|
||||||
values.put("id", petId);
|
values.put("id", petId);
|
||||||
values.put("name", tag.getString(3));
|
values.put("name", name);
|
||||||
values.put("contact", true);
|
values.put("contact", true);
|
||||||
database.insert("nostros_users", null, values);
|
database.insert("nostros_users", null, values);
|
||||||
}
|
}
|
||||||
|
@ -1,21 +1,18 @@
|
|||||||
package com.nostros.classes;
|
package com.nostros.classes;
|
||||||
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import com.facebook.react.bridge.Arguments;
|
import com.facebook.react.bridge.Arguments;
|
||||||
import com.facebook.react.bridge.Callback;
|
|
||||||
import com.facebook.react.bridge.ReactApplicationContext;
|
import com.facebook.react.bridge.ReactApplicationContext;
|
||||||
import com.facebook.react.bridge.ReactContext;
|
|
||||||
import com.facebook.react.bridge.WritableMap;
|
import com.facebook.react.bridge.WritableMap;
|
||||||
import com.facebook.react.modules.core.DeviceEventManagerModule;
|
import com.facebook.react.modules.core.DeviceEventManagerModule;
|
||||||
import com.facebook.react.uimanager.events.RCTEventEmitter;
|
|
||||||
import com.neovisionaries.ws.client.HostnameUnverifiedException;
|
import com.neovisionaries.ws.client.HostnameUnverifiedException;
|
||||||
import com.neovisionaries.ws.client.OpeningHandshakeException;
|
import com.neovisionaries.ws.client.OpeningHandshakeException;
|
||||||
import com.neovisionaries.ws.client.WebSocket;
|
import com.neovisionaries.ws.client.WebSocket;
|
||||||
import com.neovisionaries.ws.client.WebSocketAdapter;
|
import com.neovisionaries.ws.client.WebSocketAdapter;
|
||||||
import com.neovisionaries.ws.client.WebSocketException;
|
import com.neovisionaries.ws.client.WebSocketException;
|
||||||
import com.neovisionaries.ws.client.WebSocketFactory;
|
import com.neovisionaries.ws.client.WebSocketFactory;
|
||||||
|
import com.neovisionaries.ws.client.WebSocketFrame;
|
||||||
import com.nostros.modules.DatabaseModule;
|
import com.nostros.modules.DatabaseModule;
|
||||||
|
|
||||||
import org.json.JSONArray;
|
import org.json.JSONArray;
|
||||||
@ -48,6 +45,9 @@ public class Websocket {
|
|||||||
public void connect(String userPubKey) throws IOException {
|
public void connect(String userPubKey) throws IOException {
|
||||||
WebSocketFactory factory = new WebSocketFactory();
|
WebSocketFactory factory = new WebSocketFactory();
|
||||||
webSocket = factory.createSocket(url);
|
webSocket = factory.createSocket(url);
|
||||||
|
webSocket.setMissingCloseFrameAllowed(true);
|
||||||
|
webSocket.setPingInterval(25 * 1000);
|
||||||
|
|
||||||
webSocket.addListener(new WebSocketAdapter() {
|
webSocket.addListener(new WebSocketAdapter() {
|
||||||
@Override
|
@Override
|
||||||
public void onTextMessage(WebSocket websocket, String message) throws Exception {
|
public void onTextMessage(WebSocket websocket, String message) throws Exception {
|
||||||
@ -59,24 +59,13 @@ public class Websocket {
|
|||||||
reactNativeEvent(data.getString("id"));
|
reactNativeEvent(data.getString("id"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@Override
|
||||||
|
public void onDisconnected(WebSocket ws, WebSocketFrame serverCloseFrame,
|
||||||
|
WebSocketFrame clientCloseFrame, boolean closedByServer) {
|
||||||
|
ws.connectAsynchronously();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
try {
|
webSocket.connectAsynchronously();
|
||||||
webSocket.connect();
|
|
||||||
}catch (OpeningHandshakeException e)
|
|
||||||
{
|
|
||||||
// A violation against the WebSocket protocol was detected
|
|
||||||
// during the opening handshake.
|
|
||||||
Log.d("WebSocket", "A violation against the WebSocket protocol was detected.");
|
|
||||||
}
|
|
||||||
catch (HostnameUnverifiedException e)
|
|
||||||
{
|
|
||||||
// The certificate of the peer does not match the expected hostname.
|
|
||||||
Log.d("WebSocket", "The certificate of the peer does not match the expected hostname.");
|
|
||||||
}
|
|
||||||
catch (WebSocketException e)
|
|
||||||
{
|
|
||||||
Log.d("WebSocket", "Failed to establish a WebSocket connection.");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void reactNativeEvent(String eventId) {
|
public void reactNativeEvent(String eventId) {
|
||||||
|
@ -80,6 +80,23 @@ public class DatabaseModule {
|
|||||||
" reacted_event_id TEXT,\n" +
|
" reacted_event_id TEXT,\n" +
|
||||||
" reacted_user_id TEXT\n" +
|
" reacted_user_id TEXT\n" +
|
||||||
" );");
|
" );");
|
||||||
|
try {
|
||||||
|
database.execSQL("CREATE INDEX nostros_notes_pubkey_index ON nostros_notes(pubkey); ");
|
||||||
|
database.execSQL("CREATE INDEX nostros_notes_main_event_id_index ON nostros_notes(main_event_id); ");
|
||||||
|
database.execSQL("CREATE INDEX nostros_notes_reply_event_id_index ON nostros_notes(reply_event_id); ");
|
||||||
|
database.execSQL("CREATE INDEX nostros_notes_kind_index ON nostros_notes(kind); ");
|
||||||
|
|
||||||
|
database.execSQL("CREATE INDEX nostros_direct_messages_pubkey_index ON nostros_direct_messages(pubkey); ");
|
||||||
|
database.execSQL("CREATE INDEX nostros_direct_messages_conversation_id_index ON nostros_direct_messages(conversation_id); ");
|
||||||
|
|
||||||
|
database.execSQL("CREATE INDEX nostros_reactions_pubkey_index ON nostros_reactions(pubkey); ");
|
||||||
|
database.execSQL("CREATE INDEX nostros_reactions_reacted_event_id_index ON nostros_reactions(reacted_event_id); ");
|
||||||
|
|
||||||
|
database.execSQL("CREATE INDEX nostros_users_contact_index ON nostros_users(contact); ");
|
||||||
|
} catch (SQLException e) { }
|
||||||
|
try {
|
||||||
|
database.execSQL("ALTER TABLE nostros_users ADD COLUMN nip05 TEXT;");
|
||||||
|
} catch (SQLException e) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
public void saveEvent(JSONObject data, String userPubKey) throws JSONException {
|
public void saveEvent(JSONObject data, String userPubKey) throws JSONException {
|
||||||
|
@ -17,19 +17,17 @@ interface TextContentProps {
|
|||||||
export const LnPayment: React.FC<TextContentProps> = ({ open, setOpen, event, user }) => {
|
export const LnPayment: React.FC<TextContentProps> = ({ open, setOpen, event, user }) => {
|
||||||
const { t } = useTranslation('common')
|
const { t } = useTranslation('common')
|
||||||
const [monto, setMonto] = useState<string>('')
|
const [monto, setMonto] = useState<string>('')
|
||||||
const [comment, setComment] = useState<string>('')
|
const defaultComment = event?.id ? `Tip for Nostr event ${event?.id}` : ''
|
||||||
|
const [comment, setComment] = useState<string>(defaultComment)
|
||||||
const [loading, setLoading] = useState<boolean>(false)
|
const [loading, setLoading] = useState<boolean>(false)
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setMonto('')
|
setMonto('')
|
||||||
setComment('')
|
|
||||||
}, [open])
|
}, [open])
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (event?.id) {
|
setComment(defaultComment)
|
||||||
setComment(`Tip for Nostr event ${event?.id}`)
|
}, [event, open])
|
||||||
}
|
|
||||||
}, [event, user])
|
|
||||||
|
|
||||||
const styles = StyleSheet.create({
|
const styles = StyleSheet.create({
|
||||||
modal: {
|
modal: {
|
||||||
|
@ -35,7 +35,7 @@ export const NoteCard: React.FC<NoteCardProps> = ({
|
|||||||
onlyContactsReplies = false,
|
onlyContactsReplies = false,
|
||||||
}) => {
|
}) => {
|
||||||
const theme = useTheme()
|
const theme = useTheme()
|
||||||
const { relayPool, publicKey, lastEventId } = useContext(RelayPoolContext)
|
const { relayPool, publicKey, privateKey, lastEventId } = useContext(RelayPoolContext)
|
||||||
const { database, goToPage } = useContext(AppContext)
|
const { database, goToPage } = useContext(AppContext)
|
||||||
const [relayAdded, setRelayAdded] = useState<boolean>(false)
|
const [relayAdded, setRelayAdded] = useState<boolean>(false)
|
||||||
const [replies, setReplies] = useState<Note[]>([])
|
const [replies, setReplies] = useState<Note[]>([])
|
||||||
@ -141,7 +141,7 @@ export const NoteCard: React.FC<NoteCardProps> = ({
|
|||||||
appearance='ghost'
|
appearance='ghost'
|
||||||
status={userUpvoted ? 'success' : 'primary'}
|
status={userUpvoted ? 'success' : 'primary'}
|
||||||
onPress={() => {
|
onPress={() => {
|
||||||
if (!userUpvoted) {
|
if (!userUpvoted && privateKey) {
|
||||||
setUserUpvoted(true)
|
setUserUpvoted(true)
|
||||||
setPositiveReactions((prev) => prev + 1)
|
setPositiveReactions((prev) => prev + 1)
|
||||||
publishReaction(true)
|
publishReaction(true)
|
||||||
@ -165,7 +165,7 @@ export const NoteCard: React.FC<NoteCardProps> = ({
|
|||||||
appearance='ghost'
|
appearance='ghost'
|
||||||
status={userDownvoted ? 'danger' : 'primary'}
|
status={userDownvoted ? 'danger' : 'primary'}
|
||||||
onPress={() => {
|
onPress={() => {
|
||||||
if (!userDownvoted) {
|
if (!userDownvoted && privateKey) {
|
||||||
setUserDownvoted(true)
|
setUserDownvoted(true)
|
||||||
setNegativeReactions((prev) => prev + 1)
|
setNegativeReactions((prev) => prev + 1)
|
||||||
publishReaction(false)
|
publishReaction(false)
|
||||||
|
@ -11,12 +11,11 @@ import {
|
|||||||
} from '../../Functions/DatabaseFunctions/DirectMessages'
|
} from '../../Functions/DatabaseFunctions/DirectMessages'
|
||||||
import { getUser, User } from '../../Functions/DatabaseFunctions/Users'
|
import { getUser, User } from '../../Functions/DatabaseFunctions/Users'
|
||||||
import Avatar from '../../Components/Avatar'
|
import Avatar from '../../Components/Avatar'
|
||||||
import { decrypt } from 'nostr-tools/nip04'
|
|
||||||
import Icon from 'react-native-vector-icons/FontAwesome5'
|
import Icon from 'react-native-vector-icons/FontAwesome5'
|
||||||
import { username, usersToTags } from '../../Functions/RelayFunctions/Users'
|
import { username, usersToTags } from '../../Functions/RelayFunctions/Users'
|
||||||
import moment from 'moment'
|
import moment from 'moment'
|
||||||
import { encrypt } from '../../lib/nostr/Crypto'
|
|
||||||
import TextContent from '../../Components/TextContent'
|
import TextContent from '../../Components/TextContent'
|
||||||
|
import { encrypt, decrypt } from '../../lib/nostr/Nip04'
|
||||||
|
|
||||||
export const ConversationPage: React.FC = () => {
|
export const ConversationPage: React.FC = () => {
|
||||||
const theme = useTheme()
|
const theme = useTheme()
|
||||||
@ -96,20 +95,19 @@ export const ConversationPage: React.FC = () => {
|
|||||||
}
|
}
|
||||||
setSendingMessages((prev) => [...prev, event as DirectMessage])
|
setSendingMessages((prev) => [...prev, event as DirectMessage])
|
||||||
setInput('')
|
setInput('')
|
||||||
encrypt(privateKey, otherPubKey, input).then((content) => {
|
const encryptedcontent = encrypt(privateKey, otherPubKey, input)
|
||||||
relayPool?.sendEvent({
|
relayPool?.sendEvent({
|
||||||
...event,
|
...event,
|
||||||
content,
|
content: encryptedcontent,
|
||||||
})
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const userCard: (message: DirectMessage) => JSX.Element = (message) => {
|
const userCard: (message: DirectMessage, index: number) => JSX.Element = (message, index) => {
|
||||||
if (!publicKey || !privateKey || !otherUser || !user) return <></>
|
if (!publicKey || !privateKey || !otherUser || !user) return <></>
|
||||||
|
|
||||||
return message.pubkey === otherPubKey ? (
|
return message.pubkey === otherPubKey ? (
|
||||||
<Layout key={message.id ?? message.created_at} style={styles.card} level='3'>
|
<Layout key={index} style={styles.card} level='3'>
|
||||||
<Layout style={styles.layout} level='3'>
|
<Layout style={styles.layout} level='3'>
|
||||||
<Layout style={styles.profile} level='3'>
|
<Layout style={styles.profile} level='3'>
|
||||||
<TouchableOpacity onPress={onPressOtherUser}>
|
<TouchableOpacity onPress={onPressOtherUser}>
|
||||||
@ -128,7 +126,7 @@ export const ConversationPage: React.FC = () => {
|
|||||||
</Layout>
|
</Layout>
|
||||||
</Layout>
|
</Layout>
|
||||||
) : (
|
) : (
|
||||||
<Layout key={message.id ?? message.created_at} style={styles.card} level='2'>
|
<Layout key={index} style={styles.card} level='2'>
|
||||||
<Layout style={styles.contentRight} level='2'>
|
<Layout style={styles.contentRight} level='2'>
|
||||||
<Layout style={styles.title} level='2'>
|
<Layout style={styles.title} level='2'>
|
||||||
<Text appearance='hint'>
|
<Text appearance='hint'>
|
||||||
@ -236,7 +234,7 @@ export const ConversationPage: React.FC = () => {
|
|||||||
onContentSizeChange={() => scrollViewRef.current?.scrollToEnd({ animated: true })}
|
onContentSizeChange={() => scrollViewRef.current?.scrollToEnd({ animated: true })}
|
||||||
horizontal={false}
|
horizontal={false}
|
||||||
>
|
>
|
||||||
{[...directMessages, ...sendingMessages].map((msg) => userCard(msg))}
|
{[...directMessages, ...sendingMessages].map((msg, index) => userCard(msg, index))}
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
</Layout>
|
</Layout>
|
||||||
<Layout style={styles.form}>
|
<Layout style={styles.form}>
|
||||||
|
@ -27,6 +27,7 @@ import Avatar from '../../Components/Avatar'
|
|||||||
import Icon from 'react-native-vector-icons/FontAwesome5'
|
import Icon from 'react-native-vector-icons/FontAwesome5'
|
||||||
import { useTranslation } from 'react-i18next'
|
import { useTranslation } from 'react-i18next'
|
||||||
import { username } from '../../Functions/RelayFunctions/Users'
|
import { username } from '../../Functions/RelayFunctions/Users'
|
||||||
|
import { getPublicKey } from '../../lib/nostr/Nip19'
|
||||||
|
|
||||||
export const DirectMessagesPage: React.FC = () => {
|
export const DirectMessagesPage: React.FC = () => {
|
||||||
const theme = useTheme()
|
const theme = useTheme()
|
||||||
@ -81,8 +82,9 @@ export const DirectMessagesPage: React.FC = () => {
|
|||||||
|
|
||||||
const onPressOpenConversation: (sendPubKey: string) => void = (sendPubKey) => {
|
const onPressOpenConversation: (sendPubKey: string) => void = (sendPubKey) => {
|
||||||
if (sendPubKey !== '' && publicKey) {
|
if (sendPubKey !== '' && publicKey) {
|
||||||
const conversationId = generateConversationId(publicKey, sendPubKey)
|
const contactPubKey = getPublicKey(sendPubKey)
|
||||||
const conversationPath = getConversationPath(conversationId, sendPubKey)
|
const conversationId = generateConversationId(publicKey, contactPubKey)
|
||||||
|
const conversationPath = getConversationPath(conversationId, contactPubKey)
|
||||||
goToPage(conversationPath)
|
goToPage(conversationPath)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,7 @@ export const HomePage: React.FC = () => {
|
|||||||
const [notes, setNotes] = useState<Note[]>([])
|
const [notes, setNotes] = useState<Note[]>([])
|
||||||
const [authors, setAuthors] = useState<User[]>([])
|
const [authors, setAuthors] = useState<User[]>([])
|
||||||
const [refreshing, setRefreshing] = useState(true)
|
const [refreshing, setRefreshing] = useState(true)
|
||||||
|
const [firstLoad, setFirstLoad] = useState(true)
|
||||||
|
|
||||||
const calculateInitialNotes: () => Promise<void> = async () => {
|
const calculateInitialNotes: () => Promise<void> = async () => {
|
||||||
if (database && publicKey) {
|
if (database && publicKey) {
|
||||||
@ -78,12 +79,15 @@ export const HomePage: React.FC = () => {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
relayPool?.unsubscribeAll()
|
relayPool?.unsubscribeAll()
|
||||||
if (relayPool && publicKey) {
|
if (relayPool && publicKey) {
|
||||||
|
setFirstLoad(false)
|
||||||
calculateInitialNotes().then(() => loadNotes())
|
calculateInitialNotes().then(() => loadNotes())
|
||||||
}
|
}
|
||||||
}, [publicKey, relayPool])
|
}, [publicKey, relayPool])
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
if (!firstLoad) {
|
||||||
loadNotes()
|
loadNotes()
|
||||||
|
}
|
||||||
}, [lastEventId])
|
}, [lastEventId])
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
@ -7,6 +7,7 @@ import { AppContext } from '../../../Contexts/AppContext'
|
|||||||
import { getUser, getUsers, User } from '../../../Functions/DatabaseFunctions/Users'
|
import { getUser, getUsers, User } from '../../../Functions/DatabaseFunctions/Users'
|
||||||
import Icon from 'react-native-vector-icons/FontAwesome5'
|
import Icon from 'react-native-vector-icons/FontAwesome5'
|
||||||
import { useTranslation } from 'react-i18next'
|
import { useTranslation } from 'react-i18next'
|
||||||
|
import moment from 'moment'
|
||||||
|
|
||||||
export const Loader: React.FC = () => {
|
export const Loader: React.FC = () => {
|
||||||
const { goToPage, loadingDb, database } = useContext(AppContext)
|
const { goToPage, loadingDb, database } = useContext(AppContext)
|
||||||
@ -19,7 +20,7 @@ export const Loader: React.FC = () => {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!loadingRelayPool && !loadingDb && publicKey) {
|
if (!loadingRelayPool && !loadingDb && publicKey) {
|
||||||
relayPool?.subscribe('main-channel', {
|
relayPool?.subscribe('main-channel', {
|
||||||
kinds: [EventKind.petNames, EventKind.meta, EventKind.directMessage],
|
kinds: [EventKind.petNames, EventKind.meta],
|
||||||
authors: [publicKey],
|
authors: [publicKey],
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -34,16 +35,12 @@ export const Loader: React.FC = () => {
|
|||||||
if (database) {
|
if (database) {
|
||||||
getUsers(database, { contacts: true }).then((results) => {
|
getUsers(database, { contacts: true }).then((results) => {
|
||||||
setContactsCount(results.length)
|
setContactsCount(results.length)
|
||||||
if (publicKey && results && results.length > 0) {
|
if (publicKey && results && results.length > 1) {
|
||||||
const authors = [...results.map((user: User) => user.id), publicKey]
|
const authors = [...results.map((user: User) => user.id), publicKey]
|
||||||
relayPool?.subscribe('main-channel', {
|
relayPool?.subscribe('main-channel', {
|
||||||
kinds: [EventKind.meta],
|
kinds: [EventKind.meta, EventKind.textNote],
|
||||||
authors,
|
authors,
|
||||||
})
|
since: moment().unix() - 86400,
|
||||||
relayPool?.subscribe('main-channel', {
|
|
||||||
kinds: [EventKind.textNote],
|
|
||||||
authors,
|
|
||||||
limit: 50,
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -6,6 +6,7 @@ import { useTranslation } from 'react-i18next'
|
|||||||
import Icon from 'react-native-vector-icons/FontAwesome5'
|
import Icon from 'react-native-vector-icons/FontAwesome5'
|
||||||
import { generateRandomKey } from '../../../lib/nostr/Bip'
|
import { generateRandomKey } from '../../../lib/nostr/Bip'
|
||||||
import { showMessage } from 'react-native-flash-message'
|
import { showMessage } from 'react-native-flash-message'
|
||||||
|
import { getNip19Key, isPrivateKey, isPublicKey } from '../../../lib/nostr/Nip19'
|
||||||
|
|
||||||
export const Logger: React.FC = () => {
|
export const Logger: React.FC = () => {
|
||||||
const { publicKey, setPrivateKey, setPublicKey } = useContext(RelayPoolContext)
|
const { publicKey, setPrivateKey, setPublicKey } = useContext(RelayPoolContext)
|
||||||
@ -16,10 +17,17 @@ export const Logger: React.FC = () => {
|
|||||||
|
|
||||||
const onPress: () => void = () => {
|
const onPress: () => void = () => {
|
||||||
if (inputValue && inputValue !== '') {
|
if (inputValue && inputValue !== '') {
|
||||||
if (isPrivate) {
|
const isBenchPrivate = isPrivateKey(inputValue)
|
||||||
setPrivateKey(inputValue)
|
const isBenchPublic = isPublicKey(inputValue)
|
||||||
|
if (isBenchPrivate) setIsPrivate(true)
|
||||||
|
if (isBenchPublic) setIsPrivate(false)
|
||||||
|
|
||||||
|
const key = getNip19Key(inputValue)
|
||||||
|
|
||||||
|
if ((isPrivate && !isBenchPublic) || isBenchPrivate) {
|
||||||
|
setPrivateKey(key)
|
||||||
} else {
|
} else {
|
||||||
setPublicKey(inputValue)
|
setPublicKey(key)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,7 @@ import LnPayment from '../../Components/LnPayment'
|
|||||||
|
|
||||||
export const ProfilePage: React.FC = () => {
|
export const ProfilePage: React.FC = () => {
|
||||||
const { database, page, goToPage, goBack } = useContext(AppContext)
|
const { database, page, goToPage, goBack } = useContext(AppContext)
|
||||||
const { publicKey, privateKey, lastEventId, relayPool } = useContext(RelayPoolContext)
|
const { publicKey, lastEventId, relayPool } = useContext(RelayPoolContext)
|
||||||
const theme = useTheme()
|
const theme = useTheme()
|
||||||
const initialPageSize = 10
|
const initialPageSize = 10
|
||||||
const [notes, setNotes] = useState<Note[]>()
|
const [notes, setNotes] = useState<Note[]>()
|
||||||
@ -37,13 +37,13 @@ export const ProfilePage: React.FC = () => {
|
|||||||
const [isContact, setIsContact] = useState<boolean>()
|
const [isContact, setIsContact] = useState<boolean>()
|
||||||
const [refreshing, setRefreshing] = useState(false)
|
const [refreshing, setRefreshing] = useState(false)
|
||||||
const [openPayment, setOpenPayment] = useState<boolean>(false)
|
const [openPayment, setOpenPayment] = useState<boolean>(false)
|
||||||
|
const [firstLoad, setFirstLoad] = useState(true)
|
||||||
const breadcrump = page.split('%')
|
const breadcrump = page.split('%')
|
||||||
const userId = breadcrump[breadcrump.length - 1].split('#')[1] ?? publicKey
|
const userId = breadcrump[breadcrump.length - 1].split('#')[1] ?? publicKey
|
||||||
const username = user?.name === '' ? formatPubKey(user.id) : user?.name
|
const username = user?.name === '' ? formatPubKey(user.id) : user?.name
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setRefreshing(true)
|
setRefreshing(true)
|
||||||
relayPool?.unsubscribeAll()
|
|
||||||
setNotes(undefined)
|
setNotes(undefined)
|
||||||
setUser(undefined)
|
setUser(undefined)
|
||||||
|
|
||||||
@ -51,8 +51,24 @@ export const ProfilePage: React.FC = () => {
|
|||||||
loadNotes()
|
loadNotes()
|
||||||
subscribeProfile()
|
subscribeProfile()
|
||||||
subscribeNotes()
|
subscribeNotes()
|
||||||
|
setFirstLoad(false)
|
||||||
}, [page])
|
}, [page])
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (notes && !firstLoad) {
|
||||||
|
loadUser()
|
||||||
|
loadNotes()
|
||||||
|
}
|
||||||
|
}, [lastEventId])
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (pageSize > initialPageSize && !firstLoad) {
|
||||||
|
loadUser()
|
||||||
|
loadNotes()
|
||||||
|
subscribeNotes(true)
|
||||||
|
}
|
||||||
|
}, [pageSize])
|
||||||
|
|
||||||
const loadUser: () => void = () => {
|
const loadUser: () => void = () => {
|
||||||
if (database) {
|
if (database) {
|
||||||
getUser(userId, database).then((result) => {
|
getUser(userId, database).then((result) => {
|
||||||
@ -95,21 +111,6 @@ export const ProfilePage: React.FC = () => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (notes) {
|
|
||||||
loadUser()
|
|
||||||
loadNotes()
|
|
||||||
}
|
|
||||||
}, [lastEventId])
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (pageSize > initialPageSize && notes) {
|
|
||||||
loadUser()
|
|
||||||
loadNotes()
|
|
||||||
subscribeNotes(true)
|
|
||||||
}
|
|
||||||
}, [pageSize])
|
|
||||||
|
|
||||||
const onRefresh = useCallback(() => {
|
const onRefresh = useCallback(() => {
|
||||||
setRefreshing(true)
|
setRefreshing(true)
|
||||||
relayPool?.unsubscribeAll()
|
relayPool?.unsubscribeAll()
|
||||||
@ -359,7 +360,7 @@ export const ProfilePage: React.FC = () => {
|
|||||||
)}
|
)}
|
||||||
<LnPayment user={user} open={openPayment} setOpen={setOpenPayment} />
|
<LnPayment user={user} open={openPayment} setOpen={setOpenPayment} />
|
||||||
</Layout>
|
</Layout>
|
||||||
{privateKey && publicKey === userId && (
|
{publicKey === userId && (
|
||||||
<TouchableOpacity
|
<TouchableOpacity
|
||||||
style={{
|
style={{
|
||||||
borderWidth: 1,
|
borderWidth: 1,
|
||||||
|
@ -1,20 +0,0 @@
|
|||||||
import aes from 'browserify-cipher'
|
|
||||||
import { Buffer } from 'buffer'
|
|
||||||
import * as secp256k1 from '@noble/secp256k1'
|
|
||||||
import { generateSecureRandom } from 'react-native-securerandom'
|
|
||||||
|
|
||||||
export const encrypt: (privkey: string, pubkey: string, text: string) => Promise<string> = async (
|
|
||||||
privkey,
|
|
||||||
pubkey,
|
|
||||||
text,
|
|
||||||
) => {
|
|
||||||
const key = secp256k1.getSharedSecret(privkey, '02' + pubkey)
|
|
||||||
const normalizedKey = Buffer.from(key.slice(1, 33)).toString('hex')
|
|
||||||
|
|
||||||
const iv = await generateSecureRandom(16)
|
|
||||||
const cipher = aes.createCipheriv('aes-256-cbc', Buffer.from(normalizedKey, 'hex'), iv)
|
|
||||||
let encryptedMessage = cipher.update(text, 'utf8', 'base64')
|
|
||||||
encryptedMessage += cipher.final('base64')
|
|
||||||
|
|
||||||
return `${encryptedMessage}?iv=${Buffer.from(iv.buffer).toString('base64')}`
|
|
||||||
}
|
|
37
frontend/lib/nostr/Nip04/index.ts
Normal file
37
frontend/lib/nostr/Nip04/index.ts
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
import { Buffer } from 'buffer'
|
||||||
|
import { randomBytes } from '@noble/hashes/utils'
|
||||||
|
import * as secp256k1 from '@noble/secp256k1'
|
||||||
|
// @ts-expect-error
|
||||||
|
import aes from 'browserify-cipher'
|
||||||
|
|
||||||
|
export function encrypt(privkey: string, pubkey: string, text: string): string {
|
||||||
|
const key = secp256k1.getSharedSecret(privkey, '02' + pubkey)
|
||||||
|
const normalizedKey = getNormalizedX(key)
|
||||||
|
|
||||||
|
const iv = Uint8Array.from(randomBytes(16))
|
||||||
|
const cipher = aes.createCipheriv('aes-256-cbc', Buffer.from(normalizedKey, 'hex'), iv)
|
||||||
|
let encryptedMessage = cipher.update(text, 'utf8', 'base64')
|
||||||
|
encryptedMessage += cipher.final('base64')
|
||||||
|
|
||||||
|
return `${encryptedMessage}?iv=${Buffer.from(iv.buffer).toString('base64')}`
|
||||||
|
}
|
||||||
|
|
||||||
|
export function decrypt(privkey: string, pubkey: string, ciphertext: string): string {
|
||||||
|
const [cip, iv] = ciphertext.split('?iv=')
|
||||||
|
const key = secp256k1.getSharedSecret(privkey, '02' + pubkey)
|
||||||
|
const normalizedKey = getNormalizedX(key)
|
||||||
|
|
||||||
|
const decipher = aes.createDecipheriv(
|
||||||
|
'aes-256-cbc',
|
||||||
|
Buffer.from(normalizedKey, 'hex'),
|
||||||
|
Buffer.from(iv, 'base64'),
|
||||||
|
)
|
||||||
|
let decryptedMessage = decipher.update(cip, 'base64', 'utf8')
|
||||||
|
decryptedMessage += decipher.final('utf8')
|
||||||
|
|
||||||
|
return decryptedMessage
|
||||||
|
}
|
||||||
|
|
||||||
|
function getNormalizedX(key: Uint8Array): string {
|
||||||
|
return Buffer.from(key.slice(1, 33)).toString('hex')
|
||||||
|
}
|
30
frontend/lib/nostr/Nip19/index.ts
Normal file
30
frontend/lib/nostr/Nip19/index.ts
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
import { decode, EventPointer, ProfilePointer } from 'nostr-tools/nip19'
|
||||||
|
|
||||||
|
export function getNip19Key(nip19: string): string {
|
||||||
|
let result = nip19
|
||||||
|
|
||||||
|
try {
|
||||||
|
const decoded = decode(result)
|
||||||
|
if (decoded.type === 'nprofile') {
|
||||||
|
const data = decoded.data as ProfilePointer
|
||||||
|
result = data.pubkey
|
||||||
|
} else if (decoded.type === 'nevent') {
|
||||||
|
const data = decoded.data as EventPointer
|
||||||
|
result = data.id
|
||||||
|
} else {
|
||||||
|
result = decoded.data as string
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.log('Error decoding getPublicKey', e)
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isPrivateKey(nip19: string): boolean {
|
||||||
|
return /^(nsec1).*/.test(nip19)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isPublicKey(nip19: string): boolean {
|
||||||
|
return /^(npub1|nprofile1).*/.test(nip19)
|
||||||
|
}
|
@ -13,6 +13,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@eva-design/eva": "^2.1.0",
|
"@eva-design/eva": "^2.1.0",
|
||||||
"@flyerhq/react-native-link-preview": "^1.6.0",
|
"@flyerhq/react-native-link-preview": "^1.6.0",
|
||||||
|
"@scure/base": "^1.1.1",
|
||||||
"@ui-kitten/components": "5.1.2",
|
"@ui-kitten/components": "5.1.2",
|
||||||
"@ui-kitten/eva-icons": "5.1.2",
|
"@ui-kitten/eva-icons": "5.1.2",
|
||||||
"@ui-kitten/metro-config": "5.1.2",
|
"@ui-kitten/metro-config": "5.1.2",
|
||||||
@ -28,7 +29,7 @@
|
|||||||
"lnurl-pay": "^2.1.0",
|
"lnurl-pay": "^2.1.0",
|
||||||
"lodash.debounce": "^4.0.8",
|
"lodash.debounce": "^4.0.8",
|
||||||
"moment": "^2.29.4",
|
"moment": "^2.29.4",
|
||||||
"nostr-tools": "^0.24.1",
|
"nostr-tools": "^1.1.1",
|
||||||
"react": "18.1.0",
|
"react": "18.1.0",
|
||||||
"react-i18next": "^12.0.0",
|
"react-i18next": "^12.0.0",
|
||||||
"react-native": "0.70.6",
|
"react-native": "0.70.6",
|
||||||
@ -48,6 +49,7 @@
|
|||||||
"safe-buffer": "^5.2.1",
|
"safe-buffer": "^5.2.1",
|
||||||
"sqlstring": "^2.3.3",
|
"sqlstring": "^2.3.3",
|
||||||
"stream": "^0.0.2",
|
"stream": "^0.0.2",
|
||||||
|
"text-encoding-polyfill": "^0.6.7",
|
||||||
"uuid": "^9.0.0"
|
"uuid": "^9.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
215
yarn.lock
215
yarn.lock
@ -1381,12 +1381,17 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
eslint-scope "5.1.1"
|
eslint-scope "5.1.1"
|
||||||
|
|
||||||
"@noble/hashes@^0.5.5", "@noble/hashes@^0.5.7":
|
"@noble/hashes@^0.5.7":
|
||||||
version "0.5.9"
|
version "0.5.9"
|
||||||
resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-0.5.9.tgz#9f3051a4cc6f7c168022b3b7fbbe9fe2a35cccf0"
|
resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-0.5.9.tgz#9f3051a4cc6f7c168022b3b7fbbe9fe2a35cccf0"
|
||||||
integrity sha512-7lN1Qh6d8DUGmfN36XRsbN/WcGIPNtTGhkw26vWId/DlCIGsYJJootTtPGghTLcn/AaXPx2Q0b3cacrwXa7OVw==
|
integrity sha512-7lN1Qh6d8DUGmfN36XRsbN/WcGIPNtTGhkw26vWId/DlCIGsYJJootTtPGghTLcn/AaXPx2Q0b3cacrwXa7OVw==
|
||||||
|
|
||||||
"@noble/secp256k1@^1.3.4", "@noble/secp256k1@^1.5.2":
|
"@noble/hashes@~1.1.1", "@noble/hashes@~1.1.3":
|
||||||
|
version "1.1.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.5.tgz#1a0377f3b9020efe2fae03290bd2a12140c95c11"
|
||||||
|
integrity sha512-LTMZiiLc+V4v1Yi16TD6aX2gmtKszNye0pQgbaLqkvhIqP7nVsSaJsWloGQjJfJ8offaoP5GtX3yY5swbcJxxQ==
|
||||||
|
|
||||||
|
"@noble/secp256k1@^1.7.0", "@noble/secp256k1@~1.7.0":
|
||||||
version "1.7.0"
|
version "1.7.0"
|
||||||
resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.0.tgz#d15357f7c227e751d90aa06b05a0e5cf993ba8c1"
|
resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.0.tgz#d15357f7c227e751d90aa06b05a0e5cf993ba8c1"
|
||||||
integrity sha512-kbacwGSsH/CTout0ZnZWxnW1B+jH/7r/WAAKLBtrRJ/+CUH7lgmQzl3GTrQua3SGKWNSDsS6lmjnDpIJ5Dxyaw==
|
integrity sha512-kbacwGSsH/CTout0ZnZWxnW1B+jH/7r/WAAKLBtrRJ/+CUH7lgmQzl3GTrQua3SGKWNSDsS6lmjnDpIJ5Dxyaw==
|
||||||
@ -1624,6 +1629,28 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@react-native/polyfills/-/polyfills-2.0.0.tgz#4c40b74655c83982c8cf47530ee7dc13d957b6aa"
|
resolved "https://registry.yarnpkg.com/@react-native/polyfills/-/polyfills-2.0.0.tgz#4c40b74655c83982c8cf47530ee7dc13d957b6aa"
|
||||||
integrity sha512-K0aGNn1TjalKj+65D7ycc1//H9roAQ51GJVk5ZJQFb2teECGmzd86bYDC0aYdbRf7gtovescq4Zt6FR0tgXiHQ==
|
integrity sha512-K0aGNn1TjalKj+65D7ycc1//H9roAQ51GJVk5ZJQFb2teECGmzd86bYDC0aYdbRf7gtovescq4Zt6FR0tgXiHQ==
|
||||||
|
|
||||||
|
"@scure/base@^1.1.1", "@scure/base@~1.1.0":
|
||||||
|
version "1.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938"
|
||||||
|
integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==
|
||||||
|
|
||||||
|
"@scure/bip32@^1.1.1":
|
||||||
|
version "1.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.1.tgz#f62e4a2f13cc3e5e720ad81b7582b8631ae6835a"
|
||||||
|
integrity sha512-UmI+liY7np2XakaW+6lMB6HZnpczWk1yXZTxvg8TM8MdOcKHCGL1YkraGj8eAjPfMwFNiAyek2hXmS/XFbab8g==
|
||||||
|
dependencies:
|
||||||
|
"@noble/hashes" "~1.1.3"
|
||||||
|
"@noble/secp256k1" "~1.7.0"
|
||||||
|
"@scure/base" "~1.1.0"
|
||||||
|
|
||||||
|
"@scure/bip39@^1.1.0":
|
||||||
|
version "1.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.0.tgz#92f11d095bae025f166bef3defcc5bf4945d419a"
|
||||||
|
integrity sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w==
|
||||||
|
dependencies:
|
||||||
|
"@noble/hashes" "~1.1.1"
|
||||||
|
"@scure/base" "~1.1.0"
|
||||||
|
|
||||||
"@sideway/address@^4.1.3":
|
"@sideway/address@^4.1.3":
|
||||||
version "4.1.4"
|
version "4.1.4"
|
||||||
resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0"
|
resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0"
|
||||||
@ -2670,7 +2697,7 @@ browserify-aes@^1.0.0, browserify-aes@^1.0.4:
|
|||||||
inherits "^2.0.1"
|
inherits "^2.0.1"
|
||||||
safe-buffer "^5.0.1"
|
safe-buffer "^5.0.1"
|
||||||
|
|
||||||
browserify-cipher@>=1, browserify-cipher@^1.0.0:
|
browserify-cipher@^1.0.0:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
|
resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
|
||||||
integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
|
integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
|
||||||
@ -2762,14 +2789,6 @@ buffer-xor@^1.0.3:
|
|||||||
resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
|
resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
|
||||||
integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==
|
integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==
|
||||||
|
|
||||||
buffer@>=5, buffer@^6.0.3:
|
|
||||||
version "6.0.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6"
|
|
||||||
integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==
|
|
||||||
dependencies:
|
|
||||||
base64-js "^1.3.1"
|
|
||||||
ieee754 "^1.2.1"
|
|
||||||
|
|
||||||
buffer@^5.5.0:
|
buffer@^5.5.0:
|
||||||
version "5.7.1"
|
version "5.7.1"
|
||||||
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
|
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
|
||||||
@ -2778,12 +2797,13 @@ buffer@^5.5.0:
|
|||||||
base64-js "^1.3.1"
|
base64-js "^1.3.1"
|
||||||
ieee754 "^1.1.13"
|
ieee754 "^1.1.13"
|
||||||
|
|
||||||
bufferutil@^4.0.1:
|
buffer@^6.0.3:
|
||||||
version "4.0.7"
|
version "6.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.7.tgz#60c0d19ba2c992dd8273d3f73772ffc894c153ad"
|
resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6"
|
||||||
integrity sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==
|
integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==
|
||||||
dependencies:
|
dependencies:
|
||||||
node-gyp-build "^4.3.0"
|
base64-js "^1.3.1"
|
||||||
|
ieee754 "^1.2.1"
|
||||||
|
|
||||||
builtin-status-codes@^3.0.0:
|
builtin-status-codes@^3.0.0:
|
||||||
version "3.0.0"
|
version "3.0.0"
|
||||||
@ -3153,13 +3173,6 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
|
|||||||
safe-buffer "^5.0.1"
|
safe-buffer "^5.0.1"
|
||||||
sha.js "^2.4.8"
|
sha.js "^2.4.8"
|
||||||
|
|
||||||
cross-fetch@^3.1.4:
|
|
||||||
version "3.1.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f"
|
|
||||||
integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==
|
|
||||||
dependencies:
|
|
||||||
node-fetch "2.6.7"
|
|
||||||
|
|
||||||
cross-spawn@^6.0.0:
|
cross-spawn@^6.0.0:
|
||||||
version "6.0.5"
|
version "6.0.5"
|
||||||
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
|
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
|
||||||
@ -3231,14 +3244,6 @@ csstype@^3.0.2:
|
|||||||
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9"
|
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9"
|
||||||
integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==
|
integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==
|
||||||
|
|
||||||
d@1, d@^1.0.1:
|
|
||||||
version "1.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
|
|
||||||
integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
|
|
||||||
dependencies:
|
|
||||||
es5-ext "^0.10.50"
|
|
||||||
type "^1.0.1"
|
|
||||||
|
|
||||||
dayjs@^1.8.15:
|
dayjs@^1.8.15:
|
||||||
version "1.11.6"
|
version "1.11.6"
|
||||||
resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.6.tgz#2e79a226314ec3ec904e3ee1dd5a4f5e5b1c7afb"
|
resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.6.tgz#2e79a226314ec3ec904e3ee1dd5a4f5e5b1c7afb"
|
||||||
@ -3615,37 +3620,11 @@ es-to-primitive@^1.2.1:
|
|||||||
is-date-object "^1.0.1"
|
is-date-object "^1.0.1"
|
||||||
is-symbol "^1.0.2"
|
is-symbol "^1.0.2"
|
||||||
|
|
||||||
es5-ext@^0.10.35, es5-ext@^0.10.50:
|
|
||||||
version "0.10.62"
|
|
||||||
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5"
|
|
||||||
integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==
|
|
||||||
dependencies:
|
|
||||||
es6-iterator "^2.0.3"
|
|
||||||
es6-symbol "^3.1.3"
|
|
||||||
next-tick "^1.1.0"
|
|
||||||
|
|
||||||
es6-iterator@^2.0.3:
|
|
||||||
version "2.0.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
|
|
||||||
integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==
|
|
||||||
dependencies:
|
|
||||||
d "1"
|
|
||||||
es5-ext "^0.10.35"
|
|
||||||
es6-symbol "^3.1.1"
|
|
||||||
|
|
||||||
es6-object-assign@^1.1.0:
|
es6-object-assign@^1.1.0:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c"
|
resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c"
|
||||||
integrity sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==
|
integrity sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==
|
||||||
|
|
||||||
es6-symbol@^3.1.1, es6-symbol@^3.1.3:
|
|
||||||
version "3.1.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
|
|
||||||
integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==
|
|
||||||
dependencies:
|
|
||||||
d "^1.0.1"
|
|
||||||
ext "^1.1.2"
|
|
||||||
|
|
||||||
escalade@^3.1.1:
|
escalade@^3.1.1:
|
||||||
version "3.1.1"
|
version "3.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
|
resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
|
||||||
@ -4084,13 +4063,6 @@ expect@^29.3.1:
|
|||||||
jest-message-util "^29.3.1"
|
jest-message-util "^29.3.1"
|
||||||
jest-util "^29.3.1"
|
jest-util "^29.3.1"
|
||||||
|
|
||||||
ext@^1.1.2:
|
|
||||||
version "1.7.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
|
|
||||||
integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==
|
|
||||||
dependencies:
|
|
||||||
type "^2.7.2"
|
|
||||||
|
|
||||||
extend-shallow@^2.0.1:
|
extend-shallow@^2.0.1:
|
||||||
version "2.0.1"
|
version "2.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
|
resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
|
||||||
@ -4990,11 +4962,6 @@ is-typed-array@^1.1.3, is-typed-array@^1.1.9:
|
|||||||
for-each "^0.3.3"
|
for-each "^0.3.3"
|
||||||
has-tostringtag "^1.0.0"
|
has-tostringtag "^1.0.0"
|
||||||
|
|
||||||
is-typedarray@^1.0.0:
|
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
|
|
||||||
integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==
|
|
||||||
|
|
||||||
is-unicode-supported@^0.1.0:
|
is-unicode-supported@^0.1.0:
|
||||||
version "0.1.0"
|
version "0.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
|
resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
|
||||||
@ -6224,28 +6191,6 @@ metro@0.72.3:
|
|||||||
ws "^7.5.1"
|
ws "^7.5.1"
|
||||||
yargs "^15.3.1"
|
yargs "^15.3.1"
|
||||||
|
|
||||||
micro-base@^0.10.1:
|
|
||||||
version "0.10.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/micro-base/-/micro-base-0.10.2.tgz#f6f9f0bd949ce511883e5a99f9147d80ddc32f5a"
|
|
||||||
integrity sha512-lqqJrT7lfJtDmmiQ4zRLZuIJBk96t0RAc5pCrrWpL9zDeH5i/SUL85mku9HqzTI/OCZ8EQ3aicbMW+eK5Nyu5w==
|
|
||||||
|
|
||||||
micro-bip32@^0.1.0:
|
|
||||||
version "0.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/micro-bip32/-/micro-bip32-0.1.0.tgz#ca51b80eddf9e5afee5da41a2c93ba679297e84b"
|
|
||||||
integrity sha512-HxwYJzokbObqPHUqQuzRpCEqZ3EE4uHKrGlLX5ylt0ktD6m9LeS3RkWuQ1HApXEgrGMs3XgykN5Bic2YHE0f6Q==
|
|
||||||
dependencies:
|
|
||||||
"@noble/hashes" "^0.5.7"
|
|
||||||
"@noble/secp256k1" "^1.3.4"
|
|
||||||
micro-base "^0.10.1"
|
|
||||||
|
|
||||||
micro-bip39@^0.1.3:
|
|
||||||
version "0.1.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/micro-bip39/-/micro-bip39-0.1.3.tgz#f0866912da588fc97e27b7315cdd484c0b43186c"
|
|
||||||
integrity sha512-lEaRG/MKxFQvG19lfJfPkLIG0rgT28nWud3otN+VgAbrozGqXn2PLaZuYPsy9guQjIZWBTvoLw/HDJQxmMXjMA==
|
|
||||||
dependencies:
|
|
||||||
"@noble/hashes" "^0.5.5"
|
|
||||||
micro-base "^0.10.1"
|
|
||||||
|
|
||||||
micromatch@^3.1.10:
|
micromatch@^3.1.10:
|
||||||
version "3.1.10"
|
version "3.1.10"
|
||||||
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
|
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
|
||||||
@ -6402,11 +6347,6 @@ neo-async@^2.5.0:
|
|||||||
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
|
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
|
||||||
integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
|
integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
|
||||||
|
|
||||||
next-tick@^1.1.0:
|
|
||||||
version "1.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb"
|
|
||||||
integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==
|
|
||||||
|
|
||||||
nice-try@^1.0.4:
|
nice-try@^1.0.4:
|
||||||
version "1.0.5"
|
version "1.0.5"
|
||||||
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
|
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
|
||||||
@ -6429,14 +6369,14 @@ node-dir@^0.1.17:
|
|||||||
dependencies:
|
dependencies:
|
||||||
minimatch "^3.0.2"
|
minimatch "^3.0.2"
|
||||||
|
|
||||||
node-fetch@2.6.7, node-fetch@^2.2.0, node-fetch@^2.6.0:
|
node-fetch@^2.2.0, node-fetch@^2.6.0:
|
||||||
version "2.6.7"
|
version "2.6.7"
|
||||||
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad"
|
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad"
|
||||||
integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==
|
integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
whatwg-url "^5.0.0"
|
whatwg-url "^5.0.0"
|
||||||
|
|
||||||
node-gyp-build@^4.2.0, node-gyp-build@^4.3.0:
|
node-gyp-build@^4.2.0:
|
||||||
version "4.5.0"
|
version "4.5.0"
|
||||||
resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.5.0.tgz#7a64eefa0b21112f89f58379da128ac177f20e40"
|
resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.5.0.tgz#7a64eefa0b21112f89f58379da128ac177f20e40"
|
||||||
integrity sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==
|
integrity sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==
|
||||||
@ -6461,20 +6401,16 @@ normalize-path@^3.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
|
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
|
||||||
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
|
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
|
||||||
|
|
||||||
nostr-tools@^0.24.1:
|
nostr-tools@^1.1.1:
|
||||||
version "0.24.1"
|
version "1.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/nostr-tools/-/nostr-tools-0.24.1.tgz#99f73c2ea58bb3a0e964485120f497180522fa9a"
|
resolved "https://registry.yarnpkg.com/nostr-tools/-/nostr-tools-1.1.1.tgz#2be4cd650bc0a4d20650b6cf46fee451c9f565b8"
|
||||||
integrity sha512-+aUWblwNTYra8ZsjmfzxStr4XSKAb0gPsehNP3oBiSouLevqD3FWngc++kh8l+zfMYEPPGS6kS0i9iaq/5ZF6A==
|
integrity sha512-mxgjbHR6nx2ACBNa2tBpeM/glsPWqxHPT1Kszx/XfzL+kUdi1Gm3Xz1UcaODQ2F84IFtCKNLO+aF31ZfTAhSYQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@noble/hashes" "^0.5.7"
|
"@noble/hashes" "^0.5.7"
|
||||||
"@noble/secp256k1" "^1.5.2"
|
"@noble/secp256k1" "^1.7.0"
|
||||||
browserify-cipher ">=1"
|
"@scure/base" "^1.1.1"
|
||||||
buffer ">=5"
|
"@scure/bip32" "^1.1.1"
|
||||||
create-hash "^1.2.0"
|
"@scure/bip39" "^1.1.0"
|
||||||
cross-fetch "^3.1.4"
|
|
||||||
micro-bip32 "^0.1.0"
|
|
||||||
micro-bip39 "^0.1.3"
|
|
||||||
websocket-polyfill "^0.0.3"
|
|
||||||
|
|
||||||
npm-run-path@^2.0.0:
|
npm-run-path@^2.0.0:
|
||||||
version "2.0.2"
|
version "2.0.2"
|
||||||
@ -8067,6 +8003,11 @@ test-exclude@^6.0.0:
|
|||||||
glob "^7.1.4"
|
glob "^7.1.4"
|
||||||
minimatch "^3.0.4"
|
minimatch "^3.0.4"
|
||||||
|
|
||||||
|
text-encoding-polyfill@^0.6.7:
|
||||||
|
version "0.6.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/text-encoding-polyfill/-/text-encoding-polyfill-0.6.7.tgz#4d27de0153e4c86eb2631ffd74c2f3f57969a9ec"
|
||||||
|
integrity sha512-/DZ1XJqhbqRkCop6s9ZFu8JrFRwmVuHg4quIRm+ziFkR3N3ec6ck6yBvJ1GYeEQZhLVwRW0rZE+C3SSJpy0RTg==
|
||||||
|
|
||||||
text-table@^0.2.0:
|
text-table@^0.2.0:
|
||||||
version "0.2.0"
|
version "0.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
|
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
|
||||||
@ -8170,11 +8111,6 @@ tslib@^2.3.1, tslib@^2.4.1:
|
|||||||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e"
|
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e"
|
||||||
integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==
|
integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==
|
||||||
|
|
||||||
tstl@^2.0.7:
|
|
||||||
version "2.5.13"
|
|
||||||
resolved "https://registry.yarnpkg.com/tstl/-/tstl-2.5.13.tgz#a5a5d27b79a12767e46a08525b3e045c5cdb1180"
|
|
||||||
integrity sha512-h9wayHHFI5+yqt8iau0vqH96cTNhezhZ/Fk/hrIdpfkiMu3lg9nzyvMfs5bIdX51IVzZO6DudLqhkL/rVXpT6g==
|
|
||||||
|
|
||||||
tsutils@^3.21.0:
|
tsutils@^3.21.0:
|
||||||
version "3.21.0"
|
version "3.21.0"
|
||||||
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
|
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
|
||||||
@ -8209,23 +8145,6 @@ type-fest@^0.7.1:
|
|||||||
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48"
|
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48"
|
||||||
integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==
|
integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==
|
||||||
|
|
||||||
type@^1.0.1:
|
|
||||||
version "1.2.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
|
|
||||||
integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
|
|
||||||
|
|
||||||
type@^2.7.2:
|
|
||||||
version "2.7.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0"
|
|
||||||
integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==
|
|
||||||
|
|
||||||
typedarray-to-buffer@^3.1.5:
|
|
||||||
version "3.1.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
|
|
||||||
integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
|
|
||||||
dependencies:
|
|
||||||
is-typedarray "^1.0.0"
|
|
||||||
|
|
||||||
typeforce@^1.11.3:
|
typeforce@^1.11.3:
|
||||||
version "1.18.0"
|
version "1.18.0"
|
||||||
resolved "https://registry.yarnpkg.com/typeforce/-/typeforce-1.18.0.tgz#d7416a2c5845e085034d70fcc5b6cc4a90edbfdc"
|
resolved "https://registry.yarnpkg.com/typeforce/-/typeforce-1.18.0.tgz#d7416a2c5845e085034d70fcc5b6cc4a90edbfdc"
|
||||||
@ -8343,13 +8262,6 @@ use@^3.1.0:
|
|||||||
resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
|
resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
|
||||||
integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
|
integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
|
||||||
|
|
||||||
utf-8-validate@^5.0.2:
|
|
||||||
version "5.0.10"
|
|
||||||
resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2"
|
|
||||||
integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==
|
|
||||||
dependencies:
|
|
||||||
node-gyp-build "^4.3.0"
|
|
||||||
|
|
||||||
util-deprecate@^1.0.1, util-deprecate@~1.0.1:
|
util-deprecate@^1.0.1, util-deprecate@~1.0.1:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
|
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
|
||||||
@ -8426,26 +8338,6 @@ webidl-conversions@^3.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
|
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
|
||||||
integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==
|
integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==
|
||||||
|
|
||||||
websocket-polyfill@^0.0.3:
|
|
||||||
version "0.0.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/websocket-polyfill/-/websocket-polyfill-0.0.3.tgz#7321ada0f5f17516290ba1cb587ac111b74ce6a5"
|
|
||||||
integrity sha512-pF3kR8Uaoau78MpUmFfzbIRxXj9PeQrCuPepGE6JIsfsJ/o/iXr07Q2iQNzKSSblQJ0FiGWlS64N4pVSm+O3Dg==
|
|
||||||
dependencies:
|
|
||||||
tstl "^2.0.7"
|
|
||||||
websocket "^1.0.28"
|
|
||||||
|
|
||||||
websocket@^1.0.28:
|
|
||||||
version "1.0.34"
|
|
||||||
resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111"
|
|
||||||
integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==
|
|
||||||
dependencies:
|
|
||||||
bufferutil "^4.0.1"
|
|
||||||
debug "^2.2.0"
|
|
||||||
es5-ext "^0.10.50"
|
|
||||||
typedarray-to-buffer "^3.1.5"
|
|
||||||
utf-8-validate "^5.0.2"
|
|
||||||
yaeti "^0.0.6"
|
|
||||||
|
|
||||||
whatwg-fetch@^3.0.0:
|
whatwg-fetch@^3.0.0:
|
||||||
version "3.6.2"
|
version "3.6.2"
|
||||||
resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c"
|
resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c"
|
||||||
@ -8580,11 +8472,6 @@ y18n@^5.0.5:
|
|||||||
resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
|
resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
|
||||||
integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
|
integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
|
||||||
|
|
||||||
yaeti@^0.0.6:
|
|
||||||
version "0.0.6"
|
|
||||||
resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577"
|
|
||||||
integrity sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==
|
|
||||||
|
|
||||||
yallist@^3.0.2:
|
yallist@^3.0.2:
|
||||||
version "3.1.1"
|
version "3.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
|
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
|
||||||
|
Loading…
Reference in New Issue
Block a user